<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.uni-due.de/jack/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RSchypula</id>
	<title>JACK Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.uni-due.de/jack/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RSchypula"/>
	<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Spezial:Beitr%C3%A4ge/RSchypula"/>
	<updated>2026-04-06T00:02:16Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=BooleanAnd&amp;diff=12635</id>
		<title>BooleanAnd</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=BooleanAnd&amp;diff=12635"/>
		<updated>2026-01-12T13:53:58Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Zugehörige Evaluatoren===&lt;br /&gt;
*&#039;&#039;&#039;ChemEvaluator&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;MathEvaluator&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Beschreibung===&lt;br /&gt;
Die Funktion &#039;&#039;BooleanAnd&#039;&#039; (&amp;quot;&amp;amp;&amp;amp;&amp;quot;) aus der Bool&#039;schen Algebra vergleicht zwei Aussagen auf &amp;quot;true&amp;quot; oder &amp;quot;false&amp;quot;. Der Ausdruck x &amp;amp;&amp;amp; y gibt true zurück, wenn x und y beide true sind, ansonsten wird immer false zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
  x &amp;amp;&amp;amp; y&lt;br /&gt;
  and(x,y)&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
* &#039;&#039;&#039;x&#039;&#039;&#039; - [[Boolean]]&lt;br /&gt;
* &#039;&#039;&#039;y&#039;&#039;&#039; - [[Boolean]]&lt;br /&gt;
&lt;br /&gt;
===Return Value===&lt;br /&gt;
* Gibt einen Boolean zurück.&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
==== Standardfälle ====&lt;br /&gt;
 1 &amp;amp;&amp;amp; 1    --&amp;gt; returns &#039;&#039;true&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 0 &amp;amp;&amp;amp; 1    --&amp;gt; returns &#039;&#039;false&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 1 &amp;amp;&amp;amp; 0    --&amp;gt; returns &#039;&#039;false&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 0 &amp;amp;&amp;amp; 0    --&amp;gt; returns &#039;&#039;false&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 (2+4==6) &amp;amp;&amp;amp; (3+3==6)    --&amp;gt; returns &#039;&#039;true&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Benutzung mit Variablen ====&lt;br /&gt;
&lt;br /&gt;
 [var=a] &amp;amp;&amp;amp; [var=b]&lt;br /&gt;
&lt;br /&gt;
===Hinweise===&lt;br /&gt;
* Es werden zwei boolsche Ausdrücke erwartet.&lt;br /&gt;
* Diese Funktion ist ein binärer Operator.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]][[Kategorie:Testfunktionen]][[Category:Operator]][[Kategorie:Booleanfunktionen]][[Kategorie:JACK2]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12298</id>
		<title>LTI Anbindung (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12298"/>
		<updated>2025-06-16T12:34:12Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Einrichtung des externen Tools in Moodle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es besteht die Möglichkeit Jack3 auch über die LTI-Anbindung in LMS Systemen zur Verfügung zu stellen. Im Moment gibt es die Anbindung in Moodle, sodass man einen Link zu Jack3 in einem Moodle Kurs zur Verfügung stellen kann. Über diesen Link wird man dann direkt zu dem entsprechenden Kursangebot in Jack3 gelenkt. Die Anmeldung in Jack3 wird im Hintergrund durchgeführt, so dass die Lernenden dies nicht machen müssen. Die LTI-Anbindung bringt Studierende nicht in eine isolierte JACK3 Umgebung, sie können sich wie gewohnt auf dem System bewegen. &lt;br /&gt;
&lt;br /&gt;
Sehen Sie im Kursangebot die Nachricht, dass LTI für ihren Server nicht konfiguriert ist, wenden Sie sich bitte an ihren JACK Administrator. JACK Administratoren haben zwei Möglichkeiten LTI für Sie bereitzustellen: entweder als globalen LTI Provider oder einen Provider pro Kursangebot. Sehen Sie im Kursangebot im Abschnitt &amp;quot;LTI&amp;quot; die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot;, ist ein globaler Provider eingerichtet. Sehen Sie nur die Überschrift &amp;quot;Tool-Einstellungen&amp;quot;, ist ein Provider pro Kursangebot eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem globalen Provider ===&lt;br /&gt;
Verwenden Sie diese Methode, wenn unter LTI die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot; zu finden sind. Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, sollte dies immer der Fall sein. Andernfalls kontakieren Sie bitte ihren JACK Administrator.&lt;br /&gt;
&lt;br /&gt;
==== Einrichtung des externen Tools in Moodle ====&lt;br /&gt;
Rufen Sie den Moodle Kurs auf und klicken Sie im Menüband auf &amp;quot;Mehr&amp;quot; und wählen Sie &amp;quot;LTI Externe Tools&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Moodle extenes Tool anlegen.jpg|ohne|mini]]&lt;br /&gt;
&lt;br /&gt;
Klicken Sie in Moodle dann auf &amp;quot;Tool hinzufügen&amp;quot; es öffnet sich daruf in Moodle die Seite für die Tool-Einstellungen.&lt;br /&gt;
Rufen Sie nun in JACK das Kursangebot welches Sie verlinken möchten auf. Scrollen Sie zum Abschnitt LTI und setzen Sie den Haken bei &amp;quot;Aufruf des Kursangebots über LTI erlauben&amp;quot;. Setzen Sie die folgenden Einstellungen bei den Tool-Einstellungen in Moodle:&lt;br /&gt;
&lt;br /&gt;
# Unter &amp;quot;Name des Tools&amp;quot; tragen Sie &amp;quot;JACK&amp;quot; ein.&lt;br /&gt;
# Unter &amp;quot;Tool URL&amp;quot; muss der Wert &amp;quot;URL&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Anwenderschlüssel&amp;quot; muss der Wert &amp;quot;Konsumenten Schlüssel&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Öffentliches Kennwort&amp;quot; muss der Wert &amp;quot;Konsumenten Passwort&amp;quot; eingetragen werden.&lt;br /&gt;
# Als Einstellung für &amp;quot;Standard-Startcontainer&amp;quot; empfehlen wir &amp;quot;Neues Fenster&amp;quot;.&lt;br /&gt;
# Klappen Sie den Abschnitt &amp;quot;Datenschutz&amp;quot; aus.&lt;br /&gt;
## Ändern Sie den Wert bei &amp;quot;Anwendername an Tool übergeben&amp;quot; auf &amp;quot;Immer&amp;quot;. &lt;br /&gt;
## Sofern die E-Mailadresse von Moodle nach JACK übergeben werden soll (bei Vorkursstudenten notwendig): Ändern Sie bei &amp;quot;E-Mail des Anwenders an Tool übergeben&amp;quot; den Wert auf &amp;quot;Immer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JACK Moodle Tool Einstellungen.jpg|ohne|809x406px]]&lt;br /&gt;
&lt;br /&gt;
Mit einem Klick auf &amp;quot;Änderungen speichern&amp;quot; bei den Tool-Einstellungen in Moodle ist JACK als neues Tool in ihrem Moodlekurs angelegt. Dieser Vorgang muss nur einmal pro Moodlekurs durchgeführt werden. Danach ist JACK in diesem Moodlekurs dauerhaft verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Einrichten des Links zum Kursangebot ====&lt;br /&gt;
Um in ihrem Moodlekurs ein konkretes Kursangebot zu verlinken gehen Sie wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
# Schalten Sie in ihrem Moodlekurs den Bearbeitungsmodus ein. Klicken Sie dann in einem beliebigen Abschnitt auf &amp;quot;Material oder Aktivität anlegen&amp;quot;.&lt;br /&gt;
# Im nun auftauchenden Dialog wählen Sie &amp;quot;JACK&amp;quot; als Tool aus.&lt;br /&gt;
# Klicken Sie in den nun angezeigten Einstellungen bearbeiten Dialog im Abschnitt Allgemeines auf &amp;quot;Mehr anzeigen&amp;quot; und kopieren Sie aus den JACK LTI Einstellungen den Wert von &amp;quot;Zusätzliche Parameter&amp;quot; in Moodle in das Feld &amp;quot;Angepasste Parameter&amp;quot;.&lt;br /&gt;
# Mit dem Button &amp;quot;Speichern und anzeigen&amp;quot; ganz unten können Sie den LTI Link anlegen und sofort testen.&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
||[[Datei:Moodle Material anlegen.jpg|mini]]&lt;br /&gt;
||[[Datei:Moodle Material Einstellungen.jpg|mini]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem lokalen Provider ===&lt;br /&gt;
Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, können Sie diese Methode nicht verwenden. Detaillierte Informationen folgen in Kürze.&lt;br /&gt;
&lt;br /&gt;
=== LTI und Sichtbarkeit von Kursangeboten ===&lt;br /&gt;
Bei der Anbindung mit Moodle sind auch die Sichtbarkeiten des Kursangebotes zu beachten. Dabei können folgenden Szenarien auftreten:&lt;br /&gt;
Das Kursangebot ist&lt;br /&gt;
* &#039;&#039;&#039;gar nicht sichtbar:&#039;&#039;&#039; Es kommt eine Fehlermeldung von LTI, dass kein Kursangebot zu dem Konsumentenschlüssel gefunden wurde.&lt;br /&gt;
* &#039;&#039;&#039;nicht mehr sichtbar:&#039;&#039;&#039; Der Lernende wird zu dem Kursangebot in Jack3 weitergeleitet und erhält dort eine Fehlermeldung, dass das Kursangebot nicht mehr sichtbar ist.&lt;br /&gt;
* &#039;&#039;&#039;nicht für diesen Lernenden sichtbar:&#039;&#039;&#039; Der Lernende wird zu den Kursangebot in Jack3 weitergeleitet und erhält dort die entsprechende Fehlermeldung, dass das Kursangebot nicht sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:JACK_Moodle_Tool_Einstellungen.jpg&amp;diff=12297</id>
		<title>Datei:JACK Moodle Tool Einstellungen.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:JACK_Moodle_Tool_Einstellungen.jpg&amp;diff=12297"/>
		<updated>2025-06-16T12:27:41Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: RSchypula lud eine neue Version von Datei:JACK Moodle Tool Einstellungen.jpg hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12296</id>
		<title>LTI Anbindung (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12296"/>
		<updated>2025-06-16T12:10:02Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Einrichtung des externen Tools in Moodle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es besteht die Möglichkeit Jack3 auch über die LTI-Anbindung in LMS Systemen zur Verfügung zu stellen. Im Moment gibt es die Anbindung in Moodle, sodass man einen Link zu Jack3 in einem Moodle Kurs zur Verfügung stellen kann. Über diesen Link wird man dann direkt zu dem entsprechenden Kursangebot in Jack3 gelenkt. Die Anmeldung in Jack3 wird im Hintergrund durchgeführt, so dass die Lernenden dies nicht machen müssen. Die LTI-Anbindung bringt Studierende nicht in eine isolierte JACK3 Umgebung, sie können sich wie gewohnt auf dem System bewegen. &lt;br /&gt;
&lt;br /&gt;
Sehen Sie im Kursangebot die Nachricht, dass LTI für ihren Server nicht konfiguriert ist, wenden Sie sich bitte an ihren JACK Administrator. JACK Administratoren haben zwei Möglichkeiten LTI für Sie bereitzustellen: entweder als globalen LTI Provider oder einen Provider pro Kursangebot. Sehen Sie im Kursangebot im Abschnitt &amp;quot;LTI&amp;quot; die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot;, ist ein globaler Provider eingerichtet. Sehen Sie nur die Überschrift &amp;quot;Tool-Einstellungen&amp;quot;, ist ein Provider pro Kursangebot eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem globalen Provider ===&lt;br /&gt;
Verwenden Sie diese Methode, wenn unter LTI die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot; zu finden sind. Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, sollte dies immer der Fall sein. Andernfalls kontakieren Sie bitte ihren JACK Administrator.&lt;br /&gt;
&lt;br /&gt;
==== Einrichtung des externen Tools in Moodle ====&lt;br /&gt;
Rufen Sie den Moodle Kurs auf und klicken Sie im Menüband auf &amp;quot;Mehr&amp;quot; und wählen Sie &amp;quot;LTI Externe Tools&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Moodle extenes Tool anlegen.jpg|ohne|mini]]&lt;br /&gt;
&lt;br /&gt;
Klicken Sie in Moodle dann auf &amp;quot;Tool hinzufügen&amp;quot; es öffnet sich daruf in Moodle die Seite für die Tool-Einstellungen.&lt;br /&gt;
Rufen Sie nun in JACK das Kursangebot welches Sie verlinken möchten auf. Scrollen Sie zum Abschnitt LTI und setzen Sie den Haken bei &amp;quot;Aufruf des Kursangebots über LTI erlauben&amp;quot;. Setzen Sie die folgenden Einstellungen bei den Tool-Einstellungen in Moodle:&lt;br /&gt;
&lt;br /&gt;
# Unter &amp;quot;Name des Tools&amp;quot; tragen Sie &amp;quot;JACK&amp;quot; ein.&lt;br /&gt;
# Unter &amp;quot;Tool URL&amp;quot; muss der Wert &amp;quot;URL&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Anwenderschlüssel&amp;quot; muss der Wert &amp;quot;Konsumenten Schlüssel&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Öffentliches Kennwort&amp;quot; muss der Wert &amp;quot;Konsumenten Passwort&amp;quot; eingetragen werden.&lt;br /&gt;
# Als Einstellung für &amp;quot;Standard-Startcontainer&amp;quot; empfehlen wir &amp;quot;Neues Fenster&amp;quot;.&lt;br /&gt;
# Klappen Sie den Abschnitt &amp;quot;Datenschutz&amp;quot; aus.&lt;br /&gt;
## Ändern Sie den Wert bei &amp;quot;Anwendername an Tool übergeben&amp;quot; auf &amp;quot;Immer&amp;quot;. &lt;br /&gt;
## Sofern die E-Mailadresse in JACK benötigt wird: Ändern Sie bei &amp;quot;E-Mail des Anwenders an Tool übergeben&amp;quot; den Wert auf &amp;quot;Immer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JACK Moodle Tool Einstellungen.jpg|ohne|809x406px]]&lt;br /&gt;
&lt;br /&gt;
Mit einem Klick auf &amp;quot;Änderungen speichern&amp;quot; bei den Tool-Einstellungen in Moodle ist JACK als neues Tool in ihrem Moodlekurs angelegt. Dieser Vorgang muss nur einmal pro Moodlekurs durchgeführt werden. Danach ist JACK in diesem Moodlekurs dauerhaft verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Einrichten des Links zum Kursangebot ====&lt;br /&gt;
Um in ihrem Moodlekurs ein konkretes Kursangebot zu verlinken gehen Sie wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
# Schalten Sie in ihrem Moodlekurs den Bearbeitungsmodus ein. Klicken Sie dann in einem beliebigen Abschnitt auf &amp;quot;Material oder Aktivität anlegen&amp;quot;.&lt;br /&gt;
# Im nun auftauchenden Dialog wählen Sie &amp;quot;JACK&amp;quot; als Tool aus.&lt;br /&gt;
# Klicken Sie in den nun angezeigten Einstellungen bearbeiten Dialog im Abschnitt Allgemeines auf &amp;quot;Mehr anzeigen&amp;quot; und kopieren Sie aus den JACK LTI Einstellungen den Wert von &amp;quot;Zusätzliche Parameter&amp;quot; in Moodle in das Feld &amp;quot;Angepasste Parameter&amp;quot;.&lt;br /&gt;
# Mit dem Button &amp;quot;Speichern und anzeigen&amp;quot; ganz unten können Sie den LTI Link anlegen und sofort testen.&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
||[[Datei:Moodle Material anlegen.jpg|mini]]&lt;br /&gt;
||[[Datei:Moodle Material Einstellungen.jpg|mini]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem lokalen Provider ===&lt;br /&gt;
Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, können Sie diese Methode nicht verwenden. Detaillierte Informationen folgen in Kürze.&lt;br /&gt;
&lt;br /&gt;
=== LTI und Sichtbarkeit von Kursangeboten ===&lt;br /&gt;
Bei der Anbindung mit Moodle sind auch die Sichtbarkeiten des Kursangebotes zu beachten. Dabei können folgenden Szenarien auftreten:&lt;br /&gt;
Das Kursangebot ist&lt;br /&gt;
* &#039;&#039;&#039;gar nicht sichtbar:&#039;&#039;&#039; Es kommt eine Fehlermeldung von LTI, dass kein Kursangebot zu dem Konsumentenschlüssel gefunden wurde.&lt;br /&gt;
* &#039;&#039;&#039;nicht mehr sichtbar:&#039;&#039;&#039; Der Lernende wird zu dem Kursangebot in Jack3 weitergeleitet und erhält dort eine Fehlermeldung, dass das Kursangebot nicht mehr sichtbar ist.&lt;br /&gt;
* &#039;&#039;&#039;nicht für diesen Lernenden sichtbar:&#039;&#039;&#039; Der Lernende wird zu den Kursangebot in Jack3 weitergeleitet und erhält dort die entsprechende Fehlermeldung, dass das Kursangebot nicht sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12274</id>
		<title>LTI Anbindung (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12274"/>
		<updated>2025-06-02T10:18:23Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Einrichten des Links zum Kursangebot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es besteht die Möglichkeit Jack3 auch über die LTI-Anbindung in LMS Systemen zur Verfügung zu stellen. Im Moment gibt es die Anbindung in Moodle, sodass man einen Link zu Jack3 in einem Moodle Kurs zur Verfügung stellen kann. Über diesen Link wird man dann direkt zu dem entsprechenden Kursangebot in Jack3 gelenkt. Die Anmeldung in Jack3 wird im Hintergrund durchgeführt, so dass die Lernenden dies nicht machen müssen. Die LTI-Anbindung bringt Studierende nicht in eine isolierte JACK3 Umgebung, sie können sich wie gewohnt auf dem System bewegen. &lt;br /&gt;
&lt;br /&gt;
Sehen Sie im Kursangebot die Nachricht, dass LTI für ihren Server nicht konfiguriert ist, wenden Sie sich bitte an ihren JACK Administrator. JACK Administratoren haben zwei Möglichkeiten LTI für Sie bereitzustellen: entweder als globalen LTI Provider oder einen Provider pro Kursangebot. Sehen Sie im Kursangebot im Abschnitt &amp;quot;LTI&amp;quot; die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot;, ist ein globaler Provider eingerichtet. Sehen Sie nur die Überschrift &amp;quot;Tool-Einstellungen&amp;quot;, ist ein Provider pro Kursangebot eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem globalen Provider ===&lt;br /&gt;
Verwenden Sie diese Methode, wenn unter LTI die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot; zu finden sind. Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, sollte dies immer der Fall sein. Andernfalls kontakieren Sie bitte ihren JACK Administrator.&lt;br /&gt;
&lt;br /&gt;
==== Einrichtung des externen Tools in Moodle ====&lt;br /&gt;
Rufen Sie den Moodle Kurs auf und klicken Sie im Menüband auf &amp;quot;Mehr&amp;quot; und wählen Sie &amp;quot;LTI Externe Tools&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Moodle extenes Tool anlegen.jpg|ohne|mini]]&lt;br /&gt;
&lt;br /&gt;
Klicken Sie in Moodle dann auf &amp;quot;Tool hinzufügen&amp;quot; es öffnet sich daruf in Moodle die Seite für die Tool-Einstellungen.&lt;br /&gt;
Rufen Sie nun in JACK das Kursangebot welches Sie verlinken möchten auf. Scrollen Sie zum Abschnitt LTI und setzen Sie den Haken bei &amp;quot;Aufruf des Kursangebots über LTI erlauben&amp;quot;. Setzen Sie die folgenden Einstellungen bei den Tool-Einstellungen in Moodle:&lt;br /&gt;
&lt;br /&gt;
# Unter &amp;quot;Name des Tools&amp;quot; tragen Sie &amp;quot;JACK&amp;quot; ein.&lt;br /&gt;
# Unter &amp;quot;Tool URL&amp;quot; muss der Wert &amp;quot;URL&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Anwenderschlüssel&amp;quot; muss der Wert &amp;quot;Konsumenten Schlüssel&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Öffentliches Kennwort&amp;quot; muss der Wert &amp;quot;Konsumenten Passwort&amp;quot; eingetragen werden.&lt;br /&gt;
# Als Einstellung für &amp;quot;Standard-Startcontainer&amp;quot; empfehlen wir &amp;quot;Neues Fenster&amp;quot;.&lt;br /&gt;
# Klappen Sie den Abschnitt &amp;quot;Datenschutz&amp;quot; aus und ändern Sie den Wert bei &amp;quot;Anwendername an Tool übergeben&amp;quot; auf &amp;quot;Immer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JACK Moodle Tool Einstellungen.jpg|ohne|809x406px]]&lt;br /&gt;
&lt;br /&gt;
Mit einem Klick auf &amp;quot;Änderungen speichern&amp;quot; bei den Tool-Einstellungen in Moodle ist JACK als neues Tool in ihrem Moodlekurs angelegt. Dieser Vorgang muss nur einmal pro Moodlekurs durchgeführt werden. Danach ist JACK in diesem Moodlekurs dauerhaft verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Einrichten des Links zum Kursangebot ====&lt;br /&gt;
Um in ihrem Moodlekurs ein konkretes Kursangebot zu verlinken gehen Sie wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
# Schalten Sie in ihrem Moodlekurs den Bearbeitungsmodus ein. Klicken Sie dann in einem beliebigen Abschnitt auf &amp;quot;Material oder Aktivität anlegen&amp;quot;.&lt;br /&gt;
# Im nun auftauchenden Dialog wählen Sie &amp;quot;JACK&amp;quot; als Tool aus.&lt;br /&gt;
# Klicken Sie in den nun angezeigten Einstellungen bearbeiten Dialog im Abschnitt Allgemeines auf &amp;quot;Mehr anzeigen&amp;quot; und kopieren Sie aus den JACK LTI Einstellungen den Wert von &amp;quot;Zusätzliche Parameter&amp;quot; in Moodle in das Feld &amp;quot;Angepasste Parameter&amp;quot;.&lt;br /&gt;
# Mit dem Button &amp;quot;Speichern und anzeigen&amp;quot; ganz unten können Sie den LTI Link anlegen und sofort testen.&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;text-align:left&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
||[[Datei:Moodle Material anlegen.jpg|mini]]&lt;br /&gt;
||[[Datei:Moodle Material Einstellungen.jpg|mini]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem lokalen Provider ===&lt;br /&gt;
Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, können Sie diese Methode nicht verwenden. Detaillierte Informationen folgen in Kürze.&lt;br /&gt;
&lt;br /&gt;
=== LTI und Sichtbarkeit von Kursangeboten ===&lt;br /&gt;
Bei der Anbindung mit Moodle sind auch die Sichtbarkeiten des Kursangebotes zu beachten. Dabei können folgenden Szenarien auftreten:&lt;br /&gt;
Das Kursangebot ist&lt;br /&gt;
* &#039;&#039;&#039;gar nicht sichtbar:&#039;&#039;&#039; Es kommt eine Fehlermeldung von LTI, dass kein Kursangebot zu dem Konsumentenschlüssel gefunden wurde.&lt;br /&gt;
* &#039;&#039;&#039;nicht mehr sichtbar:&#039;&#039;&#039; Der Lernende wird zu dem Kursangebot in Jack3 weitergeleitet und erhält dort eine Fehlermeldung, dass das Kursangebot nicht mehr sichtbar ist.&lt;br /&gt;
* &#039;&#039;&#039;nicht für diesen Lernenden sichtbar:&#039;&#039;&#039; Der Lernende wird zu den Kursangebot in Jack3 weitergeleitet und erhält dort die entsprechende Fehlermeldung, dass das Kursangebot nicht sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12273</id>
		<title>LTI Anbindung (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12273"/>
		<updated>2025-06-02T10:11:38Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Einrichten des Links zum Kursangebot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es besteht die Möglichkeit Jack3 auch über die LTI-Anbindung in LMS Systemen zur Verfügung zu stellen. Im Moment gibt es die Anbindung in Moodle, sodass man einen Link zu Jack3 in einem Moodle Kurs zur Verfügung stellen kann. Über diesen Link wird man dann direkt zu dem entsprechenden Kursangebot in Jack3 gelenkt. Die Anmeldung in Jack3 wird im Hintergrund durchgeführt, so dass die Lernenden dies nicht machen müssen. Die LTI-Anbindung bringt Studierende nicht in eine isolierte JACK3 Umgebung, sie können sich wie gewohnt auf dem System bewegen. &lt;br /&gt;
&lt;br /&gt;
Sehen Sie im Kursangebot die Nachricht, dass LTI für ihren Server nicht konfiguriert ist, wenden Sie sich bitte an ihren JACK Administrator. JACK Administratoren haben zwei Möglichkeiten LTI für Sie bereitzustellen: entweder als globalen LTI Provider oder einen Provider pro Kursangebot. Sehen Sie im Kursangebot im Abschnitt &amp;quot;LTI&amp;quot; die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot;, ist ein globaler Provider eingerichtet. Sehen Sie nur die Überschrift &amp;quot;Tool-Einstellungen&amp;quot;, ist ein Provider pro Kursangebot eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem globalen Provider ===&lt;br /&gt;
Verwenden Sie diese Methode, wenn unter LTI die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot; zu finden sind. Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, sollte dies immer der Fall sein. Andernfalls kontakieren Sie bitte ihren JACK Administrator.&lt;br /&gt;
&lt;br /&gt;
==== Einrichtung des externen Tools in Moodle ====&lt;br /&gt;
Rufen Sie den Moodle Kurs auf und klicken Sie im Menüband auf &amp;quot;Mehr&amp;quot; und wählen Sie &amp;quot;LTI Externe Tools&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Moodle extenes Tool anlegen.jpg|ohne|mini]]&lt;br /&gt;
&lt;br /&gt;
Klicken Sie in Moodle dann auf &amp;quot;Tool hinzufügen&amp;quot; es öffnet sich daruf in Moodle die Seite für die Tool-Einstellungen.&lt;br /&gt;
Rufen Sie nun in JACK das Kursangebot welches Sie verlinken möchten auf. Scrollen Sie zum Abschnitt LTI und setzen Sie den Haken bei &amp;quot;Aufruf des Kursangebots über LTI erlauben&amp;quot;. Setzen Sie die folgenden Einstellungen bei den Tool-Einstellungen in Moodle:&lt;br /&gt;
&lt;br /&gt;
# Unter &amp;quot;Name des Tools&amp;quot; tragen Sie &amp;quot;JACK&amp;quot; ein.&lt;br /&gt;
# Unter &amp;quot;Tool URL&amp;quot; muss der Wert &amp;quot;URL&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Anwenderschlüssel&amp;quot; muss der Wert &amp;quot;Konsumenten Schlüssel&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Öffentliches Kennwort&amp;quot; muss der Wert &amp;quot;Konsumenten Passwort&amp;quot; eingetragen werden.&lt;br /&gt;
# Als Einstellung für &amp;quot;Standard-Startcontainer&amp;quot; empfehlen wir &amp;quot;Neues Fenster&amp;quot;.&lt;br /&gt;
# Klappen Sie den Abschnitt &amp;quot;Datenschutz&amp;quot; aus und ändern Sie den Wert bei &amp;quot;Anwendername an Tool übergeben&amp;quot; auf &amp;quot;Immer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JACK Moodle Tool Einstellungen.jpg|ohne|809x406px]]&lt;br /&gt;
&lt;br /&gt;
Mit einem Klick auf &amp;quot;Änderungen speichern&amp;quot; bei den Tool-Einstellungen in Moodle ist JACK als neues Tool in ihrem Moodlekurs angelegt. Dieser Vorgang muss nur einmal pro Moodlekurs durchgeführt werden. Danach ist JACK in diesem Moodlekurs dauerhaft verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Einrichten des Links zum Kursangebot ====&lt;br /&gt;
Um in ihrem Moodlekurs ein konkretes Kursangebot zu verlinken gehen Sie wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
# Schalten Sie in ihrem Moodlekurs den Bearbeitungsmodus ein. Klicken Sie dann in einem beliebigen Abschnitt auf &amp;quot;Material oder Aktivität anlegen&amp;quot;.&lt;br /&gt;
# Im nun auftauchenden Dialog wählen Sie &amp;quot;JACK&amp;quot; als Tool aus.&lt;br /&gt;
# Klicken Sie in den nun angezeigten Einstellungen bearbeiten Dialog im Abschnitt Allgemeines auf &amp;quot;Mehr anzeigen&amp;quot; und kopieren Sie aus den JACK LTI Einstellungen den Wert von &amp;quot;Zusätzliche Parameter&amp;quot; in Moodle in das Feld &amp;quot;Angepasste Parameter&amp;quot;.&lt;br /&gt;
# Mit dem Button &amp;quot;Speichern und anzeigen&amp;quot; ganz unten können Sie den LTI Link anlegen und sofort testen.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;left&amp;quot;&lt;br /&gt;
|[[Datei:Moodle Material anlegen.jpg|mini]]&lt;br /&gt;
|[[Datei:Moodle Material Einstellungen.jpg|mini]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem lokalen Provider ===&lt;br /&gt;
Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, können Sie diese Methode nicht verwenden. Detaillierte Informationen folgen in Kürze.&lt;br /&gt;
&lt;br /&gt;
=== LTI und Sichtbarkeit von Kursangeboten ===&lt;br /&gt;
Bei der Anbindung mit Moodle sind auch die Sichtbarkeiten des Kursangebotes zu beachten. Dabei können folgenden Szenarien auftreten:&lt;br /&gt;
Das Kursangebot ist&lt;br /&gt;
* &#039;&#039;&#039;gar nicht sichtbar:&#039;&#039;&#039; Es kommt eine Fehlermeldung von LTI, dass kein Kursangebot zu dem Konsumentenschlüssel gefunden wurde.&lt;br /&gt;
* &#039;&#039;&#039;nicht mehr sichtbar:&#039;&#039;&#039; Der Lernende wird zu dem Kursangebot in Jack3 weitergeleitet und erhält dort eine Fehlermeldung, dass das Kursangebot nicht mehr sichtbar ist.&lt;br /&gt;
* &#039;&#039;&#039;nicht für diesen Lernenden sichtbar:&#039;&#039;&#039; Der Lernende wird zu den Kursangebot in Jack3 weitergeleitet und erhält dort die entsprechende Fehlermeldung, dass das Kursangebot nicht sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12272</id>
		<title>LTI Anbindung (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12272"/>
		<updated>2025-06-02T10:07:04Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Einrichten des Links zum Kursangebot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es besteht die Möglichkeit Jack3 auch über die LTI-Anbindung in LMS Systemen zur Verfügung zu stellen. Im Moment gibt es die Anbindung in Moodle, sodass man einen Link zu Jack3 in einem Moodle Kurs zur Verfügung stellen kann. Über diesen Link wird man dann direkt zu dem entsprechenden Kursangebot in Jack3 gelenkt. Die Anmeldung in Jack3 wird im Hintergrund durchgeführt, so dass die Lernenden dies nicht machen müssen. Die LTI-Anbindung bringt Studierende nicht in eine isolierte JACK3 Umgebung, sie können sich wie gewohnt auf dem System bewegen. &lt;br /&gt;
&lt;br /&gt;
Sehen Sie im Kursangebot die Nachricht, dass LTI für ihren Server nicht konfiguriert ist, wenden Sie sich bitte an ihren JACK Administrator. JACK Administratoren haben zwei Möglichkeiten LTI für Sie bereitzustellen: entweder als globalen LTI Provider oder einen Provider pro Kursangebot. Sehen Sie im Kursangebot im Abschnitt &amp;quot;LTI&amp;quot; die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot;, ist ein globaler Provider eingerichtet. Sehen Sie nur die Überschrift &amp;quot;Tool-Einstellungen&amp;quot;, ist ein Provider pro Kursangebot eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem globalen Provider ===&lt;br /&gt;
Verwenden Sie diese Methode, wenn unter LTI die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot; zu finden sind. Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, sollte dies immer der Fall sein. Andernfalls kontakieren Sie bitte ihren JACK Administrator.&lt;br /&gt;
&lt;br /&gt;
==== Einrichtung des externen Tools in Moodle ====&lt;br /&gt;
Rufen Sie den Moodle Kurs auf und klicken Sie im Menüband auf &amp;quot;Mehr&amp;quot; und wählen Sie &amp;quot;LTI Externe Tools&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Moodle extenes Tool anlegen.jpg|ohne|mini]]&lt;br /&gt;
&lt;br /&gt;
Klicken Sie in Moodle dann auf &amp;quot;Tool hinzufügen&amp;quot; es öffnet sich daruf in Moodle die Seite für die Tool-Einstellungen.&lt;br /&gt;
Rufen Sie nun in JACK das Kursangebot welches Sie verlinken möchten auf. Scrollen Sie zum Abschnitt LTI und setzen Sie den Haken bei &amp;quot;Aufruf des Kursangebots über LTI erlauben&amp;quot;. Setzen Sie die folgenden Einstellungen bei den Tool-Einstellungen in Moodle:&lt;br /&gt;
&lt;br /&gt;
# Unter &amp;quot;Name des Tools&amp;quot; tragen Sie &amp;quot;JACK&amp;quot; ein.&lt;br /&gt;
# Unter &amp;quot;Tool URL&amp;quot; muss der Wert &amp;quot;URL&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Anwenderschlüssel&amp;quot; muss der Wert &amp;quot;Konsumenten Schlüssel&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Öffentliches Kennwort&amp;quot; muss der Wert &amp;quot;Konsumenten Passwort&amp;quot; eingetragen werden.&lt;br /&gt;
# Als Einstellung für &amp;quot;Standard-Startcontainer&amp;quot; empfehlen wir &amp;quot;Neues Fenster&amp;quot;.&lt;br /&gt;
# Klappen Sie den Abschnitt &amp;quot;Datenschutz&amp;quot; aus und ändern Sie den Wert bei &amp;quot;Anwendername an Tool übergeben&amp;quot; auf &amp;quot;Immer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JACK Moodle Tool Einstellungen.jpg|ohne|809x406px]]&lt;br /&gt;
&lt;br /&gt;
Mit einem Klick auf &amp;quot;Änderungen speichern&amp;quot; bei den Tool-Einstellungen in Moodle ist JACK als neues Tool in ihrem Moodlekurs angelegt. Dieser Vorgang muss nur einmal pro Moodlekurs durchgeführt werden. Danach ist JACK in diesem Moodlekurs dauerhaft verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Einrichten des Links zum Kursangebot ====&lt;br /&gt;
Um in ihrem Moodlekurs ein konkretes Kursangebot zu verlinken gehen Sie wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
# Schalten Sie in ihrem Moodlekurs den Bearbeitungsmodus ein. Klicken Sie dann in einem beliebigen Abschnitt auf &amp;quot;Material oder Aktivität anlegen&amp;quot;.&lt;br /&gt;
# Im nun auftauchenden Dialog wählen Sie &amp;quot;JACK&amp;quot; als Tool aus.&lt;br /&gt;
# Klicken Sie in den nun angezeigten Einstellungen bearbeiten Dialog im Abschnitt Allgemeines auf &amp;quot;Mehr anzeigen&amp;quot; und kopieren Sie aus den JACK LTI Einstellungen den Wert von &amp;quot;Zusätzliche Parameter&amp;quot; in Moodle in das Feld &amp;quot;Angepasste Parameter&amp;quot;.&lt;br /&gt;
# Mit dem Button &amp;quot;Speichern und anzeigen&amp;quot; ganz unten können Sie den LTI Link anlegen und sofort testen.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;left&amp;quot;&lt;br /&gt;
|[[Datei:Moodle Material anlegen.jpg|mini]]&lt;br /&gt;
|[[Datei:Moodle Material Einstellungen.jpg|mini]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem lokalen Provider ===&lt;br /&gt;
Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, können Sie diese Methode nicht verwenden. Detaillierte Informationen folgen in Kürze.&lt;br /&gt;
&lt;br /&gt;
=== LTI und Sichtbarkeit von Kursangeboten ===&lt;br /&gt;
Bei der Anbindung mit Moodle sind auch die Sichtbarkeiten des Kursangebotes zu beachten. Dabei können folgenden Szenarien auftreten:&lt;br /&gt;
Das Kursangebot ist&lt;br /&gt;
* &#039;&#039;&#039;gar nicht sichtbar:&#039;&#039;&#039; Es kommt eine Fehlermeldung von LTI, dass kein Kursangebot zu dem Konsumentenschlüssel gefunden wurde.&lt;br /&gt;
* &#039;&#039;&#039;nicht mehr sichtbar:&#039;&#039;&#039; Der Lernende wird zu dem Kursangebot in Jack3 weitergeleitet und erhält dort eine Fehlermeldung, dass das Kursangebot nicht mehr sichtbar ist.&lt;br /&gt;
* &#039;&#039;&#039;nicht für diesen Lernenden sichtbar:&#039;&#039;&#039; Der Lernende wird zu den Kursangebot in Jack3 weitergeleitet und erhält dort die entsprechende Fehlermeldung, dass das Kursangebot nicht sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_Material_Einstellungen.jpg&amp;diff=12271</id>
		<title>Datei:Moodle Material Einstellungen.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_Material_Einstellungen.jpg&amp;diff=12271"/>
		<updated>2025-06-02T10:06:02Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: RSchypula lud eine neue Version von Datei:Moodle Material Einstellungen.jpg hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_Material_Einstellungen.jpg&amp;diff=12270</id>
		<title>Datei:Moodle Material Einstellungen.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_Material_Einstellungen.jpg&amp;diff=12270"/>
		<updated>2025-06-02T09:40:49Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_Material_anlegen.jpg&amp;diff=12269</id>
		<title>Datei:Moodle Material anlegen.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_Material_anlegen.jpg&amp;diff=12269"/>
		<updated>2025-06-02T09:38:04Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12268</id>
		<title>LTI Anbindung (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12268"/>
		<updated>2025-06-02T09:13:02Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Einrichtung des externen Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es besteht die Möglichkeit Jack3 auch über die LTI-Anbindung in LMS Systemen zur Verfügung zu stellen. Im Moment gibt es die Anbindung in Moodle, sodass man einen Link zu Jack3 in einem Moodle Kurs zur Verfügung stellen kann. Über diesen Link wird man dann direkt zu dem entsprechenden Kursangebot in Jack3 gelenkt. Die Anmeldung in Jack3 wird im Hintergrund durchgeführt, so dass die Lernenden dies nicht machen müssen. Die LTI-Anbindung bringt Studierende nicht in eine isolierte JACK3 Umgebung, sie können sich wie gewohnt auf dem System bewegen. &lt;br /&gt;
&lt;br /&gt;
Sehen Sie im Kursangebot die Nachricht, dass LTI für ihren Server nicht konfiguriert ist, wenden Sie sich bitte an ihren JACK Administrator. JACK Administratoren haben zwei Möglichkeiten LTI für Sie bereitzustellen: entweder als globalen LTI Provider oder einen Provider pro Kursangebot. Sehen Sie im Kursangebot im Abschnitt &amp;quot;LTI&amp;quot; die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot;, ist ein globaler Provider eingerichtet. Sehen Sie nur die Überschrift &amp;quot;Tool-Einstellungen&amp;quot;, ist ein Provider pro Kursangebot eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem globalen Provider ===&lt;br /&gt;
Verwenden Sie diese Methode, wenn unter LTI die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot; zu finden sind. Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, sollte dies immer der Fall sein. Andernfalls kontakieren Sie bitte ihren JACK Administrator.&lt;br /&gt;
&lt;br /&gt;
==== Einrichtung des externen Tools in Moodle ====&lt;br /&gt;
Rufen Sie den Moodle Kurs auf und klicken Sie im Menüband auf &amp;quot;Mehr&amp;quot; und wählen Sie &amp;quot;LTI Externe Tools&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Moodle extenes Tool anlegen.jpg|ohne|mini]]&lt;br /&gt;
&lt;br /&gt;
Klicken Sie in Moodle dann auf &amp;quot;Tool hinzufügen&amp;quot; es öffnet sich daruf in Moodle die Seite für die Tool-Einstellungen.&lt;br /&gt;
Rufen Sie nun in JACK das Kursangebot welches Sie verlinken möchten auf. Scrollen Sie zum Abschnitt LTI und setzen Sie den Haken bei &amp;quot;Aufruf des Kursangebots über LTI erlauben&amp;quot;. Setzen Sie die folgenden Einstellungen bei den Tool-Einstellungen in Moodle:&lt;br /&gt;
&lt;br /&gt;
# Unter &amp;quot;Name des Tools&amp;quot; tragen Sie &amp;quot;JACK&amp;quot; ein.&lt;br /&gt;
# Unter &amp;quot;Tool URL&amp;quot; muss der Wert &amp;quot;URL&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Anwenderschlüssel&amp;quot; muss der Wert &amp;quot;Konsumenten Schlüssel&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Öffentliches Kennwort&amp;quot; muss der Wert &amp;quot;Konsumenten Passwort&amp;quot; eingetragen werden.&lt;br /&gt;
# Als Einstellung für &amp;quot;Standard-Startcontainer&amp;quot; empfehlen wir &amp;quot;Neues Fenster&amp;quot;.&lt;br /&gt;
# Klappen Sie den Abschnitt &amp;quot;Datenschutz&amp;quot; aus und ändern Sie den Wert bei &amp;quot;Anwendername an Tool übergeben&amp;quot; auf &amp;quot;Immer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:JACK Moodle Tool Einstellungen.jpg|ohne|809x406px]]&lt;br /&gt;
&lt;br /&gt;
Mit einem Klick auf &amp;quot;Änderungen speichern&amp;quot; bei den Tool-Einstellungen in Moodle ist JACK als neues Tool in ihrem Moodlekurs angelegt. Dieser Vorgang muss nur einmal pro Moodlekurs durchgeführt werden. Danach ist JACK in diesem Moodlekurs dauerhaft verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Einrichten des Links zum Kursangebot ====&lt;br /&gt;
Um in ihrem Moodlekurs ein konkretes Kursangebot zu verlinken gehen Sie wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
# Schalten Sie in ihrem Moodlekurs den Bearbeitungsmodus ein. Klicken Sie dann in einem beliebigen Abschnitt auf &amp;quot;Material oder Aktivität anlegen&amp;quot;.&lt;br /&gt;
# Im nun auftauchenden Dialog wählen Sie &amp;quot;JACK&amp;quot; als Tool aus.&lt;br /&gt;
# Klicken Sie in den nun angezeigten Einstellungen auf &amp;quot;Mehr anzeigen&amp;quot; und kopieren sie den Wert &amp;quot;Zusätzliche Parameter&amp;quot; in das Feld &amp;quot;Angepasste Parameter&amp;quot; in Moodle.&lt;br /&gt;
# Mit dem Button &amp;quot;Speichern und anzeigen&amp;quot; ganz unten können Sie den LTI Link anlegen und sofort testen.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem lokalen Provider ===&lt;br /&gt;
Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, können Sie diese Methode nicht verwenden. Detaillierte Informationen folgen in Kürze.&lt;br /&gt;
&lt;br /&gt;
=== LTI und Sichtbarkeit von Kursangeboten ===&lt;br /&gt;
Bei der Anbindung mit Moodle sind auch die Sichtbarkeiten des Kursangebotes zu beachten. Dabei können folgenden Szenarien auftreten:&lt;br /&gt;
Das Kursangebot ist&lt;br /&gt;
* &#039;&#039;&#039;gar nicht sichtbar:&#039;&#039;&#039; Es kommt eine Fehlermeldung von LTI, dass kein Kursangebot zu dem Konsumentenschlüssel gefunden wurde.&lt;br /&gt;
* &#039;&#039;&#039;nicht mehr sichtbar:&#039;&#039;&#039; Der Lernende wird zu dem Kursangebot in Jack3 weitergeleitet und erhält dort eine Fehlermeldung, dass das Kursangebot nicht mehr sichtbar ist.&lt;br /&gt;
* &#039;&#039;&#039;nicht für diesen Lernenden sichtbar:&#039;&#039;&#039; Der Lernende wird zu den Kursangebot in Jack3 weitergeleitet und erhält dort die entsprechende Fehlermeldung, dass das Kursangebot nicht sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:JACK_Moodle_Tool_Einstellungen.jpg&amp;diff=12267</id>
		<title>Datei:JACK Moodle Tool Einstellungen.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:JACK_Moodle_Tool_Einstellungen.jpg&amp;diff=12267"/>
		<updated>2025-06-02T08:59:01Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_extenes_Tool_anlegen.jpg&amp;diff=12266</id>
		<title>Datei:Moodle extenes Tool anlegen.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:Moodle_extenes_Tool_anlegen.jpg&amp;diff=12266"/>
		<updated>2025-06-02T08:38:42Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12255</id>
		<title>LTI Anbindung (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=LTI_Anbindung_(JACK3)&amp;diff=12255"/>
		<updated>2025-05-22T12:53:14Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: Punkt 6 übergabe des Anwendernamen ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Es besteht die Möglichkeit Jack3 auch über die LTI-Anbindung in LMS Systemen zur Verfügung zu stellen. Im Moment gibt es die Anbindung in Moodle, sodass man einen Link zu Jack3 in einem Moodle Kurs zur Verfügung stellen kann. Über diesen Link wird man dann direkt zu dem entsprechenden Kursangebot in Jack3 gelenkt. Die Anmeldung in Jack3 wird im Hintergrund durchgeführt, so dass die Lernenden dies nicht machen müssen. Die LTI-Anbindung bringt Studierende nicht in eine isolierte JACK3 Umgebung, sie können sich wie gewohnt auf dem System bewegen. &lt;br /&gt;
&lt;br /&gt;
Sehen Sie im Kursangebot die Nachricht, dass LTI für ihren Server nicht konfiguriert ist, wenden Sie sich bitte an ihren JACK Administrator. JACK Administratoren haben zwei Möglichkeiten LTI für Sie bereitzustellen: entweder als globalen LTI Provider oder einen Provider pro Kursangebot. Sehen Sie im Kursangebot im Abschnitt &amp;quot;LTI&amp;quot; die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot;, ist ein globaler Provider eingerichtet. Sehen Sie nur die Überschrift &amp;quot;Tool-Einstellungen&amp;quot;, ist ein Provider pro Kursangebot eingestellt.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem globalen Provider ===&lt;br /&gt;
Verwenden Sie diese Methode, wenn unter LTI die Überschriften &amp;quot;Tool Einstellungen&amp;quot; und &amp;quot;Link Einstellungen&amp;quot; zu finden sind. Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, sollte dies immer der Fall sein. Andernfalls kontakieren Sie bitte ihren JACK Administrator.&lt;br /&gt;
&lt;br /&gt;
==== Einrichtung des externen Tools ====&lt;br /&gt;
Besuchen Sie in JACK, das Kursangebot, das Sie verlinken möchten. Die LTI Einstellungen dort sehen etwa wie folgt aus:&lt;br /&gt;
[[Datei:LTI Einstellungen - Globaler Provider.png|ohne|mini|496x496px]]&lt;br /&gt;
Wechseln Sie nun zu ihrem Moodlekurs und klicken Sie im Menüband auf &amp;quot;Mehr&amp;quot; und wählen Sie &amp;quot;LTI Externe Tools&amp;quot;. Klicken Sie dann auf Tool hinzufügen. Im folgenden Dialog müssen Sie die folgenden Einstellungen vornehmen:&lt;br /&gt;
&lt;br /&gt;
# Unter &amp;quot;Name des Tools&amp;quot; tragen Sie &amp;quot;JACK&amp;quot; ein.&lt;br /&gt;
# Unter &amp;quot;Tool URL&amp;quot; muss der Wert &amp;quot;URL&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Anwenderschlüssel&amp;quot; muss der Wert &amp;quot;Konsumenten Schlüssel&amp;quot; aus JACK eingetragen werden.&lt;br /&gt;
# Unter &amp;quot;Öffentliches Kennwort&amp;quot; muss der Wert &amp;quot;Konsumenten Passwort&amp;quot; eingetragen werden.&lt;br /&gt;
# Als Einstellung für &amp;quot;Standard-Startcontainer&amp;quot; empfehlen wir &amp;quot;Neues Fenster&amp;quot;.&lt;br /&gt;
# Klappen Sie den Abschnitt &amp;quot;Datenschutz&amp;quot; aus und ändern Sie den Wert bei &amp;quot;Anwendername an Tool übergeben&amp;quot; auf &amp;quot;Immer&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Mit einem Klick auf &amp;quot;Änderungen speichern&amp;quot; ist JACK als neues Tool in ihrem Moodlekurs angelegt. Dieser Vorgang muss nur einmal pro Kurs in Moodle vollzogen werden. Danach ist das Tool in diesem Kurs dauerhaft verfügbar.&lt;br /&gt;
&lt;br /&gt;
==== Einrichten des Links zum Kursangebot ====&lt;br /&gt;
Um in ihrem Moodlekurs ein konkretes Kursangebot zu verlinken gehen Sie wie folgt vor:&lt;br /&gt;
&lt;br /&gt;
# Schalten Sie in ihrem Moodlekurs den Bearbeitungsmodus ein. Klicken Sie dann in einem beliebigen Abschnitt auf &amp;quot;Material oder Aktivität anlegen&amp;quot;.&lt;br /&gt;
# Im nun auftauchenden Dialog wählen Sie &amp;quot;JACK&amp;quot; als Tool aus.&lt;br /&gt;
# Klicken Sie in den nun angezeigten Einstellungen auf &amp;quot;Mehr anzeigen&amp;quot; und kopieren sie den Wert &amp;quot;Zusätzliche Parameter&amp;quot; in das Feld &amp;quot;Angepasste Parameter&amp;quot; in Moodle.&lt;br /&gt;
# Mit dem Button &amp;quot;Speichern und anzeigen&amp;quot; ganz unten können Sie den LTI Link anlegen und sofort testen.&lt;br /&gt;
&lt;br /&gt;
=== LTI Anbindung mit einem lokalen Provider ===&lt;br /&gt;
Wenn Sie einen Moodleserver der Uni Duisburg-Essen verwenden, können Sie diese Methode nicht verwenden. Detaillierte Informationen folgen in Kürze.&lt;br /&gt;
&lt;br /&gt;
=== LTI und Sichtbarkeit von Kursangeboten ===&lt;br /&gt;
Bei der Anbindung mit Moodle sind auch die Sichtbarkeiten des Kursangebotes zu beachten. Dabei können folgenden Szenarien auftreten:&lt;br /&gt;
Das Kursangebot ist&lt;br /&gt;
* &#039;&#039;&#039;gar nicht sichtbar:&#039;&#039;&#039; Es kommt eine Fehlermeldung von LTI, dass kein Kursangebot zu dem Konsumentenschlüssel gefunden wurde.&lt;br /&gt;
* &#039;&#039;&#039;nicht mehr sichtbar:&#039;&#039;&#039; Der Lernende wird zu dem Kursangebot in Jack3 weitergeleitet und erhält dort eine Fehlermeldung, dass das Kursangebot nicht mehr sichtbar ist.&lt;br /&gt;
* &#039;&#039;&#039;nicht für diesen Lernenden sichtbar:&#039;&#039;&#039; Der Lernende wird zu den Kursangebot in Jack3 weitergeleitet und erhält dort die entsprechende Fehlermeldung, dass das Kursangebot nicht sichtbar ist.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(JACK3)&amp;diff=11975</id>
		<title>Versionshistorie (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(JACK3)&amp;diff=11975"/>
		<updated>2024-11-08T13:34:55Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Neue Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Oktober 2024 ==&lt;br /&gt;
&lt;br /&gt;
=== Version 0.14.0 ===&lt;br /&gt;
&lt;br /&gt;
==== Neue Features ====&lt;br /&gt;
&lt;br /&gt;
* Die Sichtung von Einreichungen wurden mit einem Labelsystem vereinfacht. So sind Einreichungen mit Kommentaren jetzt beispielsweise besser zu finden.&lt;br /&gt;
* Zahlen können nur von JACK automatisch validiert werden.&lt;br /&gt;
* Es gibt eine neue tabellarische Übersicht über bearbeitete Aufgaben&lt;br /&gt;
* Video lassen sich nun per Knopfdruck einfügen und einbetten.&lt;br /&gt;
* Es kann nun automatisch zum nächsten Aufgabenteil (der folgende in der Liste der Aufgabenteile) gesprungen werden.&lt;br /&gt;
* FillIn Felder können nun farblich hervorgehoben werden.&lt;br /&gt;
* FillIn Felder können nun in ihrer Länge begrenzt werden.&lt;br /&gt;
* Die Eingabe in Dropdownfelder kann nun direkt auf ihren Inhalt geprüft werden (anstelle des Index)&lt;br /&gt;
* In Molekülen kann nun farbig markiert werden.&lt;br /&gt;
* Beim Testen einer Aufgabe kann nun direkt ein neuer Versuch gestartet werden.&lt;br /&gt;
* Variablen müssen nun nicht mehr vorbelegt werden, sondern können via Update erstmalig belegt werden. &lt;br /&gt;
* Kleinere Verbesserungen bei der Registrierung wurden vorgenommen.&lt;br /&gt;
* Neuer Aufgabenteiltyp Gatterschaltungen&lt;br /&gt;
&lt;br /&gt;
==== Verbesserungen und Fixes aus Meldungen der Community ====&lt;br /&gt;
&lt;br /&gt;
* In R Teilaufgaben kann vorausgefüllter Code in einer Datei hochgeladen werden.&lt;br /&gt;
* Die Übergabe von Matrizen/Vektoren an R verbesert.&lt;br /&gt;
* Das Scrollen zu Ordnern wurde verbessert von der Brotkrumennavigation wurde verbessert&lt;br /&gt;
&lt;br /&gt;
== Juli 2024 ==&lt;br /&gt;
&lt;br /&gt;
=== Version 0.13.0 ===&lt;br /&gt;
&lt;br /&gt;
* Die R Konsole und der R Checker verwenden nun intern den gleichen Dienst, sodass sie sich exakt gleich verhalten.&lt;br /&gt;
* Kursangebote können nach IP-Adressen gefiltert werden, beispielsweise um die Teilnahme auf den Campus oder die PC Hall zu beschränken.&lt;br /&gt;
* Das Labelsystem für Bearbeitungen wurde verbessert.&lt;br /&gt;
&lt;br /&gt;
== Juni 2024 ==&lt;br /&gt;
&lt;br /&gt;
=== Version 0.12.0 ===&lt;br /&gt;
&lt;br /&gt;
* Im Aufgabentyp UML kann den Studierenden nun optional ein web-basierter Editor für ausgewählte Diagrammtypen bereitgestellt werden.&lt;br /&gt;
* Das Kursfeedback ist jetzt prominenter platziert und für Studierende deutlich besser zu finden.&lt;br /&gt;
* Hinweise werden nun auch korrekt gezählt, wenn &amp;quot;Ab hier neu bearbeiten&amp;quot; genutzt wurde.&lt;br /&gt;
* Die Einstellungen für Studierende zur Kurseinsicht wurden verbessert. Es ist jetzt auch möglich die Aufgabenliste zu verstecken.&lt;br /&gt;
* Sitzt Text eng an einer Lücke an, wird er nicht mehr beim Zeilenumbruch von dieser getrennt.&lt;br /&gt;
* Inhalte auf denen man Leserecht hat, lassen sich jetzt einfach in den eigenen Ordner kopieren.&lt;br /&gt;
* Die Darstellung der Aufgabenliste in Kursangeboten wurde entschlackt.&lt;br /&gt;
* Fehler beim Verschieben von Inhalten gelöst.&lt;br /&gt;
&lt;br /&gt;
== April 2024 ==&lt;br /&gt;
&lt;br /&gt;
=== Version 0.11.0 ===&lt;br /&gt;
Highlights in Version 0.11.0:&lt;br /&gt;
&lt;br /&gt;
* In FillIn Teilaufgaben können nun auch Moleküle in Eingabefelder eingegeben werden.&lt;br /&gt;
* Studierende sehen jetzt den Status ihrer Aufgaben auch in der kleinen Aufgabenliste am Rand.&lt;br /&gt;
* Die Navigation durch die Versionen einer Aufgabe / eines Kurses wurde verbessert.&lt;br /&gt;
* Die verbleibende Bearbeitungszeit lässt sich jetzt durch Studierende ausblenden (Thema Prüfungsangst)&lt;br /&gt;
* Korrekturen lassen sich jetzt auch nach Aufgabe (anstelle nach Kursbearbeitung) durchführen.&lt;br /&gt;
* Es ist jetzt eine Vorschau auf die LaTeX-Ausgabe im Feedback möglich.&lt;br /&gt;
* Syntaktisch falsche Eingaben im Formeleditor werden jetzt bereits durch JACK moniert.&lt;br /&gt;
* Es kann jetzt manuelles Kursfeedback vergeben werden.&lt;br /&gt;
* Die Eingabe von Text in Freitextaufgaben kann nun auf eine Anzahl Zeichen oder Worte eingeschränkt werden.&lt;br /&gt;
* Es werden jetzt auch Tags aus JACK 2 Aufgaben importiert.&lt;br /&gt;
&lt;br /&gt;
Behobene von Ihnen gemeldete Fehler:&lt;br /&gt;
&lt;br /&gt;
* Umbenennen Variable, wenn Variable schon vorhanden&lt;br /&gt;
* Vereinheitlichen der Löschsymbole bei Feedbacks und Hinweisen&lt;br /&gt;
* Tag-Liste schließt sich beim scrollen&lt;br /&gt;
* isEmpty() wertet nicht wie im WiKi beschrieben Leerzeichen aus&lt;br /&gt;
* Implementierung eines Videoplayers&lt;br /&gt;
* Falscher Import spezifischer Stage einer Aufgabe&lt;br /&gt;
* Bei verschieben des Feedbacks verschwindet Feedbacktext bei ausführlichem Editor&lt;br /&gt;
* Inhalte verschieben funktioniert beim nachträglichen Löschen einer Aufgabe aus dem Startordner bei bereits gewähltem Zielordner nicht&lt;br /&gt;
* Auswahl in der Brotkrumennavigation führt immer auf den allerobersten Knoten der gesamten Ordnerstruktur&lt;br /&gt;
* Begrenzung der Eingabe in Freitextaufgaben&lt;br /&gt;
&lt;br /&gt;
==Januar 2024==&lt;br /&gt;
===Version 0.10.0===&lt;br /&gt;
Highlights in Version 0.10.0:&lt;br /&gt;
* Mit dem R-Taschenrechner hat ein weiteres Hilfsmittel für Studierende Einzug in JACK gehalten.&lt;br /&gt;
* TinyMCE ist der neue Editor zum Bearbeiten von formatiertem Text in JACK. Er hat den CKEditor vollständig abgelöst.&lt;br /&gt;
* Schlägt die Variablenbelegung in einer Aufgabe fehl, so werden nun bis zu zwei weitere Versuche unternommen, die Aufgabe doch noch korrekt zu initialisieren. So führen selten auftretende Fehler nicht zur Unbearbeitbarkeit der Aufgabe für Studierende.&lt;br /&gt;
* Variableninhalte lassen sich nun einfach per Klick kopieren.&lt;br /&gt;
* Feedback in MC Aufgaben lässt sich nun auch nachträglich ändern.&lt;br /&gt;
* Der persönlicher Ordner kann nicht mehr direkt geteilt werden. Nur dessen Unterordner lassen sich mit anderen Nutzern teilen.&lt;br /&gt;
* Die Teilaufgaben einer Aufgabe lassen sich nun umsortieren.&lt;br /&gt;
&lt;br /&gt;
Hinzu kommen div. kleinere Fixes, viele davon im Zusammenhang mit dem JACK 2 Importer und dem neuen Theme, das in der letzten Version hinzugekommen ist.&lt;br /&gt;
&lt;br /&gt;
Ihre bearbeiteten Issues:&lt;br /&gt;
* Absoluter Abzug von Punkten bei Hinweisen&lt;br /&gt;
* Mehrere Aufgaben gleichzeitig verschieben&lt;br /&gt;
* Bei Verschieben des Feedbacks verschwindet Feedbacktext&lt;br /&gt;
* R Checker, Testfall Gruppen werden ungewollt dupliziert&lt;br /&gt;
* Verschieben von Aufgaben in einen anderen Ordner&lt;br /&gt;
* Darstellung von den Check-Boxen in MC Aufgaben&lt;br /&gt;
* Neues Theme: Grafik überdeckt Editieroption bei MC Stages&lt;br /&gt;
* Scrollbar bei Feedback innerhalb der Debug-Optionen&lt;br /&gt;
&lt;br /&gt;
==Oktober 2023==&lt;br /&gt;
===Version 0.9.0===&lt;br /&gt;
Die Version enthält ein neues Theme auf Basis einer neuen Version des UI-Frameworks. Es hat sich nur die Optik leicht geändert; Bedienelemente sind nach wie vor an den vertrauten Stellen zu finden. Einzige Ausnahme: Die Kursbearbeitung für Studierende wurde leicht überarbeitet, sodass Funktionen zum Kurs beenden oder neustarten etc. jetzt hoffentlich besser platziert sind und weniger zu Verwechslungen einladen.&lt;br /&gt;
&lt;br /&gt;
Dazu haben wir wie üblich ihre zahlreichen Verbesserungsvorschläge und Fehler bearbeitet:&lt;br /&gt;
* Formatierungsfehler bzgl. Vorzeichen behoben.&lt;br /&gt;
* Probleme mit mathematisch belegten Zeichen behoben.&lt;br /&gt;
* Problem bei der Faktorisierung in Sage behoben.&lt;br /&gt;
* Problem bei Summen- und Produktbildung behoben.&lt;br /&gt;
* Der Formeleditor kann jetzt auch f(x) verarbeiten.&lt;br /&gt;
* Imaginäranteil von komplexen Zahlen wird wieder erkannt.&lt;br /&gt;
* Probleme mit der Eulerschen Zahl behoben.&lt;br /&gt;
* In der Teilnehmerübersicht kann jetzt auch nach Profilfeldern wie bspw. der Matrikelnummer gefiltert werden.&lt;br /&gt;
&lt;br /&gt;
==September 2023==&lt;br /&gt;
===Version 0.8.1===&lt;br /&gt;
Neuerungen in dieser Version:&lt;br /&gt;
* Chemische Formeln können nun asynchron geprüft werden.&lt;br /&gt;
* Tags von Aufgaben werden nun mit im- und exportiert.&lt;br /&gt;
* Mit LaTeX gesetzte Formeln können nun per Klick gezoomt werden.&lt;br /&gt;
* Die Namen hochgeladener Ressourcen werden nun vor Studierenden verborgen.&lt;br /&gt;
* Viele Detailverbesserungen in der Benutzeroberfläche.&lt;br /&gt;
&lt;br /&gt;
Ihre gemeldeten Fehler und Verbesserungsvorschläge:&lt;br /&gt;
* Die Spaltenbreite in MCTable Aufgaben ist nun dynamisch.&lt;br /&gt;
* Die sporadische Sperrung der R-Konsole bei der Anforderung von Hinweisen ist nun behoben.&lt;br /&gt;
* Dropdownfelder und Formeleditoren beeinflussen sich nicht mehr gegenseitig.&lt;br /&gt;
* Feedback lässt sich auch bei mehrstufigen Aufgaben nun umbenennen.&lt;br /&gt;
&lt;br /&gt;
==Mai 2023==&lt;br /&gt;
===Version 0.7.1===&lt;br /&gt;
Neuerungen in dieser Version:&lt;br /&gt;
* Mit dem Stufentyp MCTable kehrt ein alter Bekannter aus JACK 2 wieder in den Schoß der JACK Familie zurück.&lt;br /&gt;
* Der Aufgabeneditor hat jetzt ein Werkzeugmenü, über das auch der freie Moleküleditor verfügbar ist.&lt;br /&gt;
* Mit dem Validator haben wir ein Werkzeug hinzugefügt, dass vor typischen Fehlern und Fehlkonfigurationen in Aufgaben und Kursen warnt.&lt;br /&gt;
* Der Ex- und Import von Kursen ist jetzt möglich.&lt;br /&gt;
* Es lassen sich jetzt auch Java Aufgaben aus JACK 2 importieren.&lt;br /&gt;
&lt;br /&gt;
Ihre gemeldeten Fehler und Verbesserungsvorschläge:&lt;br /&gt;
* Das automatische Scrollen beim Einreichen wurde verbessert.&lt;br /&gt;
* Mehrere Aufgaben können nun gleichzeitig verschoben werden.&lt;br /&gt;
* Der Countdown funktioniert jetzt auch beim schnellen Aufgabenwechsel wieder.&lt;br /&gt;
* Bilder werden nun automatisch skaliert, sodass sie das Layout nicht stören.&lt;br /&gt;
&lt;br /&gt;
Organisatorische Neuerungen:&lt;br /&gt;
* Prüfungen brauchen nun nicht mehr im Wiki eingetragen zu werden. Eine formlose E-Mail an das JACK Team reicht.&lt;br /&gt;
* Unser Wiki liegt jetzt auf dem Wikiserver der Universität und lässt sich nach wie vor über die bekannte Domäne jack-community.org erreichen.&lt;br /&gt;
* Wir werden den Issuetracker für unsere JACK Tester auf das Gitlab der Universität umziehen, um es leichter erreichbar für alle Mitarbeiterinnen und Mitarbeiter der Universität zu machen. Mehr Infos zum Umzug werden Sie bald separat erhalten.&lt;br /&gt;
&lt;br /&gt;
==März 2023==&lt;br /&gt;
===Version 0.6.1===&lt;br /&gt;
Die folgenden neuen Features wurden realisiert:&lt;br /&gt;
* Neuer Stufentyp: Freitextaufgaben&lt;br /&gt;
* Neuer Stufentyp: Datei(en) hochladen&lt;br /&gt;
* Neuer Stufentyp: Atomorbitalschemata&lt;br /&gt;
* Feedbackregeln können nun eingeklappt werden&lt;br /&gt;
* Diverse Detailverbesserungen&lt;br /&gt;
&lt;br /&gt;
Zudem haben wir einige Issues lösen können:&lt;br /&gt;
* Automatisches Anpassen der Größe von Bildern.&lt;br /&gt;
* Löschen von Tags aktiviert Speichernbutton nicht.&lt;br /&gt;
* Vorausgefüllter Code ist beschränkt bzgl. der Länge.&lt;br /&gt;
* Mehrere R-Stufen in einer Aufgabe.&lt;br /&gt;
* Kursbearbeitung kaputt, wenn Aufgabe daraus gelöscht wurde.&lt;br /&gt;
* Probleme beim Import von JACK 2 Aufgaben mit Dateianhängen.&lt;br /&gt;
&lt;br /&gt;
Kleinere Änderungen gab es bei den Namensräume für Variablen:&lt;br /&gt;
* In den Stufentypen Java, Python und UML wurden die input Variablen nach check verschoben.&lt;br /&gt;
* Bei Multiple Choice Stufen wurden die Variablen mcStageCorrectTicks, mcStageIncorrectTicks und mcStageTotalTicks in den Namensraum check verschoben&lt;br /&gt;
&lt;br /&gt;
==September 2022==&lt;br /&gt;
===Version 0.4.0===&lt;br /&gt;
Folgende Neuerungen sind eingeflossen:&lt;br /&gt;
* Aufgaben im Fehlerzustand lassen sich jetzt neustarten.&lt;br /&gt;
* Mehr Informationen zu Einreichungen von Studierenden&lt;br /&gt;
* Verbesserungen am Moleküleditor&lt;br /&gt;
* Verbesserungen bei der Bewertung von R-Aufgaben&lt;br /&gt;
&lt;br /&gt;
Wir haben zudem die folgenden Issues gelöst:&lt;br /&gt;
* Import von R-Aufgaben ohne Variablen&lt;br /&gt;
* Verschieben von Feedback&lt;br /&gt;
* Formatierungsfehler bei Plus Minus&lt;br /&gt;
* EqualsExpression wird mit Strings angelegt&lt;br /&gt;
* Feedback wird in eine Concat-Umgebung konvertiert&lt;br /&gt;
* Tags lassen sich nicht einschalten&lt;br /&gt;
&lt;br /&gt;
==Juli 2022==&lt;br /&gt;
===Version 0.3.0===&lt;br /&gt;
Folgende Issues wurden seit dem letzten Release gelöst:&lt;br /&gt;
* Das Duplizieren von Kursen schlägt fehl.&lt;br /&gt;
* Nur ein Formeleditor soll gleichzeitig sichtbar sein.&lt;br /&gt;
* Alignment von Antwortboxen bei MC-Aufgaben mit Bildern als Antwortmöglichkeiten.&lt;br /&gt;
* Darstellung lange MC-Optionen.&lt;br /&gt;
&lt;br /&gt;
Außerdem gab es zahlreiche Verbesserungen im JACK 2 Importer sowie in der Benutzeroberfläche.&lt;br /&gt;
&lt;br /&gt;
==Mai 2022==&lt;br /&gt;
===Version 0.2.0===&lt;br /&gt;
Neben technischen Umbauten und neuen Stufentypen, sind wieder zahlreiche Fehler behoben worden, unter anderem die folgenden Issues:&lt;br /&gt;
* Variable mit einleitenden $-Zeichen für LATEX-Code wird zu &amp;quot;&lt;br /&gt;
* JACK2 MC-Aufgabe mit Graphen importierbar, aber Graphen werden nicht angezeigt&lt;br /&gt;
* Tags in alphabetischer Reihenfolge anzeigen&lt;br /&gt;
* Kein Import einer JACK2 Aufgabe aus S05 nach JACK3 mit Bild&lt;br /&gt;
* Aufgabenimport nicht möglich&lt;br /&gt;
* Angabe der E-Mail Adresse oder Matrikelnummer in der Kursangebots-Statistik&lt;br /&gt;
* Import von Aufgaben mit einem freigegeben Account&lt;br /&gt;
&lt;br /&gt;
==Februar 2022==&lt;br /&gt;
===Version 0.1.0===&lt;br /&gt;
In diesem Release wurde insbesondere der Mechanismus für Feedback-Regeln in Fill-In-Aufgaben überarbeitet, sodass beispielsweise die Überprüfung auf leere Felder deutlich bequemer erfolgen kann. Zudem haben wir das Rechtesystem erweitert, sodass eine bessere Aufteilung der Aufgaben in der Lehre ermöglicht wird. Außerdem haben wir diverse ihrer Wünsche und Fehlermeldungen bearbeitet.&lt;br /&gt;
* Formatierung von Variablen im Text von Aufgaben&lt;br /&gt;
* Auswerten von R-Aufgaben vor dem Einreichen&lt;br /&gt;
* Falsche Palette beim Import von JACK 2 Aufgaben&lt;br /&gt;
* Verbesserungen beim Layout von Kursen.&lt;br /&gt;
* Probleme beim Import von Aufgaben mit Bildern&lt;br /&gt;
* Formatierung von Variablen im Text von Aufgaben.&lt;br /&gt;
[[Kategorie:JACK3]]&lt;br /&gt;
[[Kategorie:Hauptseiten]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Dateien_(JACK3)&amp;diff=11903</id>
		<title>Dateien (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Dateien_(JACK3)&amp;diff=11903"/>
		<updated>2024-10-30T09:51:59Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Dateien über Sciebo verwalten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grundsätzlich können Dateien, die in Aufgaben genutzt werden, sowohl in JACK als auch extern verwaltet werden. Wir empfehlen ausdrücklich die Verwendung der Lösung innerhalb von JACK.&lt;br /&gt;
&lt;br /&gt;
=== Dateien an eine Aufgabe anhängen ===&lt;br /&gt;
Beim Bearbeiten einer Aufgabe werden im Abschnitt &#039;&#039;Dateien&#039;&#039; alle Dateien, die für die Aufgabe benötigt werden, hochgeladen.&lt;br /&gt;
&lt;br /&gt;
[[File:Aufgabe_Datei.JPG|center|thumb|800px|Upload einer Datei]]&lt;br /&gt;
&lt;br /&gt;
Um eine Datei hochzuladen klickt man auf den Button &#039;&#039;&#039;Hochladen&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Erst nach dem Speichern ist die Datei auch in der Datenbank gespeichert und kann in der Aufgabe verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Alle Dateien einer Aufgabe werden in einer Liste der Reihenfolge nach wie sie hochgeladen wurden aufgelistet. Jede Datei hat eine eindeutige ID mit der sie an anderen Stellen referenziert werden kann. Die Datei hat einen Dateinamen. Optional kann man der Datei auch eine Beschreibung hinzufügen. Weitere Informationen in der Liste sind wann eine Datei hochgeladen wurde und von welchem Nutzer. &lt;br /&gt;
&lt;br /&gt;
[[File:Dateien.PNG|center|thumb|800px|Aktionen]]&lt;br /&gt;
Unter den 3 Punkten gibt es drei Aktionen die dem Nutzer zur Verfügung stehen. Die Datei kann entfernt werden oder heruntergeladen werden. Zusätzlich bietet es einem die Möglichkeit eine Datei zu ersetzen. Das hat den Vorteil, dass die Datei direkt auch an allen referenzierten Stellen aktualisiert wird.&lt;br /&gt;
&lt;br /&gt;
=== Dateien in Aufgabe nutzen ===&lt;br /&gt;
[[File:Bild-in-Text-einfuegen.jpg|center|thumb|800px|Ressource im Fließtext einfügen]]&lt;br /&gt;
Wenn die hochgeladene Datei z.B. ein Bild ist kann sie an jeder Stelle der Aufgabe, wo ein Fließtext ist, eingefügt werden. Hier wird das exemplarisch einmal für den Aufgabentext erklärt. Wenn der Fließtext, wie hier der Aufgabentext, erstellt wird im Editor steht der Button &#039;&#039;&#039;Ressource Einfügen&#039;&#039;&#039; zur Verfügung. Wenn man diesen anklickt bekommt man alle Dateien aufgelistet, die in dieser Aufgabe hochgeladen wurden. In dem Screenshot oben sind drei Bilder hochgeladen worden. Dem Nutzer stehen dabei zwei &#039;&#039;Aktionen&#039;&#039; zur Verfügung: Bild sichtbar einfügen [[File:Icon-Bild.jpg|25px]] oder einen Link zu der Datei einfügen [[File:Icon-Link.jpg|25px]]. In dem Screenshot unten wurde einmal exemplarisch das Bild &#039;&#039;x2+3.jpg&#039;&#039; in den zwei Varianten eingefügt. Bei der Variante Link einfügen hat man einen Link, der einem erst beim Anklicken das Bild zeigt. Bei der Variante Bild sichtbar einfügen sieht man das Bild direkt im Fließtext.&lt;br /&gt;
[[File:Bilder-eingefuegt.jpg|center|thumb|500px|Bild mit den zwei Varianten eingefügt]]&lt;br /&gt;
&lt;br /&gt;
=== Dateien extern verwalten ===&lt;br /&gt;
Alternativ können Dateien auch von einer externen Quelle eingebunden werden, beispielsweise über Sciebo oder Imperia. Das hat die folgenden Vorteile:&lt;br /&gt;
&lt;br /&gt;
* Sie können die Datei problemlos in mehreren Aufgaben wiederverwenden auch über unterschiedliche Server hinweg.&lt;br /&gt;
* Eine nachträgliche Änderung der Dateien wirkt sich auf alle Aufgaben aus, die diese Datei verwenden.&lt;br /&gt;
&lt;br /&gt;
Diese Vorteile werden durch einige Nachteile erkauft:&lt;br /&gt;
&lt;br /&gt;
* Sie arbeiten an der JACK Versionsverwaltung vorbei, sodass JACK Aufgabenversionen nicht mehr vollständig wiederherstellen kann. Sie sind dann immer von der Quelle der Dateien abhängig. Das ist auch und gerade für die Durchführung von Prüfungen relevant.&lt;br /&gt;
* Sie müssen dafür Sorge tragen, dass die Datei für die Studierenden erreichbar ist und bleibt. Das kann beispielsweise in der PC Hall durch Filterung des Internetverkehrs nicht gewährleistet sein.&lt;br /&gt;
* Externe Dateien können in Exporten nicht berücksichtigt werden.&lt;br /&gt;
Externe Dateien können über den Editor als Bilder oder Videos eingefügt werden. Das geht im der Aufgabentext und an allen anderen Stellen, an denen der WYSIWYG Editor verfügbar ist. Zum Einfügen klicken Sie einfach in der Toolbar des Editors auf den Button mit dem Bild, bzw. mit dem Play-Icon.&lt;br /&gt;
&lt;br /&gt;
==== Dateien über Sciebo verwalten ====&lt;br /&gt;
[https://uni-duisburg-essen.sciebo.de/ Sciebo] eignet sich für die externe Verwaltung von Dateien und ist für alle Hochschulangehörigen der Univerität Duisburg-Essen verfügbar. Besonders bei Videos ist dies sinnvoll, da Videos schnell die maximale Dateigröße von JACK übersteigen. Bei Klausuren ist es jedoch nicht erlaubt Resourcen und Dienste außerhalb der Universität zu verwenden. Sie können Dateien aus Sciebo wie folgt in JACK verwenden:&lt;br /&gt;
&lt;br /&gt;
# Laden Sie die Datei in Sciebo auf dem gewohnten Weg hoch.&lt;br /&gt;
# Klicken Sie auf das &amp;quot;Teilen&amp;quot; Symbol hinter dem Dateinamen.&lt;br /&gt;
# Wechseln Sie rechts in den Tab &amp;quot;Öffentliche Links&amp;quot; und klicken Sie auf &amp;quot;Öffentlichen Link erstellen&amp;quot;&lt;br /&gt;
# Tragen Sie optional einen Namen ein. Achten Sie darauf, dass nur &amp;quot;Herunterladen / Ansehen&amp;quot; ausgewählt ist und klicken Sie auf &amp;quot;Teilen&amp;quot;.&lt;br /&gt;
# Mit dem ersten Symbol direkt hinter dem neu erstellten Link können Sie diesen in die Zwischenablage kopieren und dann in JACK einfügen.&lt;br /&gt;
# Sie können die Datei auch zum direkten Downloadlink umwandeln, indem Sie &amp;quot;/download&amp;quot; an den Link anfügen. Alternativ finden Sie vollständige Adresse zum Download auch, wenn Sie den zuvor kopierten Link besuchen unter der Vorschau der Datei. Wenn Sie Videos von Sciebo in JACK einbinden wollen, ist es notwendig /download an den Link anzufügen.&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Manuelles_Feedback_(JACK3)&amp;diff=9787</id>
		<title>Manuelles Feedback (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Manuelles_Feedback_(JACK3)&amp;diff=9787"/>
		<updated>2024-02-09T10:10:20Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In jeder Aufgabe gibt es die Möglichkeit auch manuelles Feedback zu geben. Dabei spielt es keine Rolle, ob die Aufgabe einen Checker hat und bereits vom System ein Feedback bekommen hat oder nicht. Diese Möglichkeit steht in jeder Einreichung in einem Kursangebot zur Verfügung. Manuelles Feedback ist Feedback, welches ein Lehrender (zusätzlich oder ersetzend) zum automatischen erzeugten Feedback einer Einreichung geben kann. Ein Lehrender kann dabei Punkte neu vergeben und Text schreiben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die folgenden Schritte muss man gehen, wenn man &#039;&#039;&#039;alle Lösungen aller Aufgaben zu einem Studierenden&#039;&#039;&#039; sehen möchte und um zu der Möglichkeit zu kommen manuelles Feedback in einer eingereichten Lösung hinzuzufügen:&lt;br /&gt;
# Man wählt unter dem Tab &#039;&#039;&#039;Verfügbare Kurse&#039;&#039;&#039; das entsprechende Kursangebot aus, in dem die eingereichte Lösung, die bewertet werden soll, liegt.&lt;br /&gt;
# Danach scrollt man die Seite bis ganz nach unten und klickt auf den Button &#039;&#039;&#039;Teilnehmerübersicht&#039;&#039;&#039;.&lt;br /&gt;
# Hier wählt man den entsprechenden Studierenden aus, den man bewerten möchte. Bei den drei Pünktchen am Ende der Zeile wählt man &#039;&#039;&#039;Zur Bearbeitung gehen&#039;&#039;&#039; aus.&lt;br /&gt;
# Auf der nächsten Seite sieht man die Details der Bearbeitung des Studierenden. Nun wählt man in der Liste der Aufgaben die Aufgabe aus, die man manuell bewerten möchte, in dem man auf das Lupen Symbol klickt.&lt;br /&gt;
# Jetzt sieht man die Bearbeitung einer Aufgabe eines Studierenden. Wenn man die Seite nach ganz unten scrollt ist der Button &#039;&#039;&#039;Manuelles Feedback&#039;&#039;&#039; zu sehen.&lt;br /&gt;
# Wenn man den Button klickt poppt folgendes Pop-Up auf:&lt;br /&gt;
Die folgenden Schritte muss man gehen, wenn man &#039;&#039;&#039;alle Lösungen einer Aufgabe&#039;&#039;&#039; sehen möchte und um zu der Möglichkeit zu kommen manuelles Feedback in einer eingereichten Lösung hinzuzufügen:&lt;br /&gt;
# Man wählt unter dem Tab &#039;&#039;&#039;Verfügbare Kurse&#039;&#039;&#039; das entsprechende Kursangebot aus, in dem die eingereichte Lösung, die bewertet werden soll, liegt.&lt;br /&gt;
# Danach scrollt man die Seite bis ganz nach unten und klickt auf den Button &#039;&#039;&#039;Bearbeitungsübersicht&#039;&#039;&#039;.&lt;br /&gt;
# Hier wählt man die entsprechende Aufgabe aus, die man bewerten möchte.&lt;br /&gt;
# Jetzt sieht man alle Lösungen, die zu dieser Aufgabe in diesem Kursangebot eingereicht wurden. Die Liste kann nach Benutzernamen oder Zeitpunkt sortiert werden.&lt;br /&gt;
# Nun wählt man in der Liste der Lösungen die Lösung aus, die man manuell bewerten möchte, in dem man auf das Lupen Symbol klickt.&lt;br /&gt;
# Jetzt sieht man die Bearbeitung einer Aufgabe eines Studierenden. Wenn man die Seite nach ganz unten scrollt ist der Button &#039;&#039;&#039;Manuelles Feedback&#039;&#039;&#039; zu sehen.&lt;br /&gt;
# Wenn man den Button klickt poppt folgendes Pop-Up auf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
Manuelles_Feedback1.jpg&lt;br /&gt;
Manuelles_Feedback2.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einstellungsmöglichkeiten bei manuellen Feedback:&lt;br /&gt;
* Zunächst muss mit einem Haken das manuelle Feedback für diese Einreichung aktiviert werden.&lt;br /&gt;
* Danach hat man die Wahl, ob das automatisch erzeugte Feedback weiterhin angezeigt wird oder nicht. Der Aufgabentyp &#039;&#039;&#039;Freitext&#039;&#039;&#039; hat kein automatisch erzeugtes Feedback!&lt;br /&gt;
* Zur Nachverfolgung wird angezeigt, welcher Nutzer das manuelle Feedback gesetzt hat. Diese Einsicht hat der Studierende später nicht, nur Lehrende mit entsprechenden Rechten auf das Kursangebot können sehen wer das manuelle Feedback gesetzt hat.&lt;br /&gt;
* Im nächsten Punkt wird die Punktzahl gesetzt. Dies wird prozentual gesetzt, da das Maximum an Punkten in JACK bei 100 Punkten liegt.&lt;br /&gt;
* Nun gibt es die Möglichkeit einen Kommentar an die Lösung zu setzen, den nur Lehrende sehen können. Dies wird den Studierenden nicht angezeigt.&lt;br /&gt;
* Und zum Schluss kann man das Feedback für die Studierende für diese Einreichung schreiben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wichtiger Hinweispunkt:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Wenn bereits ein manuelles Feedback an einer Einreichung gesetzt wurde und ein neues an dieselbe Einreichung gesetzt wird, dann überschreibt das neue manuelle Feedback das alte. Die Studierenden sehen dann nur noch das zuletzt gesetzte manuelle Feedback an ihrer Einreichung!&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQLJavaChecker&amp;diff=8967</id>
		<title>GReQLJavaChecker</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQLJavaChecker&amp;diff=8967"/>
		<updated>2023-08-24T14:08:40Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der GReQLJavaChecker ermöglicht statische Checks auf Programmcode und verwendet dazu Abfragen auf dem Syntaxgraphen. Um einen statischen Check mit dem Checker durchzuführen, müssen die zu untersuchenden Dateien in der Liste &amp;quot;Source Files&amp;quot; ausgewählt werden und eine einzelne Datei mit Prüfregeln (&amp;quot;Rule File&amp;quot;) angegeben werden. Die Regeln werden in dieser Datei im XML-Format organisiert und verwenden die Sprache GReQL für Abfragen auf dem Syntaxbaum.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele und Eigenschaften von Regeln ===&lt;br /&gt;
Als erstes Element im XML Dokument muss &amp;lt;checkerrules&amp;gt; stehen, entsprechend muss &amp;lt;/checkerrules&amp;gt; als letztes Element in dem XML Dokument sein.&lt;br /&gt;
&lt;br /&gt;
Zwei beispielhafte Abfragen in dieser Sprache sehen so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{WhileStatement} with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
             (not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block}) and&lt;br /&gt;
             isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;In der Datei {name} besteht die while-Schleife in Zeile {line} nur aus einer&lt;br /&gt;
             Abbruchbedingung und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration} with&lt;br /&gt;
             t.name=&amp;quot;Miniprojekt2&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;public static String geometrie1(int)&amp;quot;)&lt;br /&gt;
          report 0 end&amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;public static String geometrie1(int laenge)&amp;quot; in&lt;br /&gt;
             der Klasse &amp;quot;Miniprojekt2&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die obere Regel ist vom Typ &amp;quot;absence&amp;quot;, d.h. sie definiert einen Codestruktur, die nicht in der untersuchten Lösung vorkommen soll. Als Abfrage wird eine Struktur aus Elementen des Syntaxbaums definiert. Als Meldung wird ein String definiert, der zur Fehlerliste hinzugefügt wird, wenn die in der Abfrage definierte Struktur gefunden wird. Dabei dienen {name} und {line} als Platzhalter für Werte, die in der Abfrage in der report-Klausel ausgegeben wurden. Die zweite Regel ist vom Typ &amp;quot;presence&amp;quot; und definiert folglich eine Codestruktur, die in der untersuchten Lösung vorkommen soll. D.h., in diesem Fall wird die definierte Fehlermeldung ausgegeben, wenn die in der Abfrage definierte Struktur nicht auftritt. Folglich können in dieser Regel auch keine Platzhalter in der Ausgabe verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasSignature&amp;lt;/code&amp;gt; ist eine spezielle, von JACK bereitgestellte Erweiterung der GReQL-Syntax, die eine bequeme Überprüfung von Methodensignaturen ermöglicht. Wie im Beispiel dargestellt, braucht die übergebene Zeichenkette keine vollständige Methodensignatur zu sein, sondern es reicht die Angabe der zu überprüfenden Bestandteile. D.h., Namen der Methodenparameter können ebenso entfallen wie Modifier oder der Rückgabetyp. Es ist allerdings nicht möglich, nur Modifier anzugeben und keinen Rückgabetyp.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;amp;rarr; Weitere Beispiele:&#039;&#039; [[GReQL Regeln]]&lt;br /&gt;
&lt;br /&gt;
=== Auswertung eines Regelsatzes ===&lt;br /&gt;
Bei der Durchführung des statischen Checks wird zunächst der abstrakte Syntaxgraph der abgegebenen Lösung erzeugt und anschließend alle Regeln angewendet. Alle erzeugten Fehlernachrichten werden als Ausgabe des statischen Tests gesammelt. Die vergebene Punktzahl ergibt sich aus den Punkten der einzelnen Regeln, wobei die Gesamtsumme der Punkte in der Regeldatei stets auf 100 normiert wird. D.h., im oben gezeigten Beispiel erhält eine korrekte Lösung 100 Punkte, während eine Lösung, die die erste Regel verletzt, nur 67 Punkte erhält. Tritt während des Checks ein technischer Fehler auf, wird der Check abgebrochen und die Lösung mit einem &amp;quot;internal error&amp;quot; als fehlerhaft markiert.&lt;br /&gt;
&lt;br /&gt;
=== Versionsunterschiede ===&lt;br /&gt;
Je nach eingesetzter Checker-Version müssen einige Abfragen zur Code-Struktur leicht unterschiedlich formuliert werden. Dies betrifft insbesondere die beiden Checker-Versionen, die in JACK 2 und JACK 3 zum Einsatz kommen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Art der Änderung !! Alt (insb. JACK 2) !! Neu (insb. JACK 3 und Moodle-Plugin)&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;TypeDeclarationBodyDeclarations2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;TypeDeclarationBodyDeclarations1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;TypeDeclarationSuperclassType2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;TypeDeclarationSuperclassType&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;ParameterizedTypeTypeArguments1&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;ParameterizedTypeTypeArguments2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ParameterizedTypeTypeArguments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;TypeDeclarationSuperInterfaceTypes1&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;TypeDeclarationSuperInterfaceTypes2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;TypeDeclarationSuperInterfaceTypes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erweiterte Funktion || Die Funktion &amp;lt;code&amp;gt;hasSignature&amp;lt;/code&amp;gt; kann nicht auf geworfene Exceptions prüfen || Die Prüfung ist möglich&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
[[Media:GReQL-Referencecard.pdf|GReQL-Referencecard]]&lt;br /&gt;
&lt;br /&gt;
[[category:Checker]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQLJavaChecker&amp;diff=8966</id>
		<title>GReQLJavaChecker</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQLJavaChecker&amp;diff=8966"/>
		<updated>2023-08-24T14:08:14Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: Kleine Ergänzung das checkerrules Element am Anfang stehen muss&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der GReQLJavaChecker ermöglicht statische Checks auf Programmcode und verwendet dazu Abfragen auf dem Syntaxgraphen. Um einen statischen Check mit dem Checker durchzuführen, müssen die zu untersuchenden Dateien in der Liste &amp;quot;Source Files&amp;quot; ausgewählt werden und eine einzelne Datei mit Prüfregeln (&amp;quot;Rule File&amp;quot;) angegeben werden. Die Regeln werden in dieser Datei im XML-Format organisiert und verwenden die Sprache GReQL für Abfragen auf dem Syntaxbaum.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele und Eigenschaften von Regeln ===&lt;br /&gt;
Als erstes Element im XML Dokument muss &amp;lt;checkerrules&amp;gt; stehen, entsprechend muss &amp;lt;/checkerrules&amp;gt; als letztes Element in dem XMl Dokument sein.&lt;br /&gt;
&lt;br /&gt;
Zwei beispielhafte Abfragen in dieser Sprache sehen so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{WhileStatement} with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
             (not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block}) and&lt;br /&gt;
             isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;In der Datei {name} besteht die while-Schleife in Zeile {line} nur aus einer&lt;br /&gt;
             Abbruchbedingung und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration} with&lt;br /&gt;
             t.name=&amp;quot;Miniprojekt2&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;public static String geometrie1(int)&amp;quot;)&lt;br /&gt;
          report 0 end&amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;public static String geometrie1(int laenge)&amp;quot; in&lt;br /&gt;
             der Klasse &amp;quot;Miniprojekt2&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die obere Regel ist vom Typ &amp;quot;absence&amp;quot;, d.h. sie definiert einen Codestruktur, die nicht in der untersuchten Lösung vorkommen soll. Als Abfrage wird eine Struktur aus Elementen des Syntaxbaums definiert. Als Meldung wird ein String definiert, der zur Fehlerliste hinzugefügt wird, wenn die in der Abfrage definierte Struktur gefunden wird. Dabei dienen {name} und {line} als Platzhalter für Werte, die in der Abfrage in der report-Klausel ausgegeben wurden. Die zweite Regel ist vom Typ &amp;quot;presence&amp;quot; und definiert folglich eine Codestruktur, die in der untersuchten Lösung vorkommen soll. D.h., in diesem Fall wird die definierte Fehlermeldung ausgegeben, wenn die in der Abfrage definierte Struktur nicht auftritt. Folglich können in dieser Regel auch keine Platzhalter in der Ausgabe verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;code&amp;gt;hasSignature&amp;lt;/code&amp;gt; ist eine spezielle, von JACK bereitgestellte Erweiterung der GReQL-Syntax, die eine bequeme Überprüfung von Methodensignaturen ermöglicht. Wie im Beispiel dargestellt, braucht die übergebene Zeichenkette keine vollständige Methodensignatur zu sein, sondern es reicht die Angabe der zu überprüfenden Bestandteile. D.h., Namen der Methodenparameter können ebenso entfallen wie Modifier oder der Rückgabetyp. Es ist allerdings nicht möglich, nur Modifier anzugeben und keinen Rückgabetyp.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;amp;rarr; Weitere Beispiele:&#039;&#039; [[GReQL Regeln]]&lt;br /&gt;
&lt;br /&gt;
=== Auswertung eines Regelsatzes ===&lt;br /&gt;
Bei der Durchführung des statischen Checks wird zunächst der abstrakte Syntaxgraph der abgegebenen Lösung erzeugt und anschließend alle Regeln angewendet. Alle erzeugten Fehlernachrichten werden als Ausgabe des statischen Tests gesammelt. Die vergebene Punktzahl ergibt sich aus den Punkten der einzelnen Regeln, wobei die Gesamtsumme der Punkte in der Regeldatei stets auf 100 normiert wird. D.h., im oben gezeigten Beispiel erhält eine korrekte Lösung 100 Punkte, während eine Lösung, die die erste Regel verletzt, nur 67 Punkte erhält. Tritt während des Checks ein technischer Fehler auf, wird der Check abgebrochen und die Lösung mit einem &amp;quot;internal error&amp;quot; als fehlerhaft markiert.&lt;br /&gt;
&lt;br /&gt;
=== Versionsunterschiede ===&lt;br /&gt;
Je nach eingesetzter Checker-Version müssen einige Abfragen zur Code-Struktur leicht unterschiedlich formuliert werden. Dies betrifft insbesondere die beiden Checker-Versionen, die in JACK 2 und JACK 3 zum Einsatz kommen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Art der Änderung !! Alt (insb. JACK 2) !! Neu (insb. JACK 3 und Moodle-Plugin)&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;TypeDeclarationBodyDeclarations2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;TypeDeclarationBodyDeclarations1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;TypeDeclarationSuperclassType2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;TypeDeclarationSuperclassType&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;ParameterizedTypeTypeArguments1&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;ParameterizedTypeTypeArguments2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ParameterizedTypeTypeArguments&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Geänderter Kantentyp || &amp;lt;code&amp;gt;TypeDeclarationSuperInterfaceTypes1&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;TypeDeclarationSuperInterfaceTypes2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;TypeDeclarationSuperInterfaceTypes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erweiterte Funktion || Die Funktion &amp;lt;code&amp;gt;hasSignature&amp;lt;/code&amp;gt; kann nicht auf geworfene Exceptions prüfen || Die Prüfung ist möglich&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
[[Media:GReQL-Referencecard.pdf|GReQL-Referencecard]]&lt;br /&gt;
&lt;br /&gt;
[[category:Checker]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=8965</id>
		<title>GReQL Regeln</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=8965"/>
		<updated>2023-08-24T13:55:59Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: Anpassung der Kantentypen auf JACK3 GReQL Regeln&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beispiele für statische Prüfregeln für Java-Code ==&lt;br /&gt;
=== Codestil ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             x.name=capitalizeFirst(x.name) and&lt;br /&gt;
             x.constructor=&amp;quot;false&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Methodennamen, die mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach groß geschriebenen Methodennamen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{TypeDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             not (x.name=capitalizeFirst(x.name))&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Klassennamen, die nicht mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach klein geschriebenen Klassennamen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{VariableDeclarationFragment}&lt;br /&gt;
          with&lt;br /&gt;
             x.name=capitalizeFirst(x.name) and&lt;br /&gt;
             isEmpty(from m : V{Modifier} with x &amp;amp;lt;--&amp;amp;amp;{FieldDeclaration} --&amp;gt; m and m.name=&amp;quot;final&amp;quot; report m end)&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
 &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Variablennamen, die mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach groß geschriebenen Variablennamen, wobei als &amp;quot;final&amp;quot; deklarierte Klassenvariablen ausgelassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Einfache Inhalte ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, s : V{StringLiteral}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             m --&amp;gt;{Child}* s and&lt;br /&gt;
             s.content = &amp;quot;\&amp;quot;Zeichenkette\&amp;quot;&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Deine Lösung verwendet nicht den String &amp;quot;Zeichenkette&amp;quot;.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht in der Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nach einem String-Literal mit einem vorgegebenen Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, s : V{StringLiteral}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             m --&amp;gt;{Child}* s and&lt;br /&gt;
             stringLength(s.content) &amp;gt; 4&lt;br /&gt;
          report s.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Du verwendest in Zeile {line} ein festes String-Literal. Ist deine Lösung allgemeingültig?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht in der Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nach einem String-Literal der Länge 4 oder länger (inklusive Anführungszeichen) und meldet es mit Angabe der Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from p : V{PackageDeclaration}&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Paketdefinition&amp;quot;&amp;gt;Deine Lösung beinhaltet eine package-Angabe. Bitte entferne diese.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Paketdefinitionen und meldet diese als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt; from p : V{ImportDeclaration}&lt;br /&gt;
          report 0 end&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;feedback prefix=&amp;quot;Importdefinition&amp;quot;&amp;gt; Deine Lösung beinhaltet eine import-Angabe. Bitte entferne diese.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Importdefinitionen und meldet diese als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{MethodInvocation}, y : V{SimpleName}&lt;br /&gt;
           with&lt;br /&gt;
              u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
              x.name=&amp;quot;exit&amp;quot; and&lt;br /&gt;
              y.name=&amp;quot;System&amp;quot;&lt;br /&gt;
           report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Der Aufruf von &amp;quot;System.exit()&amp;quot; in der Datei {name} in Zeile {line} ist nicht gestattet.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Aufrufen von &amp;lt;code&amp;gt;System.exit()&amp;lt;/code&amp;gt; und melde diese unter Angabe von Klasse und Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{MethodInvocation}, y, z : V{SimpleName}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt;{ElementExpression}&amp;amp;amp;{QualifiedName} --&amp;gt;{QualifiedNameName} y and&lt;br /&gt;
              x --&amp;gt;{ElementExpression}&amp;amp;amp;{QualifiedName} --&amp;gt;{QualifiedNameQualifier} z and&lt;br /&gt;
              (x.name=&amp;quot;print&amp;quot; or x.name=&amp;quot;println&amp;quot;) and&lt;br /&gt;
              y.name=&amp;quot;out&amp;quot; and z.name=&amp;quot;System&amp;quot;&lt;br /&gt;
           report x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;You have a print statement in line {line}. Are you sure you want to print to console instead of returning?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Aufrufen von &amp;lt;code&amp;gt;System.out.print()&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;System.out.println()&amp;lt;/code&amp;gt; und melde diese unter Angabe von Klasse und Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
=== Kontrollstrukturen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{WhileStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{DoStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{ForStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{EnhancedForStatement})&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Methode &amp;quot;m()&amp;quot; wird kein Schleifenkonstrukt verwendet.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; ein beliebiges Schleifenkonstrukt enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{IfStatement}&lt;br /&gt;
          with&lt;br /&gt;
             ( not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
               (not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{Block}) and isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
             ) and&lt;br /&gt;
             ( not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
               (not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Block}) and isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
             )&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} enthält das if-Statement in Zeile {line} in beiden Zweigen keinen Code und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer if-Anweisung, die nur leere Zweige enthält und meldet eine solche Anweisung als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{IfStatement}&lt;br /&gt;
          with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{EmptyStatement}) and&lt;br /&gt;
             isEmpty(x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Statement})&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} endet das if-Statement in Zeile {line} hinter der Bedingung sofort mit einem Semikolon. Die Bedingung ist dadurch wirkungslos und die folgende Anweisung wird immer ausgeführt.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer if-Anweisung, die keine Zweige enthält und meldet eine solche Anweisung als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{WhileStatement}&lt;br /&gt;
          with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
             (not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block}) and&lt;br /&gt;
             isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} besteht die while-Schleife in Zeile {line} nur aus einer Abbruchbedingung und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer while-Schleife, die nur aus einer Abbruchbedingung besteht und meldet eine solche Schleife als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, n : V{MethodDeclaration}&lt;br /&gt;
           with&lt;br /&gt;
              m (--&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access}&amp;amp;amp;{MethodDeclaration})* n and&lt;br /&gt;
              n --&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access} m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Rekursionscheck&amp;quot;&amp;gt; Die Methode &amp;quot;m()&amp;quot; enthält nicht die geforderte Rekursion.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; rekursiv arbeitet. Dabei ist es egal, ob sich die Methode direkt selber aufruft, oder über einen oder mehrere Zwischenschritte aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from m : V{MethodDeclaration}&lt;br /&gt;
           with&lt;br /&gt;
              m (--&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access}&amp;amp;amp;{MethodDeclaration}) m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Rekursionscheck&amp;quot;&amp;gt;Die Methode &amp;quot;m()&amp;quot; enthält nicht die geforderte Rekursion.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; rekursiv arbeitet und sich insbesondere ohne Zwischenschritte über andere Methoden selber wieder aufruft.&lt;br /&gt;
&lt;br /&gt;
=== Methoden ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations1} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;public static String method(int)&amp;quot;)&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;public static String method(int param)&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode mit einer bestimmten Signatur enthält, wobei der Name des Methodenparameters unerheblich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations1} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;int method()&amp;quot;) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}&amp;amp;amp;{Modifier})&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}, mo : V{Modifier}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations1} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;int method()&amp;quot;) and&lt;br /&gt;
             m --&amp;gt; mo and not (mo.name=&amp;quot;private&amp;quot;)&lt;br /&gt;
         report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;int method()&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt oder ist mit dem Modifier &amp;quot;private&amp;quot; versehen. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode mit einer bestimmten Signatur enthält, die nicht mit dem Modifier private versehen ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}, pt : V{ParameterizedType}, ptt : V{SimpleType}, pta : V{SimpleType}&lt;br /&gt;
           with&lt;br /&gt;
              t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              t --&amp;gt;{TypeDeclarationBodyDeclarations1} m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
              m --&amp;gt;{MethodDeclarationReturnType} pt and&lt;br /&gt;
              pt --&amp;gt;{ParameterizedTypeType} ptt and&lt;br /&gt;
              ptt.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
              pt --&amp;gt;{ParameterizedTypeTypeArguments} pta and&lt;br /&gt;
              pta.name=&amp;quot;C&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signatur&amp;quot;&amp;gt;Der Methode &amp;quot;public B&amp;amp;lt;C&amp;amp;gt; m()&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode m mit parametrisierten Rückgabetyp B&amp;lt;C&amp;gt; enthält.&lt;br /&gt;
&lt;br /&gt;
=== Vererbungshierarchie ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, st : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             st.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationSuperclassType} st&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A ist nicht als Unterklasse von B modelliert.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A direkte Unterklasse von Klasse B ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, st : V{SimpleType}&lt;br /&gt;
           with&lt;br /&gt;
              t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              t --&amp;gt;{TypeDeclarationSuperInterfaceTypes} st and&lt;br /&gt;
              st.name=&amp;quot;B&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A implementiert nicht das Interface B.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface B implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, pt : V{ParameterizedType}, ptt : V{SimpleType}, pta : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationSuperInterfaceTypes} pt and&lt;br /&gt;
             pt --&amp;gt;{ParameterizedTypeType} ptt and&lt;br /&gt;
             ptt.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
             pt --&amp;gt;{ParameterizedTypeTypeArguments} pta and&lt;br /&gt;
             pta.name=&amp;quot;C&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A implementiert nicht das Interface B&amp;amp;lt;C&amp;amp;gt;.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface B&amp;lt;C&amp;gt; implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, s : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             ((u --&amp;gt;{TypeDeclarationSuperclassType} s and s.name=&amp;quot;Thread&amp;quot;) or&lt;br /&gt;
             (u --&amp;gt;{TypeDeclarationSuperInterfaceTypes} s and s.name=&amp;quot;Runnable&amp;quot;)) and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte entweder das Interface &amp;quot;Runnable&amp;quot; implementieren oder von &amp;quot;Thread&amp;quot; erben.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface Runnable implementiert oder von Thread erbt.&lt;br /&gt;
&lt;br /&gt;
=== Aufrufbeziehungen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, x : V{MethodInvocation}, y : V{SimpleName}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             x.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             y.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte &amp;quot;B.m()&amp;quot; aufgerufen werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode B.m aufruft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, x : V{MethodInvocation}, y : V{SimpleName}, z : V{VariableDeclarationStatement}, f : V{VariableDeclarationFragment}, t : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
             u --&amp;gt;* z --&amp;gt;{VariableDeclarationStatementType} t and&lt;br /&gt;
             u --&amp;gt;* z --&amp;gt;{VariableDeclarationStatementFragments} f and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             x.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             y.name=f.name and&lt;br /&gt;
             t.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte &amp;quot;m()&amp;quot; auf einem Objekt vom Typ &amp;quot;B&amp;quot; aufgerufen werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A Methode m auf einem Objekt vom Typ B aufruft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, m : V{MethodDeclaration}, x : V{ClassInstanceCreation}, t : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;{Child}* m --&amp;gt;* x --&amp;gt;{ClassInstanceCreationType} t and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             t.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; muss in Methode m() mindestens eine Instanz von &amp;quot;B&amp;quot; erzeugt werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A in Methode m eine Instanz von Klasse B erstellt.&lt;br /&gt;
&lt;br /&gt;
== Beispiele für statische Prüfregeln für UML-Modelle im XMI2-Format ==&lt;br /&gt;
=== Klassendiagramme ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;11&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x,y : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt; V{Property} --&amp;gt; V{Association} &amp;amp;lt;-- V{Property} &amp;amp;lt;-- y and&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;B&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm enthält keine Beziehung zwischen einem &amp;quot;A&amp;quot; und einem &amp;quot;B&amp;quot; oder keine Klassen mit diesen Namen.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell zwei Klassen &amp;quot;A&amp;quot; und &amp;quot;B&amp;quot; enthält, die über eine Assoziation verbunden sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x,y : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt; V{Property} --&amp;gt; V{Association} &amp;amp;lt;-- V{Property} &amp;amp;lt;-- y and&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;B&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback prefix=&amp;quot;Hinweis&amp;quot;&amp;gt;Im Diagramm sind die &amp;quot;B&amp;quot; eines &amp;quot;A&amp;quot; als eigene Klasse abgebildet. Das kannst du durch eine bessere Modellierung vermeiden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft ebenfalls, ob das Modell zwei Klassen &amp;quot;A&amp;quot; und &amp;quot;B&amp;quot; enthält, die über eine Assoziation verbunden sind, definiert dies aber als unerwünschte Situation mit entsprechendem Feedback.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;11&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x,y : V{Class}, z: V{Property}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt; z and&lt;br /&gt;
              z --&amp;gt; V{Association} &amp;amp;lt;-- V{Property} &amp;amp;lt;-- y and&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
              isDefined(z.lower) and z.lower=&amp;quot;1&amp;quot; and (not isDefined(z.upper) or z.upper=&amp;quot;1&amp;quot;)&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm enthält keine Beziehung zwischen einem &amp;quot;A&amp;quot; und einem &amp;quot;B&amp;quot; mit der Kardinalität 1 oder keine Klassen mit diesen Namen.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell zwei Klassen &amp;quot;A&amp;quot; und &amp;quot;B&amp;quot; enthält, die über eine Assoziation mit Kardinalität 1 (jedes A kennt genau ein B) verbunden sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from a,b : V{Class}, p: V{Property}&lt;br /&gt;
           with&lt;br /&gt;
              isEmpty(a --&amp;gt;&amp;amp;amp;{Property} --&amp;gt;&amp;amp;amp;{Association}) and&lt;br /&gt;
              b --&amp;gt; p and&lt;br /&gt;
              isDefined(p.aggregation) and p.aggregation=&amp;quot;composite&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Es sollte im Diagramm zwei Klassen geben, bei denen die eine keine weiteren Bestandteile hat, während die andere weitere Bestandteile gemäß der Komposition hat.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob es im Modell eine Klasse ohne ausgehende Assoziationen gibt und eine weitere, die mindestens eine ausgehende Komposition hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{Class}, y : V{Property}, z : V{PrimitiveType}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              x --&amp;gt; y and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;b&amp;quot; and&lt;br /&gt;
              y --&amp;gt; z and&lt;br /&gt;
              isDefined(z.name) and z.name=&amp;quot;String&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Ein &amp;quot;A&amp;quot; soll ein Attribut für die Eigenschaft &amp;quot;b&amp;quot; bereitstellen.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob es im Modell eine Klasse &amp;quot;A&amp;quot; mit dem Attribut &amp;quot;b&amp;quot; vom Typ &amp;quot;String&amp;quot; gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{Class}, y : V{Operation}, z: V{Parameter}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              x --&amp;gt; y and&lt;br /&gt;
              isDefined(y.name) and stringLevenshteinDistance(y.name, &amp;quot;ausführen&amp;quot;)&amp;amp;lt;3 and&lt;br /&gt;
              y --&amp;gt; z&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Ein &amp;quot;A&amp;quot; soll eine Methode bereitstellen, mit der sie etwas ausführen kann.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel prüft, ob es im Modell eine Klasse &amp;quot;A&amp;quot; mit einer Operation gibt, deren Name &amp;quot;ausführen&amp;quot; oder ähnlich lautet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;let c := count(from y : V{Operation} with isDefined(y.name) report y end) in&lt;br /&gt;
              from x : set(1)&lt;br /&gt;
              with&lt;br /&gt;
                 c&amp;amp;lt;&amp;gt;7&lt;br /&gt;
              report c as &amp;quot;count&amp;quot; end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm sollte genau 7 Methoden enthalten, enthält aber {count}.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell genau 7 Methoden enthält und gibt im Falle einer anderen Anzahl diese im Feedback mit aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(x.name) and x.name=A&amp;quot; and&lt;br /&gt;
              x.isAbstract and&lt;br /&gt;
              not isEmpty(x &amp;amp;lt;--&amp;amp;amp;{Generalization})&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm sollte eine abstrakte Klasse &amp;quot;A&amp;quot; enthalten, von der mindestens eine Klasse erbt.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell eine abstrakte Klasse &amp;quot;A&amp;quot; enthält, auf die in mindestens einer Generalisierung verwiesen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from a,b,c,d : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(a.name) and a.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(b.name) and b.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
              isDefined(c.name) and c.name=&amp;quot;C&amp;quot; and&lt;br /&gt;
              isDefined(d.name) and d.name=&amp;quot;D&amp;quot; and&lt;br /&gt;
              a --&amp;gt; V{Generalization} --&amp;gt; d and&lt;br /&gt;
              b --&amp;gt; V{Generalization} --&amp;gt; d and&lt;br /&gt;
              c --&amp;gt; V{Generalization} --&amp;gt; d&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm sollte Klassen &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot; und &amp;quot;C&amp;quot; enthalten, die von einer gemeinsamen Oberklasse &amp;quot;D&amp;quot; erben.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell eine Klasse &amp;quot;D&amp;quot; enthält, die drei direkte Unterklassen &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot; und &amp;quot;C&amp;quot; hat.&lt;br /&gt;
&lt;br /&gt;
== Beispiele für statische Prüfregeln für EPML ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Event}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          isEmpty(x &amp;amp;lt;--)&lt;br /&gt;
  	       report 0 end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundelemente&amp;quot;&amp;gt;Es gibt kein Startevent.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob der gegebene Graph kein Startevent hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt; from x,y: V{Event}&lt;br /&gt;
  		with&lt;br /&gt;
  		   isEmpty(x &amp;amp;lt;--) and&lt;br /&gt;
  		   isEmpty(y &amp;amp;lt;--) and&lt;br /&gt;
  		   not (x=y)&lt;br /&gt;
  		report 0 end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundelemente&amp;quot;&amp;gt;Es gibt mehr als ein Startevent.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob der gegebene Graph mehr als ein Startevent hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt; from x,y: V{Element, ^Connector}&lt;br /&gt;
  		with&lt;br /&gt;
  		   not (x.name=&amp;quot;&amp;quot;) and&lt;br /&gt;
  		   x.name = y.name and&lt;br /&gt;
  		   not (x = y)&lt;br /&gt;
  		report x.name as &amp;quot;name&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Anmerkung zur Namensgebung&amp;quot;&amp;gt;Es gibt mindestens zwei Elemente mit demselben Namen (&amp;quot;{name}&amp;quot;).&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob es der Graph Elemente mit demselben Namen besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Element, ^Connector}, y1, y2 : V{Element}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          x --&amp;gt; y1 and&lt;br /&gt;
  	          x --&amp;gt; y2 and&lt;br /&gt;
  	          not (y1=y2)&lt;br /&gt;
  	       report x.name as &amp;quot;xName&amp;quot;, x.id as &amp;quot;xID&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundstruktur&amp;quot;&amp;gt;Das Element &amp;quot;{xName}&amp;quot; (ID {xID}) hat mehr als einen Ausgang.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob ein Event oder Funktion mehr als einen Ausgang hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Connector}, y: V{Connector}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          not (x.name=&amp;quot;&amp;quot;) and&lt;br /&gt;
  	          not (y.name=&amp;quot;&amp;quot;) and&lt;br /&gt;
  	          x --&amp;gt; y&lt;br /&gt;
  	       report x.name as &amp;quot;xName&amp;quot;, y.name as &amp;quot;yName&amp;quot;, x.id as &amp;quot;xID&amp;quot;, y.id as &amp;quot;yID&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundstruktur&amp;quot;&amp;gt;Es dürfen keine zwei Konnektoren direkt aufeinander folgen. Es folgt jedoch &amp;quot;{yName}&amp;quot; (ID {yID}) direkt auf &amp;quot;{xName}&amp;quot; (ID {xID}).&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob 2 Konnektoren aufeinander folgen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Element, ^Connector}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          contains(x.name, &amp;quot; and &amp;quot;) or&lt;br /&gt;
  	          contains(x.name, &amp;quot;+&amp;quot;) or&lt;br /&gt;
  	          contains(x.name, &amp;quot; und &amp;quot;)&lt;br /&gt;
  	       report x.name as &amp;quot;name&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Anmerkung zur Namensgebung&amp;quot;&amp;gt;Der Name &amp;quot;{name}&amp;quot; sieht danach aus, als wenn hier zwei Events bzw. Funktionen in einem Element zusammengefasst wurden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob der Graph möglicherweise Zeichen bzw. Wörter besitzt die mehrere Funktionen/Events in einem Element verbinden.&lt;br /&gt;
&lt;br /&gt;
[[Category:R-GReQL]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=8964</id>
		<title>GReQL Regeln</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=8964"/>
		<updated>2023-08-24T13:45:10Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Methoden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beispiele für statische Prüfregeln für Java-Code ==&lt;br /&gt;
=== Codestil ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             x.name=capitalizeFirst(x.name) and&lt;br /&gt;
             x.constructor=&amp;quot;false&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Methodennamen, die mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach groß geschriebenen Methodennamen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{TypeDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             not (x.name=capitalizeFirst(x.name))&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Klassennamen, die nicht mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach klein geschriebenen Klassennamen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{VariableDeclarationFragment}&lt;br /&gt;
          with&lt;br /&gt;
             x.name=capitalizeFirst(x.name) and&lt;br /&gt;
             isEmpty(from m : V{Modifier} with x &amp;amp;lt;--&amp;amp;amp;{FieldDeclaration} --&amp;gt; m and m.name=&amp;quot;final&amp;quot; report m end)&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
 &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Variablennamen, die mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach groß geschriebenen Variablennamen, wobei als &amp;quot;final&amp;quot; deklarierte Klassenvariablen ausgelassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Einfache Inhalte ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, s : V{StringLiteral}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             m --&amp;gt;{Child}* s and&lt;br /&gt;
             s.content = &amp;quot;\&amp;quot;Zeichenkette\&amp;quot;&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Deine Lösung verwendet nicht den String &amp;quot;Zeichenkette&amp;quot;.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht in der Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nach einem String-Literal mit einem vorgegebenen Inhalt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, s : V{StringLiteral}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             m --&amp;gt;{Child}* s and&lt;br /&gt;
             stringLength(s.content) &amp;gt; 4&lt;br /&gt;
          report s.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Du verwendest in Zeile {line} ein festes String-Literal. Ist deine Lösung allgemeingültig?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht in der Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nach einem String-Literal der Länge 4 oder länger (inklusive Anführungszeichen) und meldet es mit Angabe der Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from p : V{PackageDeclaration}&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Paketdefinition&amp;quot;&amp;gt;Deine Lösung beinhaltet eine package-Angabe. Bitte entferne diese.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Paketdefinitionen und meldet diese als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt; from p : V{ImportDeclaration}&lt;br /&gt;
          report 0 end&lt;br /&gt;
  &amp;lt;/query&amp;gt;&lt;br /&gt;
  &amp;lt;feedback prefix=&amp;quot;Importdefinition&amp;quot;&amp;gt; Deine Lösung beinhaltet eine import-Angabe. Bitte entferne diese.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Importdefinitionen und meldet diese als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{MethodInvocation}, y : V{SimpleName}&lt;br /&gt;
           with&lt;br /&gt;
              u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
              x.name=&amp;quot;exit&amp;quot; and&lt;br /&gt;
              y.name=&amp;quot;System&amp;quot;&lt;br /&gt;
           report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Der Aufruf von &amp;quot;System.exit()&amp;quot; in der Datei {name} in Zeile {line} ist nicht gestattet.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Aufrufen von &amp;lt;code&amp;gt;System.exit()&amp;lt;/code&amp;gt; und melde diese unter Angabe von Klasse und Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{MethodInvocation}, y, z : V{SimpleName}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt;{ElementExpression}&amp;amp;amp;{QualifiedName} --&amp;gt;{QualifiedNameName} y and&lt;br /&gt;
              x --&amp;gt;{ElementExpression}&amp;amp;amp;{QualifiedName} --&amp;gt;{QualifiedNameQualifier} z and&lt;br /&gt;
              (x.name=&amp;quot;print&amp;quot; or x.name=&amp;quot;println&amp;quot;) and&lt;br /&gt;
              y.name=&amp;quot;out&amp;quot; and z.name=&amp;quot;System&amp;quot;&lt;br /&gt;
           report x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;You have a print statement in line {line}. Are you sure you want to print to console instead of returning?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Aufrufen von &amp;lt;code&amp;gt;System.out.print()&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;System.out.println()&amp;lt;/code&amp;gt; und melde diese unter Angabe von Klasse und Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
=== Kontrollstrukturen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{WhileStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{DoStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{ForStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{EnhancedForStatement})&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Methode &amp;quot;m()&amp;quot; wird kein Schleifenkonstrukt verwendet.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; ein beliebiges Schleifenkonstrukt enthält.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{IfStatement}&lt;br /&gt;
          with&lt;br /&gt;
             ( not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
               (not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{Block}) and isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
             ) and&lt;br /&gt;
             ( not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
               (not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Block}) and isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
             )&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} enthält das if-Statement in Zeile {line} in beiden Zweigen keinen Code und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer if-Anweisung, die nur leere Zweige enthält und meldet eine solche Anweisung als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{IfStatement}&lt;br /&gt;
          with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{EmptyStatement}) and&lt;br /&gt;
             isEmpty(x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Statement})&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} endet das if-Statement in Zeile {line} hinter der Bedingung sofort mit einem Semikolon. Die Bedingung ist dadurch wirkungslos und die folgende Anweisung wird immer ausgeführt.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer if-Anweisung, die keine Zweige enthält und meldet eine solche Anweisung als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{WhileStatement}&lt;br /&gt;
          with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
             (not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block}) and&lt;br /&gt;
             isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} besteht die while-Schleife in Zeile {line} nur aus einer Abbruchbedingung und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer while-Schleife, die nur aus einer Abbruchbedingung besteht und meldet eine solche Schleife als Fehler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, n : V{MethodDeclaration}&lt;br /&gt;
           with&lt;br /&gt;
              m (--&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access}&amp;amp;amp;{MethodDeclaration})* n and&lt;br /&gt;
              n --&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access} m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Rekursionscheck&amp;quot;&amp;gt; Die Methode &amp;quot;m()&amp;quot; enthält nicht die geforderte Rekursion.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; rekursiv arbeitet. Dabei ist es egal, ob sich die Methode direkt selber aufruft, oder über einen oder mehrere Zwischenschritte aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from m : V{MethodDeclaration}&lt;br /&gt;
           with&lt;br /&gt;
              m (--&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access}&amp;amp;amp;{MethodDeclaration}) m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Rekursionscheck&amp;quot;&amp;gt;Die Methode &amp;quot;m()&amp;quot; enthält nicht die geforderte Rekursion.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; rekursiv arbeitet und sich insbesondere ohne Zwischenschritte über andere Methoden selber wieder aufruft.&lt;br /&gt;
&lt;br /&gt;
=== Methoden ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations1} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;public static String method(int)&amp;quot;)&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;public static String method(int param)&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode mit einer bestimmten Signatur enthält, wobei der Name des Methodenparameters unerheblich ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;int method()&amp;quot;) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}&amp;amp;amp;{Modifier})&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}, mo : V{Modifier}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;int method()&amp;quot;) and&lt;br /&gt;
             m --&amp;gt; mo and not (mo.name=&amp;quot;private&amp;quot;)&lt;br /&gt;
         report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;int method()&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt oder ist mit dem Modifier &amp;quot;private&amp;quot; versehen. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode mit einer bestimmten Signatur enthält, die nicht mit dem Modifier private versehen ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}, pt : V{ParameterizedType}, ptt : V{SimpleType}, pta : V{SimpleType}&lt;br /&gt;
           with&lt;br /&gt;
              t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
              m --&amp;gt;{MethodDeclarationReturnType} pt and&lt;br /&gt;
              pt --&amp;gt;{ParameterizedTypeType} ptt and&lt;br /&gt;
              ptt.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
              pt --&amp;gt;{ParameterizedTypeTypeArguments1} pta and&lt;br /&gt;
              pta.name=&amp;quot;C&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signatur&amp;quot;&amp;gt;Der Methode &amp;quot;public B&amp;amp;lt;C&amp;amp;gt; m()&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode m mit parametrisierten Rückgabetyp B&amp;lt;C&amp;gt; enthält.&lt;br /&gt;
&lt;br /&gt;
=== Vererbungshierarchie ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, st : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             st.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationSuperclassType2} st&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A ist nicht als Unterklasse von B modelliert.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A direkte Unterklasse von Klasse B ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, st : V{SimpleType}&lt;br /&gt;
           with&lt;br /&gt;
              t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              t --&amp;gt;{TypeDeclarationSuperInterfaceTypes2} st and&lt;br /&gt;
              st.name=&amp;quot;B&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A implementiert nicht das Interface B.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface B implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, pt : V{ParameterizedType}, ptt : V{SimpleType}, pta : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationSuperInterfaceTypes1} pt and&lt;br /&gt;
             pt --&amp;gt;{ParameterizedTypeType} ptt and&lt;br /&gt;
             ptt.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
             pt --&amp;gt;{ParameterizedTypeTypeArguments1} pta and&lt;br /&gt;
             pta.name=&amp;quot;C&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A implementiert nicht das Interface B&amp;amp;lt;C&amp;amp;gt;.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface B&amp;lt;C&amp;gt; implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, s : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             ((u --&amp;gt;{TypeDeclarationSuperclassType2} s and s.name=&amp;quot;Thread&amp;quot;) or&lt;br /&gt;
             (u --&amp;gt;{TypeDeclarationSuperInterfaceTypes2} s and s.name=&amp;quot;Runnable&amp;quot;)) and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte entweder das Interface &amp;quot;Runnable&amp;quot; implementieren oder von &amp;quot;Thread&amp;quot; erben.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface Runnable implementiert oder von Thread erbt.&lt;br /&gt;
&lt;br /&gt;
=== Aufrufbeziehungen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, x : V{MethodInvocation}, y : V{SimpleName}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             x.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             y.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte &amp;quot;B.m()&amp;quot; aufgerufen werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode B.m aufruft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, x : V{MethodInvocation}, y : V{SimpleName}, z : V{VariableDeclarationStatement}, f : V{VariableDeclarationFragment}, t : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
             u --&amp;gt;* z --&amp;gt;{VariableDeclarationStatementType} t and&lt;br /&gt;
             u --&amp;gt;* z --&amp;gt;{VariableDeclarationStatementFragments} f and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             x.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             y.name=f.name and&lt;br /&gt;
             t.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte &amp;quot;m()&amp;quot; auf einem Objekt vom Typ &amp;quot;B&amp;quot; aufgerufen werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A Methode m auf einem Objekt vom Typ B aufruft.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, m : V{MethodDeclaration}, x : V{ClassInstanceCreation}, t : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;{Child}* m --&amp;gt;* x --&amp;gt;{ClassInstanceCreationType} t and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             t.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; muss in Methode m() mindestens eine Instanz von &amp;quot;B&amp;quot; erzeugt werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A in Methode m eine Instanz von Klasse B erstellt.&lt;br /&gt;
&lt;br /&gt;
== Beispiele für statische Prüfregeln für UML-Modelle im XMI2-Format ==&lt;br /&gt;
=== Klassendiagramme ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;11&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x,y : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt; V{Property} --&amp;gt; V{Association} &amp;amp;lt;-- V{Property} &amp;amp;lt;-- y and&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;B&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm enthält keine Beziehung zwischen einem &amp;quot;A&amp;quot; und einem &amp;quot;B&amp;quot; oder keine Klassen mit diesen Namen.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell zwei Klassen &amp;quot;A&amp;quot; und &amp;quot;B&amp;quot; enthält, die über eine Assoziation verbunden sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x,y : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt; V{Property} --&amp;gt; V{Association} &amp;amp;lt;-- V{Property} &amp;amp;lt;-- y and&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;B&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback prefix=&amp;quot;Hinweis&amp;quot;&amp;gt;Im Diagramm sind die &amp;quot;B&amp;quot; eines &amp;quot;A&amp;quot; als eigene Klasse abgebildet. Das kannst du durch eine bessere Modellierung vermeiden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft ebenfalls, ob das Modell zwei Klassen &amp;quot;A&amp;quot; und &amp;quot;B&amp;quot; enthält, die über eine Assoziation verbunden sind, definiert dies aber als unerwünschte Situation mit entsprechendem Feedback.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;11&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x,y : V{Class}, z: V{Property}&lt;br /&gt;
           with&lt;br /&gt;
              x --&amp;gt; z and&lt;br /&gt;
              z --&amp;gt; V{Association} &amp;amp;lt;-- V{Property} &amp;amp;lt;-- y and&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
              isDefined(z.lower) and z.lower=&amp;quot;1&amp;quot; and (not isDefined(z.upper) or z.upper=&amp;quot;1&amp;quot;)&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm enthält keine Beziehung zwischen einem &amp;quot;A&amp;quot; und einem &amp;quot;B&amp;quot; mit der Kardinalität 1 oder keine Klassen mit diesen Namen.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell zwei Klassen &amp;quot;A&amp;quot; und &amp;quot;B&amp;quot; enthält, die über eine Assoziation mit Kardinalität 1 (jedes A kennt genau ein B) verbunden sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from a,b : V{Class}, p: V{Property}&lt;br /&gt;
           with&lt;br /&gt;
              isEmpty(a --&amp;gt;&amp;amp;amp;{Property} --&amp;gt;&amp;amp;amp;{Association}) and&lt;br /&gt;
              b --&amp;gt; p and&lt;br /&gt;
              isDefined(p.aggregation) and p.aggregation=&amp;quot;composite&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Es sollte im Diagramm zwei Klassen geben, bei denen die eine keine weiteren Bestandteile hat, während die andere weitere Bestandteile gemäß der Komposition hat.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob es im Modell eine Klasse ohne ausgehende Assoziationen gibt und eine weitere, die mindestens eine ausgehende Komposition hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{Class}, y : V{Property}, z : V{PrimitiveType}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              x --&amp;gt; y and&lt;br /&gt;
              isDefined(y.name) and y.name=&amp;quot;b&amp;quot; and&lt;br /&gt;
              y --&amp;gt; z and&lt;br /&gt;
              isDefined(z.name) and z.name=&amp;quot;String&amp;quot;&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Ein &amp;quot;A&amp;quot; soll ein Attribut für die Eigenschaft &amp;quot;b&amp;quot; bereitstellen.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob es im Modell eine Klasse &amp;quot;A&amp;quot; mit dem Attribut &amp;quot;b&amp;quot; vom Typ &amp;quot;String&amp;quot; gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{Class}, y : V{Operation}, z: V{Parameter}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(x.name) and x.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              x --&amp;gt; y and&lt;br /&gt;
              isDefined(y.name) and stringLevenshteinDistance(y.name, &amp;quot;ausführen&amp;quot;)&amp;amp;lt;3 and&lt;br /&gt;
              y --&amp;gt; z&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Ein &amp;quot;A&amp;quot; soll eine Methode bereitstellen, mit der sie etwas ausführen kann.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel prüft, ob es im Modell eine Klasse &amp;quot;A&amp;quot; mit einer Operation gibt, deren Name &amp;quot;ausführen&amp;quot; oder ähnlich lautet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;let c := count(from y : V{Operation} with isDefined(y.name) report y end) in&lt;br /&gt;
              from x : set(1)&lt;br /&gt;
              with&lt;br /&gt;
                 c&amp;amp;lt;&amp;gt;7&lt;br /&gt;
              report c as &amp;quot;count&amp;quot; end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm sollte genau 7 Methoden enthalten, enthält aber {count}.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell genau 7 Methoden enthält und gibt im Falle einer anderen Anzahl diese im Feedback mit aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from x : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(x.name) and x.name=A&amp;quot; and&lt;br /&gt;
              x.isAbstract and&lt;br /&gt;
              not isEmpty(x &amp;amp;lt;--&amp;amp;amp;{Generalization})&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm sollte eine abstrakte Klasse &amp;quot;A&amp;quot; enthalten, von der mindestens eine Klasse erbt.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell eine abstrakte Klasse &amp;quot;A&amp;quot; enthält, auf die in mindestens einer Generalisierung verwiesen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from a,b,c,d : V{Class}&lt;br /&gt;
           with&lt;br /&gt;
              isDefined(a.name) and a.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              isDefined(b.name) and b.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
              isDefined(c.name) and c.name=&amp;quot;C&amp;quot; and&lt;br /&gt;
              isDefined(d.name) and d.name=&amp;quot;D&amp;quot; and&lt;br /&gt;
              a --&amp;gt; V{Generalization} --&amp;gt; d and&lt;br /&gt;
              b --&amp;gt; V{Generalization} --&amp;gt; d and&lt;br /&gt;
              c --&amp;gt; V{Generalization} --&amp;gt; d&lt;br /&gt;
           report 1 end&lt;br /&gt;
    &amp;lt;/query&amp;gt;&lt;br /&gt;
    &amp;lt;feedback&amp;gt;Das Diagramm sollte Klassen &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot; und &amp;quot;C&amp;quot; enthalten, die von einer gemeinsamen Oberklasse &amp;quot;D&amp;quot; erben.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob das Modell eine Klasse &amp;quot;D&amp;quot; enthält, die drei direkte Unterklassen &amp;quot;A&amp;quot;, &amp;quot;B&amp;quot; und &amp;quot;C&amp;quot; hat.&lt;br /&gt;
&lt;br /&gt;
== Beispiele für statische Prüfregeln für EPML ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Event}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          isEmpty(x &amp;amp;lt;--)&lt;br /&gt;
  	       report 0 end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundelemente&amp;quot;&amp;gt;Es gibt kein Startevent.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob der gegebene Graph kein Startevent hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt; from x,y: V{Event}&lt;br /&gt;
  		with&lt;br /&gt;
  		   isEmpty(x &amp;amp;lt;--) and&lt;br /&gt;
  		   isEmpty(y &amp;amp;lt;--) and&lt;br /&gt;
  		   not (x=y)&lt;br /&gt;
  		report 0 end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundelemente&amp;quot;&amp;gt;Es gibt mehr als ein Startevent.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob der gegebene Graph mehr als ein Startevent hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt; from x,y: V{Element, ^Connector}&lt;br /&gt;
  		with&lt;br /&gt;
  		   not (x.name=&amp;quot;&amp;quot;) and&lt;br /&gt;
  		   x.name = y.name and&lt;br /&gt;
  		   not (x = y)&lt;br /&gt;
  		report x.name as &amp;quot;name&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Anmerkung zur Namensgebung&amp;quot;&amp;gt;Es gibt mindestens zwei Elemente mit demselben Namen (&amp;quot;{name}&amp;quot;).&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob es der Graph Elemente mit demselben Namen besitzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Element, ^Connector}, y1, y2 : V{Element}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          x --&amp;gt; y1 and&lt;br /&gt;
  	          x --&amp;gt; y2 and&lt;br /&gt;
  	          not (y1=y2)&lt;br /&gt;
  	       report x.name as &amp;quot;xName&amp;quot;, x.id as &amp;quot;xID&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundstruktur&amp;quot;&amp;gt;Das Element &amp;quot;{xName}&amp;quot; (ID {xID}) hat mehr als einen Ausgang.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob ein Event oder Funktion mehr als einen Ausgang hat.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Connector}, y: V{Connector}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          not (x.name=&amp;quot;&amp;quot;) and&lt;br /&gt;
  	          not (y.name=&amp;quot;&amp;quot;) and&lt;br /&gt;
  	          x --&amp;gt; y&lt;br /&gt;
  	       report x.name as &amp;quot;xName&amp;quot;, y.name as &amp;quot;yName&amp;quot;, x.id as &amp;quot;xID&amp;quot;, y.id as &amp;quot;yID&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Fehlerhafte Grundstruktur&amp;quot;&amp;gt;Es dürfen keine zwei Konnektoren direkt aufeinander folgen. Es folgt jedoch &amp;quot;{yName}&amp;quot; (ID {yID}) direkt auf &amp;quot;{xName}&amp;quot; (ID {xID}).&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob 2 Konnektoren aufeinander folgen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
  &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
  	&amp;lt;query&amp;gt;from x: V{Element, ^Connector}&lt;br /&gt;
  	       with&lt;br /&gt;
  	          contains(x.name, &amp;quot; and &amp;quot;) or&lt;br /&gt;
  	          contains(x.name, &amp;quot;+&amp;quot;) or&lt;br /&gt;
  	          contains(x.name, &amp;quot; und &amp;quot;)&lt;br /&gt;
  	       report x.name as &amp;quot;name&amp;quot; end&lt;br /&gt;
  	&amp;lt;/query&amp;gt;&lt;br /&gt;
  	&amp;lt;feedback prefix=&amp;quot;Anmerkung zur Namensgebung&amp;quot;&amp;gt;Der Name &amp;quot;{name}&amp;quot; sieht danach aus, als wenn hier zwei Events bzw. Funktionen in einem Element zusammengefasst wurden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
  &amp;lt;/rule&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Diese Regel testet, ob der Graph möglicherweise Zeichen bzw. Wörter besitzt die mehrere Funktionen/Events in einem Element verbinden.&lt;br /&gt;
&lt;br /&gt;
[[Category:R-GReQL]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Kursangebot_(Studierendensicht)&amp;diff=5301</id>
		<title>Kursangebot (Studierendensicht)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Kursangebot_(Studierendensicht)&amp;diff=5301"/>
		<updated>2019-10-04T09:58:47Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vorlage:Warnung|Warnung=Diese Seite beschreibt die Kursanmelung im JACK3 System. JACK3 ist derzeit noch in Entwicklung und noch nicht für die Benutzung freigegeben.}}&lt;br /&gt;
&lt;br /&gt;
[[category:JACK3]][[category:Anleitung]]&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5177</id>
		<title>JACK3</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5177"/>
		<updated>2019-09-27T12:17:07Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JACK 3 ist die neuste Version des JACK Systems welches sich derzeit noch in Entwicklung befindet. Von dieser Seite aus wird auf die künftigen Funktionen des JACK 3 Systems verlinkt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JACK 3 Funktionen für Lehrende&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[JACK3:Anmeldung|Anmeldung JACK 3]]&lt;br /&gt;
* [[JACK3:Übersicht|Übersicht JACK 3]]&lt;br /&gt;
* Aufgaben erstellen&lt;br /&gt;
** Aufgabenordner&lt;br /&gt;
** Allgemeine Aufgaben Funktionen&lt;br /&gt;
** Hinweise&lt;br /&gt;
** Mehrstufige Aufgabe&lt;br /&gt;
** Multiple Choice Aufgabe&lt;br /&gt;
** Fill-In Aufgabe&lt;br /&gt;
** Variablen &lt;br /&gt;
* Aufgabenbearbeitung einsehen&lt;br /&gt;
* Kurs &lt;br /&gt;
* Kursangebot &lt;br /&gt;
* Kursanmeldung &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JACK 3 Funktionen für Lernende&#039;&#039;&#039;&lt;br /&gt;
* [[JACK3:Anmeldung|Anmeldung JACK 3]]&lt;br /&gt;
* Kurs auswählen&lt;br /&gt;
* Aufgabe bearbeiten&lt;br /&gt;
** Multiple Choice Aufgabe&lt;br /&gt;
** Fill-In Aufgabe&lt;br /&gt;
** Formulareditor&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5165</id>
		<title>JACK3</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5165"/>
		<updated>2019-09-26T14:39:48Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JACK 3 ist die neuste Version des JACK Systems welches sich derzeit noch in Entwicklung befindet. Von dieser Seite aus wird auf die künftigen Funktionen des JACK 3 Systems verlinkt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JACK 3 Funktionen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[JACK3:Anmeldung|Anmeldung JACK 3]]&lt;br /&gt;
* [[JACK3:Übersicht|Übersicht JACK 3]]&lt;br /&gt;
* Inhalte erstellen&lt;br /&gt;
** Ordner&lt;br /&gt;
** Eine Aufgabe erstellen&lt;br /&gt;
** Multiple Choice Aufgabe&lt;br /&gt;
** Fill-In Aufgabe&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5162</id>
		<title>JACK3</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5162"/>
		<updated>2019-09-26T14:05:14Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JACK 3 ist die neuste Version des JACK Systems welches sich derzeit noch in Entwicklung befindet. Von dieser Seite aus wird auf die künftigen Funktionen des JACK 3 Systems verlinkt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JACK 3 Funktionen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[JACK3:Anmeldung|Anmeldung JACK 3]]&lt;br /&gt;
* Inhalte erstellen&lt;br /&gt;
** Ordner&lt;br /&gt;
** Eine Aufgabe erstellen&lt;br /&gt;
** Multiple Choice Aufgabe&lt;br /&gt;
** Fill-In Aufgabe&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5160</id>
		<title>JACK3</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5160"/>
		<updated>2019-09-26T14:01:18Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JACK 3 ist die neuste Version des JACK Systems welches sich derzeit noch in Entwicklung befindet. Von dieser Seite aus wird auf die künftigen Funktionen des JACK 3 Systems verlinkt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JACK 3 Funktionen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* [[JACK3-Anmeldung|Anmeldung JACK 3]]&lt;br /&gt;
* Inhalte erstellen&lt;br /&gt;
** Ordner&lt;br /&gt;
** Eine Aufgabe erstellen&lt;br /&gt;
** Multiple Choice Aufgabe&lt;br /&gt;
** Fill-In Aufgabe&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5158</id>
		<title>JACK3</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=JACK3&amp;diff=5158"/>
		<updated>2019-09-26T13:34:45Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: Die Seite wurde neu angelegt: „JACK 3 ist die neuste Version des JACK Systems welches sich derzeit noch in Entwicklung befindet. Von dieser Seite aus wird auf die künftigen Funktionen des J…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JACK 3 ist die neuste Version des JACK Systems welches sich derzeit noch in Entwicklung befindet. Von dieser Seite aus wird auf die künftigen Funktionen des JACK 3 Systems verlinkt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JACK 3 Funktionen&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Anmeldung JACK 3&lt;br /&gt;
* Inhalte erstellen&lt;br /&gt;
** Ordner&lt;br /&gt;
** Eine Aufgabe erstellen&lt;br /&gt;
** Multiple Choice Aufgabe&lt;br /&gt;
** Fill-In Aufgabe&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=2555</id>
		<title>GReQL Regeln</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=2555"/>
		<updated>2018-07-09T10:02:41Z</updated>

		<summary type="html">&lt;p&gt;RSchypula: /* Beispiele für statische Prüfregeln für Java-Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beispiele für statische Prüfregeln für Java-Code ==&lt;br /&gt;
=== Codestil ===&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             x.name=capitalizeFirst(x.name) and&lt;br /&gt;
             x.constructor=&amp;quot;false&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Methodennamen, die mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach groß geschriebenen Methodennamen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{TypeDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             not (x.name=capitalizeFirst(x.name))&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Klassennamen, die nicht mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach klein geschriebenen Klassennamen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from x : V{VariableDeclarationFragment}&lt;br /&gt;
          with&lt;br /&gt;
             x.name=capitalizeFirst(x.name) and&lt;br /&gt;
             isEmpty(from m : V{Modifier} with x &amp;lt;nowiki&amp;gt;&amp;amp;amp;lt;--&amp;amp;amp;amp;{FieldDeclaration} --&amp;amp;amp;gt;&amp;lt;/nowiki&amp;gt; m and m.name=&amp;quot;final&amp;quot; report m end)&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
 &amp;lt;feedback prefix=&amp;quot;Hinweis (ohne Punktabzug)&amp;quot;&amp;gt;Du verwendest Variablennamen, die mit einem Großbuchstaben beginnen. Das ist möglich, aber es entspricht nicht dem üblichen Programmierstil für Java.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach groß geschriebenen Variablennamen, wobei als &amp;quot;final&amp;quot; deklarierte Klassenvariablen ausgelassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Einfache Inhalte ===&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, s : V{StringLiteral}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             m --&amp;gt;{Child}* s and&lt;br /&gt;
             s.content = &amp;quot;\&amp;quot;Zeichenkette\&amp;quot;&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Deine Lösung verwendet nicht den String &amp;quot;Zeichenkette&amp;quot;.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht in der Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nach einem String-Literal mit einem vorgegebenen Inhalt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, s : V{StringLiteral}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             m --&amp;gt;{Child}* s and&lt;br /&gt;
             stringLength(s.content) &amp;gt; 4&lt;br /&gt;
          report s.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Du verwendest in Zeile {line} ein festes String-Literal. Ist deine Lösung allgemeingültig?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht in der Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; nach einem String-Literal der Länge 4 oder länger (inklusive Anführungszeichen) und meldet es mit Angabe der Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from p : V{PackageDeclaration}&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Paketdefinition&amp;quot;&amp;gt;Deine Lösung beinhaltet eine package-Angabe. Bitte entferne diese.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Paketdefinitionen und meldet diese als Fehler.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{MethodInvocation}, y : V{SimpleName}&lt;br /&gt;
           with&lt;br /&gt;
              u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
              x.name=&amp;quot;exit&amp;quot; and&lt;br /&gt;
              y.name=&amp;quot;System&amp;quot;&lt;br /&gt;
           report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;Der Aufruf von &amp;quot;System.exit()&amp;quot; in der Datei {name} in Zeile {line} ist nicht gestattet.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach Aufrufen von System.exit() und melde diese unter Angabe von Klasse und Zeilennummer als Fehler.&lt;br /&gt;
&lt;br /&gt;
=== Kontrollstrukturen ===&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{WhileStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{DoStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{ForStatement}) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}*&amp;amp;amp;{EnhancedForStatement})&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Methode &amp;quot;m()&amp;quot; wird kein Schleifenkonstrukt verwendet.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; ein beliebiges Schleifenkonstrukt enthält.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{IfStatement}&lt;br /&gt;
          with&lt;br /&gt;
             ( not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
               (not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{Block}) and isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
             ) and&lt;br /&gt;
             ( not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
               (not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Block}) and isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
             )&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} enthält das if-Statement in Zeile {line} in beiden Zweigen keinen Code und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer if-Anweisung, die nur leere Zweige enthält und meldet eine solche Anweisung als Fehler.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{IfStatement}&lt;br /&gt;
          with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{IfStatementThenStatement}&amp;amp;amp;{EmptyStatement}) and&lt;br /&gt;
             isEmpty(x --&amp;gt;{IfStatementElseStatement}&amp;amp;amp;{Statement})&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} endet das if-Statement in Zeile {line} hinter der Bedingung sofort mit einem Semikolon. Die Bedingung ist dadurch wirkungslos und die folgende Anweisung wird immer ausgeführt.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer if-Anweisung, die keine Zweige enthält und meldet eine solche Anweisung als Fehler.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;absence&amp;quot; points=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{CompilationUnit}, x : V{WhileStatement}&lt;br /&gt;
          with&lt;br /&gt;
             not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{EmptyStatement}) or&lt;br /&gt;
             (not isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block}) and&lt;br /&gt;
             isEmpty(u --&amp;gt;* x --&amp;gt;{WhileStatementBody}&amp;amp;amp;{Block} --&amp;gt;{Child}))&lt;br /&gt;
          report u.name as &amp;quot;name&amp;quot;, x.line as &amp;quot;line&amp;quot; end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Datei {name} besteht die while-Schleife in Zeile {line} nur aus einer Abbruchbedingung und ist dadurch sinnlos.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel sucht nach einer while-Schleife, die nur aus einer Abbruchbedingung besteht und meldet eine solche Schleife als Fehler.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from m : V{MethodDeclaration}, n : V{MethodDeclaration}&lt;br /&gt;
           with&lt;br /&gt;
              m (--&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access}&amp;amp;amp;{MethodDeclaration})* n and&lt;br /&gt;
              n --&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access} m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Rekursionscheck&amp;quot;&amp;gt; Die Methode &amp;quot;m()&amp;quot; enthält nicht die geforderte Rekursion.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; rekursiv arbeitet. Dabei ist es egal, ob sich die Methode direkt selber aufruft, oder über einen oder mehrere Zwischenschritte aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from m : V{MethodDeclaration}&lt;br /&gt;
           with&lt;br /&gt;
              m (--&amp;gt;{Child}*&amp;amp;amp;{MethodInvocation} --&amp;gt;{Access}&amp;amp;amp;{MethodDeclaration}) m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Rekursionscheck&amp;quot;&amp;gt;Die Methode &amp;quot;m()&amp;quot; enthält nicht die geforderte Rekursion.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Methode &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt; rekursiv arbeitet und sich insbesondere ohne Zwischenschritte über andere Methoden selber wieder aufruft.&lt;br /&gt;
&lt;br /&gt;
=== Methoden ===&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;public static String method(int)&amp;quot;)&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;public static String method(int param)&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode mit einer bestimmten Signatur enthält, wobei der Name des Methodenparameters unerheblich ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;int method()&amp;quot;) and&lt;br /&gt;
             isEmpty(m --&amp;gt;{Child}&amp;amp;amp;{Modifier})&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}, mo : V{Modifier}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
             hasSignature(m, &amp;quot;int method()&amp;quot;) and&lt;br /&gt;
             m --&amp;gt; mo and not (mo.name=&amp;quot;private&amp;quot;)&lt;br /&gt;
         report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signaturcheck&amp;quot;&amp;gt;Die Methode &amp;quot;int method()&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt oder ist mit dem Modifier &amp;quot;private&amp;quot; versehen. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode mit einer bestimmten Signatur enthält, die nicht mit dem Modifier private versehen ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, m : V{MethodDeclaration}, pt : V{ParameterizedType}, ptt : V{SimpleType}, pta : V{SimpleType}&lt;br /&gt;
           with&lt;br /&gt;
              t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              t --&amp;gt;{TypeDeclarationBodyDeclarations2} m and&lt;br /&gt;
              m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
              m --&amp;gt;{MethodDeclarationReturnType} pt and&lt;br /&gt;
              pt --&amp;gt;{ParameterizedTypeType} ptt and&lt;br /&gt;
              ptt.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
              pt --&amp;gt;{ParameterizedTypeTypeArguments1} pta and&lt;br /&gt;
              pta.name=&amp;quot;C&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Signatur&amp;quot;&amp;gt;Der Methode &amp;quot;public B&amp;amp;lt;C&amp;amp;gt; m()&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt. Hast du die vorgegebene Methodensignatur veraendert?&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode m mit parametrisierten Rückgabetyp B&amp;lt;C&amp;gt; enthält.&lt;br /&gt;
&lt;br /&gt;
=== Vererbungshierarchie ===&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, st : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             st.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationSuperclassType2} st&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A ist nicht als Unterklasse von B modelliert.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A direkte Unterklasse von Klasse B ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, st : V{SimpleType}&lt;br /&gt;
           with&lt;br /&gt;
              t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
              t --&amp;gt;{TypeDeclarationSuperInterfaceTypes2} st and&lt;br /&gt;
              st.name=&amp;quot;B&amp;quot;&lt;br /&gt;
           report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A implementiert nicht das Interface B.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface B implementiert.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from t : V{TypeDeclaration}, pt : V{ParameterizedType}, ptt : V{SimpleType}, pta : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             t --&amp;gt;{TypeDeclarationSuperInterfaceTypes1} pt and&lt;br /&gt;
             pt --&amp;gt;{ParameterizedTypeType} ptt and&lt;br /&gt;
             ptt.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
             pt --&amp;gt;{ParameterizedTypeTypeArguments1} pta and&lt;br /&gt;
             pta.name=&amp;quot;C&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback prefix=&amp;quot;Typhierarchie&amp;quot;&amp;gt;A implementiert nicht das Interface B&amp;amp;lt;C&amp;amp;gt;.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface B&amp;lt;C&amp;gt; implementiert.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, s : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             ((u --&amp;gt;{TypeDeclarationSuperclassType2} s and s.name=&amp;quot;Thread&amp;quot;) or&lt;br /&gt;
             (u --&amp;gt;{TypeDeclarationSuperInterfaceTypes2} s and s.name=&amp;quot;Runnable&amp;quot;)) and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte entweder das Interface &amp;quot;Runnable&amp;quot; implementieren oder von &amp;quot;Thread&amp;quot; erben.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A das Interface Runnable implementiert oder von Thread erbt.&lt;br /&gt;
&lt;br /&gt;
=== Aufrufbeziehungen ===&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, x : V{MethodInvocation}, y : V{SimpleName}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             x.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             y.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte &amp;quot;B.m()&amp;quot; aufgerufen werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A eine Methode B.m aufruft.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, x : V{MethodInvocation}, y : V{SimpleName}, z : V{VariableDeclarationStatement}, f : V{VariableDeclarationFragment}, t : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;* x --&amp;gt;{ElementExpression} y and&lt;br /&gt;
             u --&amp;gt;* z --&amp;gt;{VariableDeclarationStatementType} t and&lt;br /&gt;
             u --&amp;gt;* z --&amp;gt;{VariableDeclarationStatementFragments} f and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             x.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             y.name=f.name and&lt;br /&gt;
             t.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; sollte &amp;quot;m()&amp;quot; auf einem Objekt vom Typ &amp;quot;B&amp;quot; aufgerufen werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A Methode m auf einem Objekt vom Typ B aufruft.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;rule type=&amp;quot;presence&amp;quot; points=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;query&amp;gt;from u : V{TypeDeclaration}, m : V{MethodDeclaration}, x : V{ClassInstanceCreation}, t : V{SimpleType}&lt;br /&gt;
          with&lt;br /&gt;
             u --&amp;gt;{Child}* m --&amp;gt;* x --&amp;gt;{ClassInstanceCreationType} t and&lt;br /&gt;
             u.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
             m.name=&amp;quot;m&amp;quot; and&lt;br /&gt;
             t.name=&amp;quot;B&amp;quot;&lt;br /&gt;
          report 0 end&lt;br /&gt;
   &amp;lt;/query&amp;gt;&lt;br /&gt;
   &amp;lt;feedback&amp;gt;In der Klasse &amp;quot;A&amp;quot; muss in Methode m() mindestens eine Instanz von &amp;quot;B&amp;quot; erzeugt werden.&amp;lt;/feedback&amp;gt;&lt;br /&gt;
 &amp;lt;/rule&amp;gt;&lt;br /&gt;
Diese Regel überprüft, ob Klasse A in Methode m eine Instanz von Klasse B erstellt.&lt;/div&gt;</summary>
		<author><name>RSchypula</name></author>
	</entry>
</feed>