<?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=Striewe</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=Striewe"/>
	<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Spezial:Beitr%C3%A4ge/Striewe"/>
	<updated>2026-08-10T15:30:15Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=12782</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=12782"/>
		<updated>2026-05-20T14:30:51Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* 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;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;
             not x.constructor&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;
             length(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;
=== Attribute ===&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;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;query&amp;gt;from t : V{TypeDeclaration}, f : V{FieldDeclaration}, m1 : V{Modifier}, s : V{SimpleType}, v : V{VariableDeclarationFragment} with&lt;br /&gt;
				t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
				f --&amp;gt; m1 and f --&amp;gt; s and f --&amp;gt; v and&lt;br /&gt;
				m1.name=&amp;quot;private&amp;quot; and&lt;br /&gt;
				s.name=&amp;quot;B&amp;quot; and&lt;br /&gt;
				v.name=&amp;quot;attr&amp;quot;&lt;br /&gt;
			report 0 end&amp;lt;/query&amp;gt;&lt;br /&gt;
		&amp;lt;feedback&amp;gt;Das private Attribut &amp;quot;attr&amp;quot; vom Typ &amp;quot;B&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt.&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 Klasse &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; ein privates Attribut vom Objekttyp &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; mit Namen &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; enthält.&lt;br /&gt;
&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;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;query&amp;gt;from t : V{TypeDeclaration}, f : V{FieldDeclaration}, m1 : V{Modifier}, p : V{PrimitiveType}, v : V{VariableDeclarationFragment} with&lt;br /&gt;
				t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
				f --&amp;gt; m1 and f --&amp;gt; p and f --&amp;gt; v and&lt;br /&gt;
				m1.name=&amp;quot;private&amp;quot; and&lt;br /&gt;
				p.name=&amp;quot;int&amp;quot; and&lt;br /&gt;
				v.name=&amp;quot;attr&amp;quot;&lt;br /&gt;
			report 0 end&amp;lt;/query&amp;gt;&lt;br /&gt;
		&amp;lt;feedback&amp;gt;Das private Attribut &amp;quot;attr&amp;quot; vom Typ &amp;quot;int&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt.&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 Klasse &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; ein privates Attribut vom primitiven Typ &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; mit Namen &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; enthält.&lt;br /&gt;
&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;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;query&amp;gt;from t : V{TypeDeclaration}, f : V{FieldDeclaration}, m1,m2 : V{Modifier}, p : V{PrimitiveType}, v : V{VariableDeclarationFragment} with&lt;br /&gt;
				t.name=&amp;quot;A&amp;quot; and&lt;br /&gt;
				f --&amp;gt; m1 and f--&amp;gt;m2 and m1&amp;amp;lt;&amp;gt;m2 and f --&amp;gt; p and f --&amp;gt; v and&lt;br /&gt;
				((m1.name=&amp;quot;private&amp;quot; and m2.name=&amp;quot;static&amp;quot;) or (m2.name=&amp;quot;private&amp;quot; and m1.name=&amp;quot;static&amp;quot;)) and&lt;br /&gt;
				p.name=&amp;quot;int&amp;quot; and&lt;br /&gt;
				v.name=&amp;quot;attr&amp;quot;&lt;br /&gt;
			report 0 end&amp;lt;/query&amp;gt;&lt;br /&gt;
		&amp;lt;feedback&amp;gt;Das private, statische Attribut &amp;quot;attr&amp;quot; vom Typ &amp;quot;int&amp;quot; in der Klasse &amp;quot;A&amp;quot; fehlt.&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 Klasse &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; ein privates, statisches Attribut vom primitiven Typ &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; mit Namen &amp;lt;code&amp;gt;attr&amp;lt;/code&amp;gt; enthält.&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=&amp;quot;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]][[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=12422</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=12422"/>
		<updated>2025-09-12T08:05:44Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Einfache Inhalte */&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;
             not x.constructor&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;
             length(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=&amp;quot;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]][[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Publikationen&amp;diff=12303</id>
		<title>Publikationen</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Publikationen&amp;diff=12303"/>
		<updated>2025-06-18T13:57:14Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier finden Sie eine Auflistungen aller Veröffentlichungen rund um das e-Assessment System JACK. Wenn Sie noch Veröffentlichungen kennen, die hier nicht aufgelistet sind melden Sie diese bitte [mailto:jack@paluno.uni-due.de per Mail] an uns.&lt;br /&gt;
&lt;br /&gt;
=== 2025 ===&lt;br /&gt;
* Christoph Olbricht, Melanie Schypula: &#039;&#039;&#039;Digitales Lehren und Lernen mit Moodle und JACK.&#039;&#039;&#039; In: Nicole Auferkorte-Michaelis, Maiken Bonnes, Patrick Hintze, Julia Liebscher (Hrsg.): &#039;&#039;Prüfungen digital gestalten&#039;&#039;, 2025, Verlag Barbara Budrich, S. 115-124.&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Automatic Item Generation Integrated into the E-Assessment-System JACK.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the 17th International Conference on Computer Supported Education (CSEDU 2025)&#039;&#039;, 2025, Volume 1, pages 747-753. https://doi.org/10.5220/0013454600003932&lt;br /&gt;
&lt;br /&gt;
=== 2024 ===&lt;br /&gt;
* Katrin Schüssler, Michael Striewe, Daniel Püschner, Arne Lützen, Michael Goedicke, Michael Giese, Maik Walpuski: &#039;&#039;&#039;Developing and evaluating an e-learning and e-assessment tool for organic chemistry in higher education.&#039;&#039;&#039; In: &#039;&#039;Front. Educ.&#039;&#039; 9:1355078. https://doi.org/10.3389/feduc.2024.1355078&lt;br /&gt;
&lt;br /&gt;
=== 2023 ===&lt;br /&gt;
* Janine Langerbein, Till Massing, Jens Klenke, Michael Striewe, Michael Goedicke and Christoph Hanck: &#039;&#039;&#039;A Data Mining Approach for Detecting Collusion in Unproctored Online Exams.&#039;&#039;&#039; In: Mingyu Feng, Tanja Käser and Partha Talukdar (eds.): &#039;&#039;Proceedings of the 16th International Conference on Educational Data Mining&#039;&#039;, International Educational Data Mining Society, 2023, 6-16. https://zenodo.org/records/8157692&lt;br /&gt;
* Carolin Eitemüller, Florian Trauten, Michael Striewe and Maik Walpuski: &#039;&#039;&#039;Digitalization of Multistep Chemistry Exercises with Automated Formative Feedback&#039;&#039;&#039;. &#039;&#039;Journal of Science Education and Technology&#039;&#039;, 2023. https://link.springer.com/article/10.1007/s10956-023-10043-2&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Strukturformeln für Moleküle zeichnen und differenziertes Feedback erhalten: Eine integrierte Lösung im Rahmen des E-Assessment-Systems JACK.&#039;&#039;&#039; In: &#039;&#039;DELFI 2023, Die 21. Fachtagung Bildungstechnologien der Gesellschaft für Informatik e.V.&#039;&#039;, 11.-13. September 2023, Aachen , 2023 , 273-274. https://dl.gi.de/items/79ac4858-1bdb-44d3-b5bf-60861ee6dc2d&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Domain-Specific Automatic Item Generation for Higher Competence Levels: A Comparative Study on Three Cases.&#039;&#039;&#039; In: &#039;&#039;Methodologies and Intelligent Systems for Technology Enhanced Learning, 13th International Conference&#039;&#039;, 2023, 152-159. https://link.springer.com/chapter/10.1007/978-3-031-41226-4_16&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Architectural Revision of the E-Assessment System JACK.&#039;&#039;&#039; In: Thais Batista, Tomás Bures, Claudia Raibulet and Henry Muccini (eds.): &#039;&#039;Proceedings of ECSA 2022 Tracks and Workshops&#039;&#039;, Springer, 2023, 19-26. https://link.springer.com/chapter/10.1007/978-3-031-36889-9_3&lt;br /&gt;
* Jens Klenke, Till Massing, Natalie Reckmann, Janine Langerbein, Benjamin Otto, Michael Goedicke, Christoph Hanck: &#039;&#039;&#039;Effects of Early Warning Emails on Student Performance.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the 15th International Conference on Computer Supported Education – Volume 1: CSEDU&#039;&#039;, 225-232, 2023. https://www.scitepress.org/PublicationsDetail.aspx?ID=yvNJsCbTjyE=&amp;amp;t=1&lt;br /&gt;
* Lukas Glaser, Michael Striewe: &#039;&#039;&#039;Modularisierung als Schlüssel zur Skalierung - Erfahrungen aus der Entwicklung des E-Assessment-Systems JACK.&#039;&#039;&#039; In: &#039;&#039;Workshops der 21. Fachtagung Bildungstechnologien (DELFI)&#039;&#039;, Gesellschaft für Informatik e.V., 2023, 149-155. https://dl.gi.de/items/84131453-c22f-498b-9102-be1926ea5525&lt;br /&gt;
&lt;br /&gt;
=== 2022 ===&lt;br /&gt;
* Peter Hubwieser, Johannes Krugel, Mike Talbot, Michael Striewe, Michael Goedicke and Christoph Olbricht. &#039;&#039;&#039;Empirical Definition of Object-oriented Programming Competencies.&#039;&#039;&#039; Technical report, Leibniz Universität Hannover, 2022. https://www.repo.uni-hannover.de/handle/123456789/12059&lt;br /&gt;
&lt;br /&gt;
=== 2021 ===&lt;br /&gt;
* Till Massing, Natalie Reckmann, Alexander Blasberg, Benjamin Otto, Christoph Hanck and Michael Goedicke: &#039;&#039;&#039;When is the best time to learn? - Evidence from an introductory statistics course.&#039;&#039;&#039; &#039;&#039;Open Education Studies&#039;&#039;, Volume 3, Number 1, 2021, 84-95. https://www.degruyter.com/document/doi/10.1515/edu-2020-0144/html&lt;br /&gt;
* Silke Kirberg, Michael Striewe and Indira Ceylan: &#039;&#039;&#039;Interoperable Lernumgebung JACK im Projekt Harness.nrw - Textuelles Feedback in skalierbaren Programmieraufgaben.&#039;&#039;&#039; In: &#039;&#039;Bildung in der digitalen Transformation, Tagungsband zur GMW-Jahrestagung 2021&#039;&#039;, 2021, 205-206.&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Design Patterns for Submission Evaluation within E-Assessment Systems.&#039;&#039;&#039; In: &#039;&#039;26th European Conference on Pattern Languages of Programs EuroPLoP&#039;21&#039;&#039;, 2021, 32:1-32:10. https://dl.acm.org/doi/10.1145/3489449.3490010&lt;br /&gt;
* Erwin Amann and Sylvi Rzepka: &#039;&#039;&#039;The Effect of Goal-Setting Prompts in a Blended Learning Environment: Evidence from a Field Experiment.&#039;&#039;&#039; Technical Report, University of Potsdam, 2021. https://publishup.uni-potsdam.de/files/49347/cepa25.pdf&lt;br /&gt;
&lt;br /&gt;
=== 2020 ===&lt;br /&gt;
* Justin Timm, Benjamin Otto, Thilo Schramm, Michael Striewe, Philipp Schmiemann and Michael Goedicke: &#039;&#039;&#039;Technical Aspects of Automated Item Generation for Blended Learning Environments in Biology.&#039;&#039;&#039; &#039;&#039;i-com&#039;&#039;, Volume 1, Number 19, April 2020, 3-15. https://www.degruyter.com/document/doi/10.1515/icom-2020-0001/html&lt;br /&gt;
* Johannes Krugel, Peter Hubwieser, Michael Goedicke, Michael Striewe, Mike Talbot, Christoph Olbricht, Melanie Schypula and Simon Zettler: &#039;&#039;&#039;Automated Measurement of Competencies and Generation of Feedback in Object-Oriented Programming Courses.&#039;&#039;&#039; In: &#039;&#039;2020 IEEE Global Engineering Education Conference&#039;&#039;, EDUCON 2020, Porto, Portugal, April 27-30, 2020, 2020, 329-338. https://ieeexplore.ieee.org/document/9125323&lt;br /&gt;
* Michael Striewe, Florian Trauten and Carolin Eitemüller: &#039;&#039;&#039;Aufgaben mit automatischem Feedback zu chemischen Atom-Orbitalschemata.&#039;&#039;&#039; In: Raphael Zender, Dirk Ifenthaler, Thiemo Leonhardt and Clara Schumacher (eds.): &#039;&#039;DELFI 2020 – Die 18. Fachtagung Bildungstechnologien der Gesellschaft für Informatik e.V.&#039;&#039;, Gesellschaft für Informatik e.V. , Bonn , 2020 , 109-119.&lt;br /&gt;
&lt;br /&gt;
=== 2019 ===&lt;br /&gt;
* Justin Timm, Benjamin Otto, Thilo Schramm, Michael Striewe, Philipp Schmiemann and Michael Goedicke: &#039;&#039;&#039;Technische Aspekte der automatischen Aufgabengenerierung für Blended Learning Angebote in der Biologie.&#039;&#039;&#039; In: Niels Pinkwart and Johannes Konert (eds.): &#039;&#039;DELFI 2019 - Die 17. Fachtagung Bildungstechnologien&#039;&#039;, Gesellschaft für Informatik e.V., Bonn, 2019, 91-102. https://dl.gi.de/items/6ea46885-ae2b-4ef4-bfad-d83c8bc0b584&lt;br /&gt;
* Till Massing, Natalie Reckmann, Benjamin Otto, Alexander Blasberg, Christoph Hanck and Michael Goedicke: &#039;&#039;&#039;Quantitative Methodenkompetenzen im Praxissemester in Lehramtsstudiengängen.&#039;&#039;&#039; In: &#039;&#039;DeLFI 2019 - Die 17. Fachtagung Bildungstechnologien&#039;&#039;, 16.-19. September 2019, Berlin, 2019, 327-328. https://dl.gi.de/items/935d861d-eabf-4cc3-82cb-be4c328e5d34&lt;br /&gt;
* Sebastian Pobel and Michael Striewe: &#039;&#039;&#039;Domain-Specific Extensions for an E-Assessment System.&#039;&#039;&#039; In: Michael A. Herzog, Zuzana Kubincová, Peng Han and Marco Temperini (eds.): &#039;&#039;Advances in Web-Based Learning - ICWL 2019&#039;&#039;, Springer International Publishing, Cham, 2019, 327-331. https://link.springer.com/chapter/10.1007/978-3-030-35758-0_32&lt;br /&gt;
* Christoph Olbricht: &#039;&#039;&#039;Trace-Vergleich zur Feedback-Erzeugung im automatisierten E-Assessment-System JACK.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the Fourth Workshop &amp;quot;Automatische Bewertung von Programmieraufgaben&amp;quot; (ABP 2019)&#039;&#039;, Essen, Germany, 2019, 11-18. https://doi.org/10.18420/abp2019-2&lt;br /&gt;
&lt;br /&gt;
=== 2018 ===&lt;br /&gt;
* Michael Striewe and Michael Goedicke: &#039;&#039;&#039;Automatische Generierung von Aufgaben zum Codeverständnis.&#039;&#039;&#039; In: &#039;&#039;DeLFI 2018 - Die 16. E-Learning Fachtagung Informatik der Gesellschaft für Informatik e. V.&#039;&#039;, Volume 284 of Lecture Notes in Informatics, 2018, 153-164.&lt;br /&gt;
* Melanie Schypula, Nils Schwinning and Michael Goedicke: &#039;&#039;&#039;Formative und summative E-Assessments mit JACK im Rahmen eines Mathematik-Vorkurses.&#039;&#039;&#039; In: Isabell van Ackeren, Michael Kerres and Sandrina Heinrich (eds.): &#039;&#039;Flexibles Lernen mit digitalen Medien&#039;&#039;, Waxmann Verlag GmbH, 2018, 234-244.&lt;br /&gt;
* Nils Schwinning, Michael Striewe, Till Massing, Christoph Hanck and Michael Goedicke: &#039;&#039;&#039;Towards digitalisation of summative and formative assessments in academic teaching of statistics.&#039;&#039;&#039; In: &#039;&#039;Reprint from the Fifth International Conference on Learning and Teaching in Computing and Engineering (LaTiCE 2017)&#039;&#039;, 2018.&lt;br /&gt;
* Till Massing, Nils Schwinning, Michael Striewe, Christoph Hanck and Michael Goedicke: &#039;&#039;&#039;E-Assessment Using Variable-Content Exercises in Mathematical Statistics.&#039;&#039;&#039; &#039;&#039;Journal of Statistics Education&#039;&#039;, Volume 26, Number 3, 2018, 174-189.  https://www.tandfonline.com/doi/full/10.1080/10691898.2018.1518121&lt;br /&gt;
* Till Massing, Natalie Reckmann, Benjamin Otto, Kim J. Hermann, Christoph Hanck and Michael Goedicke: &#039;&#039;&#039;Klausurprognose mit Hilfe von E-Assessment-Nutzerdaten.&#039;&#039;&#039; In: &#039;&#039;DeLFI 2018 - Die 16. E-Learning Fachtagung Informatik der Gesellschaft für Informatik e. V.&#039;&#039;, Volume 284 of Lecture Notes in Informatics, 2018, 171-176.&lt;br /&gt;
* Raoul Deuss, Christine Lippens and Michael Striewe: &#039;&#039;&#039;Best of Two Worlds: Using Two Assessment Tools in One Course.&#039;&#039;&#039; In: &#039;&#039;Technology Enhanced Assessment - 21st International Conference&#039;&#039;, TEA 2018, Amsterdam, The Netherlands, December 10-11, 2018, Revised Selected Papers, 2018, 121-139. https://link.springer.com/chapter/10.1007/978-3-030-25264-9_9&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Dynamic Generation of Assessment Items Using Wikidata.&#039;&#039;&#039; In: &#039;&#039;Technology Enhanced Assessment - 21st International Conference&#039;&#039;, TEA 2018, Amsterdam, The Netherlands, December 10-11, 2018, Revised Selected Papers, 2018, 1-15. https://link.springer.com/chapter/10.1007/978-3-030-25264-9_1&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Towards a Pattern Catalogue for E-Assessment System Integration.&#039;&#039;&#039; In: &#039;&#039;Combined Proceedings of the Workshops of the German Software Engineering Conference 2018 (SE 2018)&#039;&#039;, Ulm, Germany, March 06, 2018., 2018, 62-65.&lt;br /&gt;
* Michael Striewe and Matthias Kramer: &#039;&#039;&#039;Empirische Untersuchungen von Lückentext-Items zur Beherrschung der Syntax einer Programmiersprache.&#039;&#039;&#039; In: &#039;&#039;Hochschuldidaktik der Informatik (HDI 2018)&#039;&#039;, Volume 12 of Commentarii informaticae didacticae (CID), 2018, 101-115.&lt;br /&gt;
&lt;br /&gt;
=== 2017 ===&lt;br /&gt;
* Benjamin Otto and Michael Goedicke: &#039;&#039;&#039;Auf dem Weg zu variablen Programmieraufgaben: Requirements Engineering anhand didaktischer Aspekte.&#039;&#039;&#039; In: &#039;&#039;3rd Workshop on &amp;quot;Automatische Bewertung von Programmieraufgaben&amp;quot; (ABP 2017)&#039;&#039;, 2017.&lt;br /&gt;
* Peter Hubwieser, Marc Berges, Michael Striewe and Michael Goedicke: &#039;&#039;&#039;Towards Competency Based Testing and Feedback.&#039;&#039;&#039; In: &#039;&#039;Proceedings of IEEE Global Engineering Education Conference (EDUCON)&#039;&#039;, 2017, 517-526. https://ieeexplore.ieee.org/document/7942896&lt;br /&gt;
* Michael Goedicke and Michael Striewe: &#039;&#039;&#039;10 Jahre automatische Bewertung von Programmieraufgaben mit JACK – Rückblick und Ausblick.&#039;&#039;&#039; In: &#039;&#039;7,5. HDI-Workshop des GI-Fachbereichs Informatik und Ausbildung / Didaktik der Informatik&#039;&#039;, 2017. https://dl.gi.de/items/baff53cf-b9b0-4138-9eda-b4676f908818&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;Integration von externen Werkzeugen über die IMS-LTI-Schnittstelle.&#039;&#039;&#039; In: Moodle Kompetenzzentrum der Universität Duisburg-Essen (eds.): &#039;&#039;Moodle in der Praxis - Szenarien für die Hochschullehre. 12 Jahre Moodle an der Universität Duisburg-Essen&#039;&#039;, DuEPublico, 2017, 92-97.&lt;br /&gt;
* Michael Striewe, Matthias Kramer and Michael Goedicke: &#039;&#039;&#039;Ein Lückentext-Test zur Beherrschung einer Programmiersprache.&#039;&#039;&#039; In: &#039;&#039;DeLFI 2017 – Die 15. e-Learning Fachtagung Informatik der Gesellschaft für Informatik&#039;&#039;, Volume 273 of Lecture Notes in Informatics, 2017, 261-266.  &lt;br /&gt;
* Benjamin Otto, Till Massing, Nils Schwinning, Natalie Reckmann, Alexander Blasberg, Sandy Schumann, Christoph Hanck and Michael Goedicke: &#039;&#039;&#039;Evaluation einer Statistiklehrveranstaltung mit dem JACK R-Modul.&#039;&#039;&#039; In: &#039;&#039;DeLFI 2017 – Die 15. e-Learning Fachtagung Informatik der Gesellschaft für Informatik&#039;&#039;, Volume 273 of Lecture Notes in Informatics, 2017, 75-86.&lt;br /&gt;
&lt;br /&gt;
=== 2016 ===&lt;br /&gt;
* Marc Berges, Michael Striewe, Philipp Shah, Michael Goedicke and Peter Hubwieser: &#039;&#039;&#039;Towards deriving programming competencies from student errors.&#039;&#039;&#039; In: &#039;&#039;2016 International Conference on Learning and Teaching in Computing and Engineering (LaTICE)&#039;&#039;, March 2016, 19-23. https://ieeexplore.ieee.org/document/7743146&lt;br /&gt;
* Michael Fellmann, Peter Fettke, Constantin Houy, Peter Loos, Andreas Oberweis, Andreas Schoknecht, Michael Striewe, Tom Thaler and Meike Ullrich: &#039;&#039;&#039;Evaluation automatisierter Ansätze für die Bewertung von Modellierungsaufgaben.&#039;&#039;&#039; In: &#039;&#039;DeLFI 2016 - Die 14. E-Learning Fachtagung Informatik&#039;&#039;, Volume 262 of LNI, 2016, 203-214.&lt;br /&gt;
* Melanie Schypula, Nils Schwinning, Alina Doekels and Michael Goedicke: &#039;&#039;&#039;Beobachtungen zum Abbruchverhalten von Studierenden in einem webbasierten Mathematik-Vorkurs.&#039;&#039;&#039; In: &#039;&#039;DeLFI 2016 - Die 14. E-Learning Fachtagung Informatik&#039;&#039;, Volume 262 of LNI, 2016, 221-232.&lt;br /&gt;
* Michael Striewe: &#039;&#039;&#039;An architecture for modular grading and feedback generation for complex exercises.&#039;&#039;&#039; &#039;&#039;Science of Computer Programming&#039;&#039;, Volume 129, 2016, 35-47. https://www.sciencedirect.com/science/article/pii/S0167642316300260?via%3Dihub&lt;br /&gt;
&lt;br /&gt;
=== 2015 ===&lt;br /&gt;
* Melanie Schypula, Filiz Kurt-Karaoglu, Nils Schwinning, Michael Striewe, Björn Zurmaar and Michael Goedicke: &#039;&#039;&#039;Aufwand und Nutzen parametrisierbarer, pfadbasierter Aufgaben.&#039;&#039;&#039; In: &#039;&#039;Proceedings of DeLFI 2015: Die 13. e-Learning Fachtagung Informatik&#039;&#039;, 2015 .&lt;br /&gt;
* Nils Schwinning, Michael Striewe, Marinko Savija and Michael Goedicke: &#039;&#039;&#039;On Flexible Multiple Choice Questions with Parameters.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the 14th European Conference on e-Learning (ECEL-2015)&#039;&#039;, 2015.  &lt;br /&gt;
* Filiz Kurt-Karaoglu, Nils Schwinning, Michael Striewe, Björn Zurmaar and Michael Goedicke: &#039;&#039;&#039;A Framework for Generic Exercises with Mathematical Content.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the International Conference on Learning and Teaching in Computing and Engineering (LaTiCE 2015)&#039;&#039;, 2015, 70-75. https://ieeexplore.ieee.org/document/7126234&lt;br /&gt;
* Michael Striewe, Björn Zurmaar and Michael Goedicke: &#039;&#039;&#039;Evolution of the E-Assessment Framework JACK.&#039;&#039;&#039; In: &#039;&#039;Gemeinsamer Tagungsband der Workshops der Tagung Software Engineering 2015&#039;&#039;, Dresden, Germany, 17.-18. März 2015., 2015, 118-120.&lt;br /&gt;
* Tim Kocher, Ulrike Haß, Bernhard Schröder: &#039;&#039;&#039;&amp;lt;JACK:lin&amp;gt; - Linguistische Module für das E-Assessment mit JACK.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the International Conference of the German Society for Computational Linguistics and Language Technology&#039;&#039;, 2015, 170-171. https://konvens.org/proceedings/2015/GSCL-201528.pdf&lt;br /&gt;
* Mario D&#039;Amico: &#039;&#039;&#039;Konzeption universeller .NET-Prüfkomponenten für das E-Assessment-System JACK.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the Second Workshop &amp;quot;Automatische Bewertung von Programmieraufgaben&amp;quot;&#039;&#039;, 2015. https://ceur-ws.org/Vol-1496/paper1.pdf&lt;br /&gt;
* Enno Lohmann: &#039;&#039;&#039;Erweiterung eines E-Assessment-Systems um eine Prüfkomponente für die Programmiersprache Python.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the Second Workshop &amp;quot;Automatische Bewertung von Programmieraufgaben&amp;quot;&#039;&#039;, 2015. https://ceur-ws.org/Vol-1496/paper2.pdf&lt;br /&gt;
&lt;br /&gt;
=== 2014 ===&lt;br /&gt;
* Nils Schwinning, Melanie Schypula, Michael Striewe and Michael Goedicke: &#039;&#039;&#039;Concepts and Realisations of Flexible Exercise Design and Feedback Generation in an e-Assessment System for Mathematics.&#039;&#039;&#039; In: &#039;&#039;Joint Proceedings of the MathUI, OpenMath and ThEdu Workshops and Work in Progress track at CICM, co-located with Conferences on Intelligent Computer Mathematics (CICM 2014)&#039;&#039;, 2014.&lt;br /&gt;
* Filiz Kurt-Karaoglu, Patrick Hintze, Melanie Schypula, Nils Schwinning, Michael Striewe, Björn Zurmaar and Michael Goedicke: &#039;&#039;&#039;Begleitende E-Assessments als Unterstützung großer Grundlagenveranstaltungen in der Studieneingangsphase.&#039;&#039;&#039; In: &#039;&#039;Grundfragen Multimedialen Lehrens und Lernens 2014&#039;&#039;, 2014, 150-163.&lt;br /&gt;
* Michael Goedicke, Filiz Kurt-Karaoglu, Nils Schwinning, Melanie Schypula and Michael Striewe. &#039;&#039;&#039;Zweiter Jahresbericht zum Projekt &amp;quot;Bildungsgerechtigkeit im Fokus&amp;quot; (Teilprojekt 1.2 - &amp;quot;Blended Learning&amp;quot;) an der Fakultät für Wirtschaftswissenschaften.&#039;&#039;&#039; Technical report, Universität Duisburg-Essen, 2014.&lt;br /&gt;
* Nils Schwinning, C. Neugebauer, K. Winter, S. Krusekamp, Michael Striewe, Filiz Kurt-Karaoglu and Michael Goedicke: &#039;&#039;&#039;JACK und MaStEr: Universitätsübergreifende Weiterentwicklung zweier Mathematik-Vorkurs-Konzepte mit computerbasierter Diagnose und Förderung.&#039;&#039;&#039; In: &#039;&#039;Tagungsband Hansekolloquium 2014&#039;&#039;, 2014.&lt;br /&gt;
* Michael Striewe and Michael Goedicke: &#039;&#039;&#039;Automated Assessment of UML Activity Diagrams.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the 2014 conference on Innovation &amp;amp; technology in computer science education (ITiCSE 2014)&#039;&#039;, 2014, 336. http://dx.doi.org/10.1145/2591708.2602657&lt;br /&gt;
* Michael Striewe and Michael Goedicke: &#039;&#039;&#039;Code reading exercises using run time traces.&#039;&#039;&#039; In: &#039;&#039;Proceedings of the 2014 conference on Innovation &amp;amp; technology in computer science education (ITiCSE 2014)&#039;&#039;, 2014, 346. http://dx.doi.org/10.1145/2591708.2602658&lt;br /&gt;
[[Kategorie:Hauptseiten]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GenerateSimpleSentence&amp;diff=11996</id>
		<title>GenerateSimpleSentence</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GenerateSimpleSentence&amp;diff=11996"/>
		<updated>2024-11-13T11:57:08Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Zugehörige Evaluatoren ===&lt;br /&gt;
* &#039;&#039;&#039;MathEvaluator&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
Die Funktion &#039;&#039;generateSimpleSentence&#039;&#039; generiert einen einfachen (englischen) Satz. Dafür benötigt sie vier Parameter. Der erste Parameter ist das Subjekt, der zweite Parameter ist das Verb, der dritte Parameter ist das Objekt und der vierte Parameter gibt die Zeitform des zu generierenden Satzes.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 generateSimpleSentence(String subjekt, String verb, String objekt, String zeit)&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
* &#039;&#039;&#039;subjekt&#039;&#039;&#039; - das Subjekt in Grundform des zu generierenden Satzes&lt;br /&gt;
* &#039;&#039;&#039;verb&#039;&#039;&#039; - das Verb in Grundform des zu generierenden Satzes&lt;br /&gt;
* &#039;&#039;&#039;objekt&#039;&#039;&#039; - das Objekt in Grundform des zu generierenden Satzes&lt;br /&gt;
* &#039;&#039;&#039;zeit&#039;&#039;&#039; - die Zeitform, in die der Satz generiert werden soll&lt;br /&gt;
&lt;br /&gt;
Subjekt und Objekt werden als Parameter immer im Singular angegeben. Der Generator setzt das Objekt immer automatisch in den Plural.&lt;br /&gt;
&lt;br /&gt;
Folgende Zeitformen stehen zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
* Vergangenheit: &amp;quot;past simple&amp;quot;, &amp;quot;past progressive&amp;quot;, &amp;quot;past perfect&amp;quot;, &amp;quot;past perfect progressive&amp;quot;&lt;br /&gt;
* Gegenwart: &amp;quot;present simple&amp;quot;, &amp;quot;present progressive&amp;quot;, &amp;quot;present perfect&amp;quot;, &amp;quot;present perfect progressive&amp;quot;&lt;br /&gt;
* Zukunft: &amp;quot;future simple&amp;quot;, &amp;quot;future progressive&amp;quot;, &amp;quot;future perfect&amp;quot;, &amp;quot;future perfect progressive&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
* Gibt den generierten Satz als String zurück.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
==== Standardfälle ====&lt;br /&gt;
 generateSimpleSentence(&#039;woman&#039;,&#039;eat&#039;,&#039;orange&#039;,&#039;present simple&#039;)    --&amp;gt; returns &#039;The woman eats oranges.&#039;&lt;br /&gt;
 &lt;br /&gt;
 generateSimpleSentence(&#039;woman&#039;,&#039;eat&#039;,&#039;orange&#039;,&#039;past simple&#039;)    --&amp;gt; returns &#039;The woman ate oranges.&#039;&lt;br /&gt;
&lt;br /&gt;
==== Benutzung mit Variablen ====&lt;br /&gt;
 generateSimpleSentence(&#039;woman&#039;,&#039;eat&#039;,&#039;orange&#039;, [var=a])&lt;br /&gt;
 &lt;br /&gt;
 generateSimpleSentence([var=b],&#039;eat&#039;, [var=c],&#039;present simple&#039;)&lt;br /&gt;
&lt;br /&gt;
==== Benutzung mit studentischer Eingabe ====&lt;br /&gt;
 &#039;&#039;&#039;Jack2:&#039;&#039;&#039;&lt;br /&gt;
 generateSimpleSentence(&#039;woman&#039;,&#039;eat&#039;,&#039;orange&#039;, [pos=1])&lt;br /&gt;
 &lt;br /&gt;
 generateSimpleSentence([pos=1],&#039;eat&#039;, [var=c],&#039;present simple&#039;)&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Jack3:&#039;&#039;&#039;&lt;br /&gt;
 generateSimpleSentence(&#039;woman&#039;,&#039;eat&#039;,&#039;orange&#039;, [input=fillin1])&lt;br /&gt;
 &lt;br /&gt;
 generateSimpleSentence([input=fillin1],&#039;eat&#039;, [var=c],&#039;present simple&#039;)&lt;br /&gt;
&lt;br /&gt;
=== Hinweise ===&lt;br /&gt;
* Es werden nur englische Sätze generiert.&lt;br /&gt;
* Der Satz wird durch das Generatorsystem SimpleNLG generier, das nur mit Wörtern umgehen kann, die sich in seinem Lexikon befinden.&lt;br /&gt;
** Die Funktion [[chooseWordsExistingInLexicon]] kann genutzt werden, um aus einer Liste von Wörtern diejenigen zu erhalten, die SimpleNLG kennt.&lt;br /&gt;
* Wenn Variablen genutzt werden muss darauf geachtet werden, dass diese die Voraussetzung erfüllen.&lt;br /&gt;
* Wenn die Eingabe der Studierenden genutzt wird muss auch hier darauf geachtet werden, dass die Voraussetzungen erfüllt sind und ob diese an der Stelle genutzt werden können.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Zeichenkettenfunktionen]][[Kategorie:JACK2]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Molek%C3%BCl_(JACK3)&amp;diff=11878</id>
		<title>Molekül (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Molek%C3%BCl_(JACK3)&amp;diff=11878"/>
		<updated>2024-10-16T18:23:48Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Variablen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Aufgabentyp &amp;quot;Molekül&amp;quot; ermöglich es Lehrenden nach bestimmten Molekülen, Reaktionsgleichungen oder ähnlichem zu fragen. Die Studierenden müssen dann die passende Struktur mithilfe eines Editors zeichnen. Dieser Aufgabentyp befindet sich derzeit noch im Aufbau, so dass spezielle Features in zukünftigen Versionen erweitert, verändert oder ergänzt werden können.&lt;br /&gt;
&lt;br /&gt;
Der Aufgabentyp nutzt an verschiedenen Stellen die InChI-Notation (https://de.wikipedia.org/wiki/International_Chemical_Identifier), um Moleküle zu repräsentieren. Die Analyse studentischer Eingaben ist aber nicht auf Informationen beschränkt, die in InChI-Strings abgebildet werden können.&lt;br /&gt;
&lt;br /&gt;
===Aufgabeninhalt===&lt;br /&gt;
In dem Bereich Aufgabeninhalt wird der Aufgabentext erstellt und spezifische Eingaben für den jeweiligen Aufgabenteil gemacht.&lt;br /&gt;
* &#039;&#039;&#039;Titel:&#039;&#039;&#039; Hier kann optional der Name des Aufgabenteils eingetragen werden.&lt;br /&gt;
* &#039;&#039;&#039;Aufgabentext:&#039;&#039;&#039; Im Aufgabentext steht die Aufgabenstellung. Der Editor für den Aufgabetext lässt sich öffnen in dem man reinklickt. In dem Fließtext kann Latex-Code verwendet werden, indem man diesen mit $-Zeichen einspannt. Der Editor bietet einige Formatierungen an wie z.B. fett, kursiv und unterstrichen. Einfache Tabellen können auch mithilfe des Editors erstellt werden. Wenn man den Button &#039;&#039;source code&#039;&#039; [[File:Icon-source_code.jpg|35px]] verwendet kann man HTML-Code nutzen. Über den Button &#039;&#039;&#039;Ressource Einfügen&#039;&#039;&#039; lässt sich ein hochgeladenes Bild oder ein Link in den Aufgabentext einfügen.&lt;br /&gt;
[[File:Molekuel_Aufgabentext.JPG|center|thumb|800px|Aufgabentext für eine Molekül Aufgabe]]&lt;br /&gt;
* &#039;&#039;&#039;Konfiguration des Editors:&#039;&#039;&#039; Hier können verschiedenen Einstellungen vorgenommen werden, mit denen die verfügbaren Funktionen des Molekül-Editors für die studentische Eingabe eingeschränkt werden können. Es besteht jeweils die Möglichkeit, zwischen einer Standardeinstellung und einer individuellen Einstellung pro Aufgabe zu wählen. Admins können zudem alternative Voreinstellungen definieren. Siehe dazu &amp;quot;[[Konfiguration des Kekulé-Editors]]&amp;quot;.&lt;br /&gt;
** &#039;&#039;&#039;Editor auf das Ändern von Farben beschränken:&#039;&#039;&#039; Wird hier ein Haken gesetzt, können Lernende im Editor nur noch das Molekül farbig markieren. Zudem wird das Molekül mit einer höheren Strichstärke dargestellt, sodass Markierungen besser ersichtlich sind. Andere Arten der Manipulation sowie auch das Erstellen neuer Moleküle ist dann nicht mehr möglich. Diese Option kann sinnvoll sein, wenn der Student Bereiche im Molekül farblich markieren soll, aber ansonsten keine Änderungen am Molekül vornehmen darf.&lt;br /&gt;
* &#039;&#039;&#039;Voreingestelltes Molekül im Editor:&#039;&#039;&#039; Hier kann eine Vorbelegung für den Editor erstellt werden, die den Studierenden beim Betreten der Aufgabe angezeigt wird. Klicken Sie rechts auf das Stift-Symbol, um einen Moleküleditor zu öffnen und die Vorbelegung zu erstellen oder zu ändern. In der Übersicht wird die Vorbelegung als InChI-String angezeigt. Es bleiben aber auch alle weiteren Bestandteile (z. B. Reaktionspfeile) erhalten, selbst wenn sie nicht im InChI-String abgebildet werden können.&lt;br /&gt;
&lt;br /&gt;
===Feedback===&lt;br /&gt;
Beim Feedback stehen verschiedene Standardoptionen und spezielle Features zur Verfügung.&lt;br /&gt;
* &#039;&#039;&#039;Gewichtung des Aufgabenteils:&#039;&#039;&#039; Gewichtung der Punktzahl eines Aufgabenteils innerhalb der Aufgabe.&lt;br /&gt;
* &#039;&#039;&#039;Aufgabentext:&#039;&#039;&#039; Zur Übersicht und besseren Erstellung des Feedbacks wird der Aufgabentext hier nochmal angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Erweiterte Eingabeanalyse:&#039;&#039;&#039; Die erweiterte Eingabeanalyse ist derzeit im Aufbau. Es stehen mehrere Funktion zur Verfügung.&lt;br /&gt;
** &#039;&#039;&#039;Reaktionen in der Eingabe analysieren&#039;&#039;&#039;: Es wird nach Reaktionspfeilen gesucht und die gefundene Moleküle in Bezug auf diese Reaktionen ausgewertet und zugeordnet. Dadurch entstehen zusätzliche Variablen, die im Folgenden in den Feedback-Regeln genutzt werden können (siehe unten). Das System nutzt zur Erkennung und Zuordnung gewisse Suchbereiche vor und nach sowie über und unter den Reaktionspfeilen.&lt;br /&gt;
** &#039;&#039;&#039;Annotationen an Molekülen analysieren:&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;Farbige Markierung in Molekülen analysieren:&#039;&#039;&#039; Es können Markierungen für das/die Moleküle definiert werden. Die Markierungen bestehen aus einem Namen und der Markierung (Eingabe über den Kekule-Editor). Für die Markierung steht das voreingestellte Molekül zur Verfügung. Pro erstellter Markierung wird eine Variable erzeugt, die im Folgenden in den Feedback-Regeln genutzt werden kann (siehe unten). Das System prüft nicht auf den Farbton, sondern nur ob der Bereich eingefärbt wurde.&lt;br /&gt;
* &#039;&#039;&#039;Erwartete Lösung:&#039;&#039;&#039; Hier wird die Formel der richtigen Lösung eingetragen. Klicken Sie rechts auf das Stift-Symbol, um einen Moleküleditor zu öffnen und die erwartete Lösung zu erstellen oder zu ändern. In der Übersicht wird die erwartete Lösung als InChI-String angezeigt.&lt;br /&gt;
[[File:Molekuel_erwarteteEingabe.JPG|center|thumb|800px|Die erwartete Eingabe in InChI-Code]]&lt;br /&gt;
* &#039;&#039;&#039;Feedback bei korrekter Antwort:&#039;&#039;&#039; Der Feedbacktext, der ausgegeben werden soll, wenn die Eingabe der erwarteten Lösung entspricht. Das System prüft dazu, ob die studentische Eingabe genau dieselben InChI-Strings enthält wie die erwartete Lösung. Die Reihenfolge der Eingabe sowie die Position auf der Zeichenfläche wird dabei ignoriert.&lt;br /&gt;
* &#039;&#039;&#039;Feedback bei falscher Antwort:&#039;&#039;&#039; Der Feedbacktext, der ausgegeben wird, wenn die studentische Eingabe nicht der erwarteten Lösung entspricht.&lt;br /&gt;
* &#039;&#039;&#039;Weitere Feedbacks (optional):&#039;&#039;&#039; Analog zum Aufgabentyp [[Fill-In (JACK3)|Fill-In]] können weitere Regeln angegeben werden, die jeweils Feedback auslösen. Anders als bei der erwarteten Lösung steht hier kein Molekül-Editor zur Verfügung. Stattdessen müssen passende [[Evaluator]]-Funktionen genutzt werden, um die studentische Eingabe zu analysieren. Diese steht dazu als Variablen der Form &amp;lt;code&amp;gt;[input=...]&amp;lt;/code&amp;gt; zur Verfügung (siehe unten).&lt;br /&gt;
* &#039;&#039;&#039;Feedback beim Überspringen:&#039;&#039;&#039; Der Lehrende kann jeden Fill-In oder Drop-Down Aufgabenteil zum Überspringen anbieten. Dazu muss zunächst der Haken gesetzt werden. Danach gibt es noch die Möglichkeit einen Text den Lernenden anzuzeigen, wenn dieser diesen Aufgabenteil übersprungen hat. Den Text kann man ändern indem man entweder in das Textfeld klickt oder den [[File:Icon-Pencil.jpg|22px]]-Button nutzt.&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Hinweise}}&lt;br /&gt;
&lt;br /&gt;
===Verknüpfungen===&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil (Standard):&#039;&#039;&#039; In dem Drop-Down Feld wird der nächste Zustand ausgewählt, in die die Aufgabe sein soll, wenn der Lernende eine Lösung eingereicht hat. Dieses wird immer dann durchgeführt, wenn keine andere Aktion zutrifft. Es gibt die folgenden Möglichkeiten: &lt;br /&gt;
** &#039;&#039;&#039;Ende der Aufgabe:&#039;&#039;&#039; Die Aufgabe ist mit der Aktion des Lernenden beendet.&lt;br /&gt;
** &#039;&#039;&#039;Aufgabenteil wiederholen:&#039;&#039;&#039; Der Aufgabenteil wird wiederholt. Der Lernende kann ein weiteres Ergebnis einreichen. Diese Aktion kann man z.B. bei Übungsaufgaben benutzen, wenn der Lernende eine Aufgabe solange wiederholen soll, bis das richtige Ergebnis eingereicht wurde.&lt;br /&gt;
** &#039;&#039;&#039;#x (x ist dabei ein beliebiger Aufgabenteil dieser Aufgabe):&#039;&#039;&#039; Der entsprechende Aufgabenteil wird als nächstes angezeigt. Wenn man die Aufgabenteilnummer des aktuellen Aufgabenteils wählt wird dieser Aufgabenteil neu aufgerufen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Weitere nächste Aufgabenteile (optional):&#039;&#039;&#039; Hier kann die nächste Aktion dynamisch eingestellt werden, d.h. sie kann abhängig von der Variablen Konstelation sein oder von der Eingabe des Lernenden.&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil beim Überspringen (optional):&#039;&#039;&#039; Hier wird eingestellt welcher nächste Aufgabenteil angezeigt werden soll, wennn der Lernende den Aufgabenteil übersprungen hat. Diese Einstellungsmöglichkeit steht nur zur Verfügung, wenn der Haken im Tab Feedback fürs Überspringen gesetzt wurde.&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Variablenupdates}}&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Dateien für Studierende}}&lt;br /&gt;
&lt;br /&gt;
===Studentische Eingabe===&lt;br /&gt;
Die studentische Eingabe erfolgt über den Molekül-Editor von Kekule, indem man mit einigen Hilfsmitteln die Moleküle zeichnen kann. Die studentische Lösung des oben genannten Beispiels würde dann wie folgt aussehen:&lt;br /&gt;
[[File:Molekuel_studentischeEingabe.JPG|center|thumb|800px|Editor zur studentischen Eingabe eine Moleküls]]&lt;br /&gt;
&lt;br /&gt;
=== Variablen ===&lt;br /&gt;
Die folgenden [[Variablen (JACK3)|JACK-Variablen]] stehen speziell im Aufgabentyp &amp;quot;Molekül&amp;quot; für &#039;&#039;&#039;jede&#039;&#039;&#039; studentische Einreichung zur Verfügung:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[input=inchi]&amp;lt;/code&amp;gt;|| Enthält eine Liste von Strings, die jeweils einem InChI-String eines eingegebenen Molekül entsprechen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[input=inchi_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Enthält jeweils einen InChI-String aus der studentischen Eingabe.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Variablen stehen &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; zur Verfügung, wenn die &#039;&#039;&#039;erweiterte Eingabeanalyse&#039;&#039;&#039; genutzt wurde:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=reactions]&amp;lt;/code&amp;gt;|| Anzahl der erkannten Reaktionen (entspricht der Anzahl der gefundenen Reaktionspfeile).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=reactionType_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Typ der jeweiligen Reaktion entsprechend des im Editor verwendeten Reaktionspfeils.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=educts_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als Edukt der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=products_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als Produkt der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=minorEducts_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als anorganisches Edukt oder sonstige Information oberhalb des Reaktionspfeils (z. B. &amp;quot;Hitze&amp;quot;) der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=minorProducts_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als anorganisches Produkt oder sonstige Information unterhalb des Reaktionspfeils der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=foundColoring_&amp;lt;NameDerMarkierung&amp;gt;]&amp;lt;/code&amp;gt;|| True, wenn die benannte Markierung in der Eingabe enthalten ist. False, wenn die Markierung nicht in der Eingabe enthalten ist.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=foundUnexpectedColoring]&amp;lt;/code&amp;gt;|| True, wenn min. 1 Markierung gefunden wurde, die nicht vom Lehrenden im Feedback definiert wurde.&lt;br /&gt;
|}&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Nomenklaturen_(JACK3)&amp;diff=11877</id>
		<title>Nomenklaturen (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Nomenklaturen_(JACK3)&amp;diff=11877"/>
		<updated>2024-10-16T18:14:34Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für die Abfrage von Fachbegriffen steht der Aufgabentyp &amp;quot;Freitext&amp;quot; zur Verfügung. Bei diesem Aufgabentyp können die Lernenden in einem kurzen Textfeld Text eingeben und dieser wird bei der Abgabe gespeichert. Mit seiner Darstellungsweise und seinen Einstellungen stellt der Aufgabentyp einen Mittelweg aus den Aufgabentypen &amp;quot;[[Freitext (JACK3)|Freitext]]&amp;quot; und &amp;quot;[[Fill-In (JACK3)|Fill-In]]&amp;quot; dar: Das Eingabefeld ist deutlich keiner als bei Freitext und verdeutlicht den Lernenden damit, dass nur eine kurze Eingabe erforderlich ist. Zudem sind die Einstellungsmöglichkeiten für Lehrende begrenzter als bei Fill-In, so dass Aufgaben schneller eingerichtet werde können.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufgabentyp kann mit manuellem oder regelbasiertem Feedback verwendet werden. Zusätzlich steht derzeit ein spezieller Checker zur Verfügung, der Teile der IUPAC-Nomenklatur der organischen Chemie beherrscht. Weitere Checker sind für die Zukunft geplant.&lt;br /&gt;
&lt;br /&gt;
===Aufgabeninhalt===&lt;br /&gt;
In dem Bereich Aufgabeninhalt wird der Aufgabentext erstellt und spezifische Eingaben für den jeweiligen Aufgabenteil gemacht.&lt;br /&gt;
* &#039;&#039;&#039;Titel:&#039;&#039;&#039; Hier kann optional der Name des Aufgabenteils eingetragen werden.&lt;br /&gt;
* &#039;&#039;&#039;Aufgabentext:&#039;&#039;&#039; Im Aufgabentext steht die Aufgabenstellung. Der Editor für den Aufgabetext lässt sich öffnen, indem man reinklickt. In dem Fließtext kann Latex-Code verwendet werden, indem man diesen mit $-Zeichen einspannt. Der Editor bietet einige Formatierungen an wie z.B. fett, kursiv und unterstrichen. Einfache Tabellen können auch mithilfe des Editors erstellt werden. Wenn man den Button &#039;&#039;source code&#039;&#039; [[File:Icon-source_code.jpg|35px]] verwendet kann man HTML-Code nutzen. Über den Button &#039;&#039;&#039;Ressource Einfügen&#039;&#039;&#039; lässt sich ein hochgeladenes Bild oder ein Link in den Aufgabentext einfügen.&lt;br /&gt;
* &#039;&#039;&#039;Musterlösung:&#039;&#039;&#039; Die Eingabe einer Musterlösung ist nur erforderlich, wenn der Aufgabentyp mit einem speziellen Checker genutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
===Feedback===&lt;br /&gt;
In dem Tab Feedback können Texte und Evaluierungsregeln für das Feedback definiert werden.&lt;br /&gt;
*&#039;&#039;&#039;Gewichtung der Stufe:&#039;&#039;&#039; Gewichtung der Punktzahl eines Aufgabenteils innerhalb der Aufgabe.&lt;br /&gt;
*&#039;&#039;&#039;Automatisches Bewertungsmodul:&#039;&#039;&#039; Falls ein spezieller Checker genutzt werden soll, kann dieser hier ausgewählt werden. Falls ein Checker ausgewählt wird, wird die Überprüfung durch den Checker immer vor der Auswertung weiterer, optionaler Feedback-Regeln durchgeführt.&lt;br /&gt;
** Derzeit steht nur ein Checker zur &#039;&#039;&#039;IUPAC&#039;&#039;&#039;-Nomenklatur zur Verfügung. Der Checker überprüft, ob die Eingabe mit der Musterlösung übereinstimmt und erzeugt automatisches Feedback, dass den Stamm, die Substituenten, die funktionale Gruppe und die stereochemischen Eigenschaften berücksichtigt.&lt;br /&gt;
*&#039;&#039;&#039;Weitere Feedbacks (optional):&#039;&#039;&#039; Alternativ oder ergänzend zum Einsatz der automatischen Bewertung können an dieser Stelle weitere Feedbacks mit Evaluierungsregeln definiert werden. Weitere Feedbacks können immer über den Button &#039;&#039;&#039;Feedback Regel anlegen&#039;&#039;&#039; hinzugefügt werden.&lt;br /&gt;
**&#039;&#039;&#039;Evaluator Regel:&#039;&#039;&#039; Hier wird die Evaluator-Regel eingetragen. Wenn diese zutrifft wird das Feedback ausgegeben. Die studentische Eingabe steht in der Variablen &amp;lt;code&amp;gt;[input=studentInput]&amp;lt;/code&amp;gt; zur Verfügung. Wenn eine automatisches Bewertungsmodul genutzt wurde, stehen möglicherweise weitere Variablen zur Verfügung (siehe weiter unten unter [[#Variablen|Variablen]]).&lt;br /&gt;
**&#039;&#039;&#039;Domäne:&#039;&#039;&#039; Mit der Angabe der Domäne gibt man an welchen Evaluator man mit der Regel anspricht. Im Moment wird ein Mathe und ein Chemie Evaluator von Jack3 unterstützt.&lt;br /&gt;
**&#039;&#039;&#039;Punkte:&#039;&#039;&#039; Jedes Feedback kann zwischen 0 und 100 Punkten geben. Dabei ist zu beachten, dass mehr als ein Feedback wiedergegeben werden kann. Dabei werden alle Punkte zusammengerechnet. Jack3 deckelt die Punkte auf 100.&lt;br /&gt;
**&#039;&#039;&#039;Feedback:&#039;&#039;&#039; Der Text, der unter Feedback hinterlegt ist, wird dem Lehrenden angezeigt, wenn das Feedback zutrifft.&lt;br /&gt;
** &#039;&#039;&#039;terminales Feedback:&#039;&#039;&#039; Jack3 geht alle Feedbacks unter &#039;&#039;&#039;Weitere Feedbacks (optional)&#039;&#039;&#039; der Reihe nach durch, d.h. es wird oben in der Liste angefangen, und gibt alle zutreffenden raus. Bei den Feedbacks, die mit Terminal markiert sind wird die Suche abgebrochen, wenn diese zutreffen. Es ist also wichtig darauf zu achten in welcher Reihenfolge die Feedbacks stehen. Es macht also Sinn zunächst die Feedbacks aufzulisten, die mit terminal markiert sind und danach die anderen Feedbacks. Die richtige Lösung wird auch mit terminal markiert und bekommt 100 Punkte.&lt;br /&gt;
*&#039;&#039;&#039;Überspringen:&#039;&#039;&#039; Wie bei allen anderen Aufgabentypen kann auch im Aufgabentyp &amp;quot;Nomenklaturen&amp;quot; das Überspringen angeboten werden. Dazu muss zunächst der Haken gesetzt werden. Danach gibt es noch die Möglichkeit einen Text den Lernenden anzuzeigen, wenn dieser diesen Aufgabenteil übersprungen hat. Den Text kann man entweder durch Klicken in das Textfeld oder über den Icon [[File:Icon-Pencil.jpg|22px]] hinzufügen.&lt;br /&gt;
[[File:Ueberspringen.JPG|center|thumb|800px|Feedback beim Überspringen]]&lt;br /&gt;
&lt;br /&gt;
Statt das automatische Bewertungsmodul oder weitere Feedbacks zu nutzen, kann der Aufgabentyp auch manuell bewertet werden. Wie man [[Manuelles Feedback (JACK3)|manuelles Feedback]] an eine Einreichung setzt wird [[Manuelles Feedback (JACK3)|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Hinweise}}&lt;br /&gt;
&lt;br /&gt;
===Verknüpfungen===&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil (Standard):&#039;&#039;&#039; In dem Drop-Down Feld wird der nächste Zustand ausgewählt, in die die Aufgabe sein soll, wenn der Lernende eine Lösung eingereicht hat. Dieses wird immer dann durchgeführt, wenn keine andere Aktion zutrifft. Es gibt die folgenden Möglichkeiten: &lt;br /&gt;
** &#039;&#039;&#039;Ende der Aufgabe:&#039;&#039;&#039; Die Aufgabe ist mit der Aktion des Lernenden beendet.&lt;br /&gt;
** &#039;&#039;&#039;Aufgabenteil wiederholen:&#039;&#039;&#039; Der Aufgabenteil wird wiederholt. Der Lernende kann ein weiteres Ergebnis einreichen. Bei diesem Aufgabentyp ist zu beachten, dass im Moment nicht direkt Feedback gegeben wird.&lt;br /&gt;
** &#039;&#039;&#039;#x (x ist dabei ein beliebiger Aufgabenteil dieser Aufgabe):&#039;&#039;&#039; Der entsprechende Aufgabenteil wird als nächstes angezeigt. Wenn man die Aufgabenteilnummer des aktuellen Aufgabenteils wählt wird dieser Aufgabenteil neu aufgerufen.&lt;br /&gt;
* &#039;&#039;&#039;Weitere nächste Aufgabenteile (optional):&#039;&#039;&#039; Hier kann die nächste Aktion dynamisch eingestellt werden, d.h. sie kann abhängig von der Variablen Konstellation sein oder von der Eingabe des Lernenden.&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil beim Überspringen (optional):&#039;&#039;&#039; Hier wird eingestellt welcher nächste Aufgabenteil angezeigt werden soll, wenn der Lernende den Aufgabenteil übersprungen hat. Diese Einstellungsmöglichkeit steht nur zur Verfügung, wenn der Haken im Tab Feedback fürs Überspringen gesetzt wurde.&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Variablenupdates}}&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Dateien für Studierende}}&lt;br /&gt;
&lt;br /&gt;
===Variablen===&lt;br /&gt;
Wird für die Bewertung das automatische Bewertungsmodul zur IUPAC-Nomenklatur verwendent, stehen die folgenden [[Variablen (JACK3)|JACK-Variablen]] für die Erstellung von Feedbackregeln zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name!! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[check=mainNameCorrect]&amp;lt;/code&amp;gt;||Enthält &amp;quot;true&amp;quot;, wenn der Stamm der Eingabe mit der Musterlösung übereinstimmt, sonst &amp;quot;false&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[check=fctGroupCorrect]&amp;lt;/code&amp;gt;||Enthält &amp;quot;true&amp;quot;, wenn die funktionale Gruppe der Eingabe mit der Musterlösung übereinstimmt, sonst &amp;quot;false&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[check=substituentsCorrect]&amp;lt;/code&amp;gt;||Enthält &amp;quot;true&amp;quot;, wenn die Substituenten der Eingabe in Anzahl, Art und Position mit der Musterlösung übereinstimmen, sonst &amp;quot;false&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[check=stereodescriptorsCorrect]&amp;lt;/code&amp;gt;||Enthält &amp;quot;true&amp;quot;, wenn die Stereodeskriptoren der Eingabe in Anzahl und Art mit der Musterlösung übereinstimmen, sonst &amp;quot;false&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzerhandbuch_(JACK3)&amp;diff=11870</id>
		<title>Benutzerhandbuch (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzerhandbuch_(JACK3)&amp;diff=11870"/>
		<updated>2024-10-15T09:00:56Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Aufgaben erstellen / testen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dies ist das Benutzerhandbuch der neuesten Version JACK3. Hier finden Sie alle wichtigen Information von &amp;quot;Wie erstelle ich eine Aufgabe?&amp;quot; über &amp;quot;Wie lasse ich meine Studierende die Aufgaben bearbeiten?&amp;quot; bis &amp;quot;Wie lässt sich in die studentische Abgaben einsehen?&amp;quot;.&lt;br /&gt;
Bitte beachten Sie, dass dies noch in Arbeit ist und noch nicht vollständig ist. Es kommen noch weitere Abschnitte hinzu und andere werden noch ausgebaut.&lt;br /&gt;
&lt;br /&gt;
==Schnelleinstieg==&lt;br /&gt;
[[Schnelleinstieg (JACK3)|Hier]] ist eine Anleitung für den Schnelleinstieg in JACK3. Mit dieser Anleitung lässt sich schnell eine Aufgabe erstellen und diese Studierende zur Verfügung stellen. Dabei werden nur die wichtigsten Einstellungen betrachtet. Für weitere Details stehen die folgenden Seiten zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
Zum schnellen Finden einzelner Seiten kann auch die [[:Category:Benutzerhandbuch|A-Z]] Liste genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==Allgemeine Informationen und Hinweise zum Start==&lt;br /&gt;
Beschreibung der globalen Einstellungen, die ein Nutzer in JACK3 tätigen kann. &lt;br /&gt;
Nachdem Aufrufen von JACK3 erscheint zunächst die [[Login (JACK3)|Login]] Seite, auf der man sich in das e-Assessment System JACK3 einloggen können. JACK3 Terminologie kann im [[Glossar (JACK3)|Glossar]] nachgeschlagen werden.&lt;br /&gt;
* [[Hauptseite (JACK3)|Hauptseite]] - Erklärung der [[Hauptseite (JACK3)|Hauptseite]], die nach dem Einloggen in das E-Assessment System JACK erscheint.&lt;br /&gt;
* [[Mein Account (JACK3)|Mein Account]] - Einstellungsmöglichkeiten des eigenen Benutzerskontos.&lt;br /&gt;
* [[Verfügbare Kurse (JACK3)|Verfügbare Kurse]] - Unter [[Verfügbare Kurse (JACK3)|Verfügbare Kurse]] können Lehrende Kursangebote erstellen, die dann von den Studierenden bearbeitet werden. Studierende sehen hier alle [[Kursangebot (Studierendensicht)|Kursangebote]], die sie bearbeiten können.&lt;br /&gt;
* [[Meine Teilnahmen (JACK3)|Meine Teilnahmen]] - Hier erscheinen die aktuell laufenden Kurse.&lt;br /&gt;
* [[Mein Arbeitsbereich (JACK3)|Mein Arbeitsbereich]] - Kurse und Aufgaben werden in diesem Bereich erstellt.&lt;br /&gt;
* [[Spracheinstellung (JACK3)|Spracheinstellung]] - Die Spracheinstellung wirkt sich nur global auf die Seiten aus und nicht auf die Aufgaben selber.&lt;br /&gt;
* [[Glossar (JACK3)|Grundlegende Konzepte / Glossar]] - Erklärung der Grundlegenden Konzepte in JACK3, die zum Teil für die Benutzung sehr wichtig sind.&lt;br /&gt;
* [[Variablen (JACK3)|Variablen]] - Variablentypen von JACK3 (insb. Aufgaben-Variablen) und die Verwendung&lt;br /&gt;
&lt;br /&gt;
==Aufgaben erstellen / testen==&lt;br /&gt;
In diesem Abschnitt wird alles beschrieben, was sich mit einer einzelnen Aufgabe beschäftigt. Es beginnt mit globalen Einstellungen für eine Aufgabe, die Erstellung der verschiedenen Aufgabentypen, bis zum Testen der erstellten Aufgabe.&lt;br /&gt;
* [[Aufgaben Konfiguration (JACK3)|Aufgaben Konfigurationen / Einstellungen]]&lt;br /&gt;
** [[Aufgaben Einstellungen (JACK3)|Einstellungen]] - globalen Einstellungen der Aufgabe&lt;br /&gt;
** [[Variablenkonfiguration (JACK3)|Variablenkonfiguration]]&lt;br /&gt;
** [[JSXGraph (JACK3)|Dynamische, grafische Inhalte]]&lt;br /&gt;
** [[Aufgabenteile (JACK3)|Aufgabenteile]] - alle möglichen Aufgabenformate in JACK3 werden hier beschrieben&lt;br /&gt;
*** [[Atomorbitale (JACK3)|Atomorbitale]] - Erstellen von Atomorbitalschemas&lt;br /&gt;
*** [[Dateiupload (JACK3)|Dateiupload]] - Hochladen von Datei(en)&lt;br /&gt;
*** [[Fill-In (JACK3)|Fill-In / Drop-Down/ Molekül]] - Lückentext, Eingabefelder, Drop-Down und Molekül Felder&lt;br /&gt;
*** [[Freitext (JACK3)|Freitext]] - Textfeld für die Eingabe von Texten, ohne Checker&lt;br /&gt;
*** [[Java (JACK3)|Java]] - Programmieraufgaben in Java&lt;br /&gt;
*** [[Molekül (JACK3)|Molekül]]&lt;br /&gt;
*** [[Multiple-Choice (JACK3)|Multiple-Choice]] - Multiple-Choice und Single-Choice möglich&lt;br /&gt;
*** [[MC-Table (JACK3)|Multiple-Choice Tabelle]]&lt;br /&gt;
*** [[Nomenklaturen (JACK3)|Nomenklaturen]] - Abfrage von Fachterminologie mit manueller oder automatischer Überprüfung&lt;br /&gt;
*** [[Python (JACK3)|Python]] - Programmieraufgaben in Python&lt;br /&gt;
*** [[R (JACK3)|R]]&lt;br /&gt;
*** [[UML (JACK3)|UML]]&lt;br /&gt;
** [[Grafische Darstellung (JACK3)|Grafische Darstellung der Aufgabenteile]] - Ansicht wie die verschiedenen Aufgabenteile miteinander verbunden sind.&lt;br /&gt;
** [[Dateien (JACK3)|Dateien]]&lt;br /&gt;
** [[Aufgaben Statistik (JACK3)|Statistik]]&lt;br /&gt;
* [[Aufgaben testen (JACK3)|Aufgabe testen]] - Beschreibung wie eine Aufgabe getestet werden kann, bevor sie Studierenden gezeigt wird.&lt;br /&gt;
&lt;br /&gt;
==Kurse / Kursangebote erstellen==&lt;br /&gt;
In diesem Abschnitt werden Kurse und Kursangebote beschrieben. Wichtig hier ist auch das Zusammespiel der beiden.&lt;br /&gt;
* [[Kurs Einstellungen (JACK3)|Kurs Einstellungen]] - Im Kurs werden die Aufgaben zusammengestellt.&lt;br /&gt;
* [[Kursangebot Einstellungen (JACK3)|Kursangebot Einstellungen]] - Im Kursangebot werden die Sichtbarkeiten eingestellt.&lt;br /&gt;
&#039;&#039;&#039;Mögliche Szenarien&#039;&#039;&#039;: Kursangebote können für verschiedene Zwecke eingesetzt werden. Auf den folgenden Seiten werden gängige Einsatzszenarien mit Schritt-für-Schritt-Anleitungen erläutert. Es ist jedoch zu beachten, dass Einstellungen ggf. individuell angepasst und getestet werden müssen&lt;br /&gt;
*[[Kursanmeldung (JACK3)|Kursanmeldung]] - Reines Anmeldesystem ohne Aufgaben, z.B. für die Anmeldung zu einer mündlichen Prüfung.&lt;br /&gt;
*[[Übungskurs erstellen (JACK3)|Übungskurs]] - Übungsaufgaben, um Inhalte aus der Vorlesung zu üben.&lt;br /&gt;
*[[Prüfung erstellen (JACK3)|Prüfung]] - Prüfung oder Klausur mit JACK3 erstellen.&lt;br /&gt;
&lt;br /&gt;
==Statistiken / Prüfungsergebnisse==&lt;br /&gt;
Beschreibung der Einsicht in die Bearbeitungen von den Studierenden.&lt;br /&gt;
*[[Einsicht in Ergebnisse in Aufgaben (JACK3)|Ergebnisse ansehen in Aufgaben]]&lt;br /&gt;
*[[Manuelles Feedback (JACK3)|Manuelles Feedback]] - An jeder Einreichung einer Aufgabe und einer Kursbearbeitung kann das automatische Feedback von JACK und die vergebene Punktzahl überschrieben werden.&lt;br /&gt;
*[[Einsicht in Ergebnisse in Kursangeboten (JACK3)|Ergebnisse ansehen in Kursangeboten]]&lt;br /&gt;
&lt;br /&gt;
==Anmeldeoptionen / Nutzer Verwaltung / Rechte Konzept==&lt;br /&gt;
*[[Kursangebot Einstellungen (JACK3)#Zugangsbeschränkung|Verlinkung von Kursen über den öffentlichen Link]]&lt;br /&gt;
* [[LTI Anbindung (JACK3)|Moodle Anbindung]] - Erklärung wie sich ein Kursangebot in JACK3 in einen Moodle Kurs einbinden lässt.&lt;br /&gt;
*[[Rechtekonzept (JACK3)|Rechtekonzept]] und [[Rechte bearbeiten (JACK3)|Rechte bearbeiten]] - Erklärung der verschiedenen Rechte in JACK3.&lt;br /&gt;
*[[Verwaltung (JACK3)|Verwaltung]] - Verwaltungsmöglichkeiten eines Admins.&lt;br /&gt;
&lt;br /&gt;
==Import / Export==&lt;br /&gt;
*[[Inhalte exportieren (JACK3)|Inhalte exportieren]] - Es können nur Inhalte von [[Mein Arbeitsbereich (JACK3)|Mein Arbeitsbereich]] heruntergeladen werden.&lt;br /&gt;
*[[Aufgaben aus Jack2 importieren (JACK3)|Aufgaben aus JACK2 importieren]]&lt;br /&gt;
**[[Evaluator-Änderungen von JACK2 nach JACK3]]&lt;br /&gt;
*[[Inhalte importieren (JACK3)|Inhalte importieren]]&lt;br /&gt;
[[Kategorie:JACK3]]&lt;br /&gt;
[[Kategorie:Benutzerhandbuch]]&lt;br /&gt;
[[Kategorie:Hauptseiten]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Nomenklaturen_(JACK3)&amp;diff=11868</id>
		<title>Nomenklaturen (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Nomenklaturen_(JACK3)&amp;diff=11868"/>
		<updated>2024-10-12T17:45:34Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Die Seite wurde neu angelegt: „Für die Abfrage von Fachbegriffen steht der Aufgabentyp &amp;quot;Freitext&amp;quot; zur Verfügung. Bei diesem Aufgabentyp können die Lernenden in einem kurzen Textfeld Text eingeben und dieser wird bei der Abgabe gespeichert. Mit seiner Darstellungsweise und seinen Einstellungen stellt der Aufgabentyp einen Mittelweg aus den Aufgabentypen &amp;quot;Freitext&amp;quot; und &amp;quot;Fill-In&amp;quot; dar: Das Eingabefeld ist deutlich keiner als bei Freitext und verd…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für die Abfrage von Fachbegriffen steht der Aufgabentyp &amp;quot;Freitext&amp;quot; zur Verfügung. Bei diesem Aufgabentyp können die Lernenden in einem kurzen Textfeld Text eingeben und dieser wird bei der Abgabe gespeichert. Mit seiner Darstellungsweise und seinen Einstellungen stellt der Aufgabentyp einen Mittelweg aus den Aufgabentypen &amp;quot;[[Freitext (JACK3)|Freitext]]&amp;quot; und &amp;quot;[[Fill-In (JACK3)|Fill-In]]&amp;quot; dar: Das Eingabefeld ist deutlich keiner als bei Freitext und verdeutlicht den Lernenden damit, dass nur eine kurze Eingabe erforderlich ist. Zudem sind die Einstellungsmöglichkeiten für Lehrende begrenzter als bei Fill-In, so dass Aufgaben schneller eingerichtet werde können.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufgabentyp kann mit manuellem oder regelbasiertem Feedback verwendet werden. Zusätzlich steht derzeit ein spezieller Checker zur Verfügung, der Teile der IUPAC-Nomenklatur der organischen Chemie beherrscht. Weitere Checker sind für die Zukunft geplant.&lt;br /&gt;
&lt;br /&gt;
===Aufgabeninhalt===&lt;br /&gt;
In dem Bereich Aufgabeninhalt wird der Aufgabentext erstellt und spezifische Eingaben für den jeweiligen Aufgabenteil gemacht.&lt;br /&gt;
* &#039;&#039;&#039;Titel:&#039;&#039;&#039; Hier kann optional der Name des Aufgabenteils eingetragen werden.&lt;br /&gt;
* &#039;&#039;&#039;Aufgabentext:&#039;&#039;&#039; Im Aufgabentext steht die Aufgabenstellung. Der Editor für den Aufgabetext lässt sich öffnen, indem man reinklickt. In dem Fließtext kann Latex-Code verwendet werden, indem man diesen mit $-Zeichen einspannt. Der Editor bietet einige Formatierungen an wie z.B. fett, kursiv und unterstrichen. Einfache Tabellen können auch mithilfe des Editors erstellt werden. Wenn man den Button &#039;&#039;source code&#039;&#039; [[File:Icon-source_code.jpg|35px]] verwendet kann man HTML-Code nutzen. Über den Button &#039;&#039;&#039;Ressource Einfügen&#039;&#039;&#039; lässt sich ein hochgeladenes Bild oder ein Link in den Aufgabentext einfügen.&lt;br /&gt;
* &#039;&#039;&#039;Musterlösung:&#039;&#039;&#039; Die Eingabe einer Musterlösung ist nur erforderlich, wenn der Aufgabentyp mit einem speziellen Checker genutzt werden soll.&lt;br /&gt;
&lt;br /&gt;
===Feedback===&lt;br /&gt;
In dem Tab Feedback können Texte und Evaluierungsregeln für das Feedback definiert werden.&lt;br /&gt;
*&#039;&#039;&#039;Gewichtung der Stufe:&#039;&#039;&#039; Gewichtung der Punktzahl eines Aufgabenteils innerhalb der Aufgabe.&lt;br /&gt;
*&#039;&#039;&#039;Automatisches Bewertungsmodul:&#039;&#039;&#039; Falls ein spezieller Checker genutzt werden soll, kann dieser hier ausgewählt werden. Falls ein Checker ausgewählt wird, wird die Überprüfung durch den Checker immer vor der Auswertung weiterer, optionaler Feedback-Regeln durchgeführt.&lt;br /&gt;
** Derzeit steht nur ein Checker zur &#039;&#039;&#039;IUPAC&#039;&#039;&#039;-Nomenklatur zur Verfügung. Der Checker überprüft, ob die Eingabe mit der Musterlösung übereinstimmt und erzeugt automatisches Feedback, dass den Stamm, die Substituenten, die funktionale Gruppe und die stereochemischen Eigenschaften berücksichtigt.&lt;br /&gt;
*&#039;&#039;&#039;Weitere Feedbacks (optional):&#039;&#039;&#039; Alternativ oder ergänzend zum Einsatz der automatischen Bewertung können an dieser Stelle weitere Feedbacks mit Evaluierungsregeln definiert werden. Weitere Feedbacks können immer über den Button &#039;&#039;&#039;Feedback Regel anlegen&#039;&#039;&#039; hinzugefügt werden.&lt;br /&gt;
**&#039;&#039;&#039;Evaluator Regel:&#039;&#039;&#039; Hier wird die Evaluator-Regel eingetragen. Wenn diese zutrifft wird das Feedback ausgegeben. Die die studentische Eingabe steht in der Variablen &amp;lt;code&amp;gt;[input=studentInput]&amp;lt;/code&amp;gt; zur Verfügung.&lt;br /&gt;
**&#039;&#039;&#039;Domäne:&#039;&#039;&#039; Mit der Angabe der Domäne gibt man an welchen Evaluator man mit der Regel anspricht. Im Moment wird ein Mathe und ein Chemie Evaluator von Jack3 unterstützt.&lt;br /&gt;
**&#039;&#039;&#039;Punkte:&#039;&#039;&#039; Jedes Feedback kann zwischen 0 und 100 Punkten geben. Dabei ist zu beachten, dass mehr als ein Feedback wiedergegeben werden kann. Dabei werden alle Punkte zusammengerechnet. Jack3 deckelt die Punkte auf 100.&lt;br /&gt;
**&#039;&#039;&#039;Feedback:&#039;&#039;&#039; Der Text, der unter Feedback hinterlegt ist, wird dem Lehrenden angezeigt, wenn das Feedback zutrifft.&lt;br /&gt;
** &#039;&#039;&#039;terminales Feedback:&#039;&#039;&#039; Jack3 geht alle Feedbacks unter &#039;&#039;&#039;Weitere Feedbacks (optional)&#039;&#039;&#039; der Reihe nach durch, d.h. es wird oben in der Liste angefangen, und gibt alle zutreffenden raus. Bei den Feedbacks, die mit Terminal markiert sind wird die Suche abgebrochen, wenn diese zutreffen. Es ist also wichtig darauf zu achten in welcher Reihenfolge die Feedbacks stehen. Es macht also Sinn zunächst die Feedbacks aufzulisten, die mit terminal markiert sind und danach die anderen Feedbacks. Die richtige Lösung wird auch mit terminal markiert und bekommt 100 Punkte.&lt;br /&gt;
*&#039;&#039;&#039;Überspringen:&#039;&#039;&#039; Wie bei allen anderen Aufgabentypen kann auch im Aufgabentyp &amp;quot;Nomenklaturen&amp;quot; das Überspringen angeboten werden. Dazu muss zunächst der Haken gesetzt werden. Danach gibt es noch die Möglichkeit einen Text den Lernenden anzuzeigen, wenn dieser diesen Aufgabenteil übersprungen hat. Den Text kann man entweder durch Klicken in das Textfeld oder über den Icon [[File:Icon-Pencil.jpg|22px]] hinzufügen.&lt;br /&gt;
[[File:Ueberspringen.JPG|center|thumb|800px|Feedback beim Überspringen]]&lt;br /&gt;
&lt;br /&gt;
Statt das automatische Bewertungsmodul oder weitere Feedbacks zu nutzen, kann der Aufgabentyp auch manuell bewertet werden. Wie man [[Manuelles Feedback (JACK3)|manuelles Feedback]] an eine Einreichung setzt wird [[Manuelles Feedback (JACK3)|hier]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Hinweise}}&lt;br /&gt;
&lt;br /&gt;
===Verknüpfungen===&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil (Standard):&#039;&#039;&#039; In dem Drop-Down Feld wird der nächste Zustand ausgewählt, in die die Aufgabe sein soll, wenn der Lernende eine Lösung eingereicht hat. Dieses wird immer dann durchgeführt, wenn keine andere Aktion zutrifft. Es gibt die folgenden Möglichkeiten: &lt;br /&gt;
** &#039;&#039;&#039;Ende der Aufgabe:&#039;&#039;&#039; Die Aufgabe ist mit der Aktion des Lernenden beendet.&lt;br /&gt;
** &#039;&#039;&#039;Aufgabenteil wiederholen:&#039;&#039;&#039; Der Aufgabenteil wird wiederholt. Der Lernende kann ein weiteres Ergebnis einreichen. Bei diesem Aufgabentyp ist zu beachten, dass im Moment nicht direkt Feedback gegeben wird.&lt;br /&gt;
** &#039;&#039;&#039;#x (x ist dabei ein beliebiger Aufgabenteil dieser Aufgabe):&#039;&#039;&#039; Der entsprechende Aufgabenteil wird als nächstes angezeigt. Wenn man die Aufgabenteilnummer des aktuellen Aufgabenteils wählt wird dieser Aufgabenteil neu aufgerufen.&lt;br /&gt;
* &#039;&#039;&#039;Weitere nächste Aufgabenteile (optional):&#039;&#039;&#039; Hier kann die nächste Aktion dynamisch eingestellt werden, d.h. sie kann abhängig von der Variablen Konstellation sein oder von der Eingabe des Lernenden.&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil beim Überspringen (optional):&#039;&#039;&#039; Hier wird eingestellt welcher nächste Aufgabenteil angezeigt werden soll, wenn der Lernende den Aufgabenteil übersprungen hat. Diese Einstellungsmöglichkeit steht nur zur Verfügung, wenn der Haken im Tab Feedback fürs Überspringen gesetzt wurde.&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Variablenupdates}}&lt;br /&gt;
&lt;br /&gt;
{{JACK3:Dateien für Studierende}}&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=11685</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=11685"/>
		<updated>2024-08-26T18:10:16Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Codestil */&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;
             not x.constructor&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=&amp;quot;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]][[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=10062</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=10062"/>
		<updated>2024-03-21T10:15:02Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Klassendiagramme */&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=&amp;quot;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>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=True&amp;diff=10061</id>
		<title>True</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=True&amp;diff=10061"/>
		<updated>2024-03-13T12:11:06Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vorlage:Warnung|Warnung=Diese Seite beinhaltet eine Evaluator-Funktion im JACK3 System.}}&lt;br /&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;
&#039;&#039;true&#039;&#039; gibt den Boolschen Wahrheitswert &#039;&#039;True&#039;&#039; bzw. &#039;&#039;Wahr&#039;&#039; zurück.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 true()&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
* Gibt ein [[Objekt]] zurück.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
 true()    --&amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 true() || false()    --&amp;gt; True&lt;br /&gt;
&lt;br /&gt;
=== Hinweise ===&lt;br /&gt;
* Als Gegenstück gibt die Funktion [[false|false()]] &#039;&#039;False&#039;&#039; zurück.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=False&amp;diff=10060</id>
		<title>False</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=False&amp;diff=10060"/>
		<updated>2024-03-13T12:11:04Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vorlage:Warnung|Warnung=Diese Seite beinhaltet eine Evaluator-Funktion im JACK3 System.}}&lt;br /&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;
&#039;&#039;false&#039;&#039; gibt den Boolschen Wahrheitswert &#039;&#039;False&#039;&#039; bzw. &#039;&#039;Falsch&#039;&#039; zurück.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 false()&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
* Gibt ein [[Objekt]] zurück.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
 false()    --&amp;gt; False&lt;br /&gt;
 &lt;br /&gt;
 false() &amp;amp;&amp;amp; true()    --&amp;gt; False&lt;br /&gt;
&lt;br /&gt;
=== Hinweis ====&lt;br /&gt;
* Als Gegenstück gibt die Funktion [[true|true()]] &#039;&#039;True&#039;&#039; zurück.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=IsEmpty&amp;diff=10059</id>
		<title>IsEmpty</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=IsEmpty&amp;diff=10059"/>
		<updated>2024-03-13T12:08:45Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &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;
== Beschreibung ==&lt;br /&gt;
Die Funktion &#039;&#039;isEmpty&#039;&#039; prüft ob ein gegebenes Objekt leer ist, also entweder keine Zeichen oder ausschließlich Leerzeichen beinhaltet, oder Leere Boxen, wie in Matritzen zu finden. Die Funktion erwartet ein Objekt und gibt einen Boolean zurück. &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 isEmpty([[Objekt]] objekt)&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
* &#039;&#039;&#039;objekt&#039;&#039;&#039; - [[Objekt]], das auf leeren Inhalt geprüft wird&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;
 &#039;&#039;&#039;Jack2:&#039;&#039;&#039;&lt;br /&gt;
 isEmpty(&#039;  &#039;)   --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 isEmpty(&#039;nichtleer&#039;)   --&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Jack3:&#039;&#039;&#039;&lt;br /&gt;
 isEmpty( )    --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 isEmpty(&#039; &#039;)    --&amp;gt; returns false&lt;br /&gt;
 &lt;br /&gt;
 isEmpty(&#039;nichtleer&#039;)    --&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
==== Benutzung von Variablen (Beispiele) ====&lt;br /&gt;
 isEmpty([input=fillin1])&lt;br /&gt;
&lt;br /&gt;
 isEmpty([var=a])&lt;br /&gt;
&lt;br /&gt;
=== Hinweise ===&lt;br /&gt;
* Anführungsstriche werden als Zeichenkette interpretiert, daher wird es nicht als leer gesehen.&lt;br /&gt;
* Ein Leerzeichen wird in JACK3 nicht mehr als leer interpretiert.&lt;br /&gt;
* Für die Überprüfung, ob die Platzhalter bei Formeln durch den Formeleditor leer gelassen wurde, steht die Funktion [[containsEditorPlaceholder|containsEditorPlaceholder()]] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]][[Kategorie:Testfunktionen]][[Kategorie:JACK2]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=True&amp;diff=10058</id>
		<title>True</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=True&amp;diff=10058"/>
		<updated>2024-03-13T11:46:06Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &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;
&#039;&#039;true&#039;&#039; gibt True zurück.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 true()&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
* Gibt ein [[Objekt]] zurück.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
 true()    --&amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 true() || false()    --&amp;gt; True&lt;br /&gt;
&lt;br /&gt;
=== Hinweise ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=False&amp;diff=10057</id>
		<title>False</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=False&amp;diff=10057"/>
		<updated>2024-03-13T11:45:45Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Vorlage:Warnung|Warnung=Diese Seite beinhaltet eine Evaluator-Funktion im JACK3 System.}}&lt;br /&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;
&#039;&#039;false&#039;&#039; gibt falsch zurück.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 false()&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
* Gibt ein [[Objekt]] zurück.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
 false()    --&amp;gt; False&lt;br /&gt;
 &lt;br /&gt;
 false() &amp;amp;&amp;amp; true()    --&amp;gt; False&lt;br /&gt;
&lt;br /&gt;
=== Hinweis ====&lt;br /&gt;
* Als alternative gibt die Funktion [[true|true()]] &#039;&#039;True&#039;&#039; zurück.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=BooleanOr&amp;diff=10056</id>
		<title>BooleanOr</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=BooleanOr&amp;diff=10056"/>
		<updated>2024-03-13T11:45:16Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &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;
===Beschreibung===&lt;br /&gt;
Die Funktion &#039;&#039;BooleanOr&#039;&#039; (&amp;quot;||&amp;quot;) vergleicht zwei Aussagen auf &#039;&#039;true&#039;&#039; oder &#039;&#039;false&#039;&#039;. Es wird nur dann &#039;&#039;false&#039;&#039; zurückgegeben, wenn beide Aussagen &#039;&#039;false&#039;&#039; sind.&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
  x || y&lt;br /&gt;
  or(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 || 1    --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 0 || 1    --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 1 || 0    --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 0 || 0    --&amp;gt; returns false&lt;br /&gt;
 &lt;br /&gt;
 (2+4==6) || (3+3==6)    --&amp;gt; returns true&lt;br /&gt;
&lt;br /&gt;
==== Benutzung mit Variablen ====&lt;br /&gt;
&lt;br /&gt;
 [var=a] || [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]][[Category:Operator]][[Kategorie:Booleanfunktionen]][[Kategorie:JACK2]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=BooleanNot&amp;diff=10055</id>
		<title>BooleanNot</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=BooleanNot&amp;diff=10055"/>
		<updated>2024-03-13T11:44:59Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &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;
===Beschreibung===&lt;br /&gt;
Die Funktion &#039;&#039;BooleanNot&#039;&#039; (!) testet ob eine Aussage wahr oder falsch ist. &lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
  !a&lt;br /&gt;
  not(a)&lt;br /&gt;
&lt;br /&gt;
===Parameter===&lt;br /&gt;
* &#039;&#039;&#039;a&#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;
 !0    --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 !1    --&amp;gt; returns false&lt;br /&gt;
 &lt;br /&gt;
 !(3+4==6)    --&amp;gt; returns true&lt;br /&gt;
&lt;br /&gt;
==== Benutzung mit Variablen ====&lt;br /&gt;
&lt;br /&gt;
 ![var=a]&lt;br /&gt;
&lt;br /&gt;
===Hinweise===&lt;br /&gt;
* Wenn der Boolean b &#039;&#039;true&#039;&#039; ist gibt !b &#039;&#039;false&#039;&#039; zurück.&lt;br /&gt;
* Diese Funktion ist ein unärer Operator.&lt;br /&gt;
* Weitere unäre Operatoren sind [[unaryMinus]] und [[unaryPlus]]. &lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]][[Category:Operator]][[Kategorie:Booleanfunktionen]][[Kategorie:JACK2]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=BooleanAnd&amp;diff=10054</id>
		<title>BooleanAnd</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=BooleanAnd&amp;diff=10054"/>
		<updated>2024-03-13T11:44:39Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &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;
===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;
Achtung: In XML Dateien muss das Zeichen &amp;amp; durch &amp;amp;&#039;&#039;amp&#039;&#039;; ersetz werden!&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 true&lt;br /&gt;
 &lt;br /&gt;
 0 &amp;amp;&amp;amp; 1    --&amp;gt; returns false&lt;br /&gt;
 &lt;br /&gt;
 1 &amp;amp;&amp;amp; 0    --&amp;gt; returns false&lt;br /&gt;
 &lt;br /&gt;
 0 &amp;amp;&amp;amp; 0    --&amp;gt; returns false&lt;br /&gt;
 &lt;br /&gt;
 (2+4==6) &amp;amp;&amp;amp; (3+3==6)    --&amp;gt; returns true&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]][[Category:Operator]][[Kategorie:Booleanfunktionen]][[Kategorie:JACK2]][[Kategorie:JACK3]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=IsEmpty&amp;diff=10053</id>
		<title>IsEmpty</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=IsEmpty&amp;diff=10053"/>
		<updated>2024-03-13T11:25:36Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Benutzung von Variablen */&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;
== Beschreibung ==&lt;br /&gt;
Die Funktion &#039;&#039;isEmpty&#039;&#039; prüft ob ein gegebenes Objekt leer ist, also entweder keine Zeichen oder ausschließlich Leerzeichen beinhaltet, oder Leere Boxen, wie in Matritzen zu finden. Die Funktion erwartet ein Objekt und gibt einen Boolean zurück. &lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 isEmpty([[Objekt]] objekt)&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
* &#039;&#039;&#039;objekt&#039;&#039;&#039; - [[Objekt]], das auf leeren Inhalt geprüft wird&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;
 &#039;&#039;&#039;Jack2:&#039;&#039;&#039;&lt;br /&gt;
 isEmpty(&#039;  &#039;)   --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 isEmpty(&#039;nichtleer&#039;)   --&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Jack3:&#039;&#039;&#039;&lt;br /&gt;
 isEmpty( )    --&amp;gt; returns true&lt;br /&gt;
 &lt;br /&gt;
 isEmpty(&#039; &#039;)    --&amp;gt; returns false&lt;br /&gt;
 &lt;br /&gt;
 isEmpty(&#039;nichtleer&#039;)    --&amp;gt; returns false&lt;br /&gt;
&lt;br /&gt;
==== Benutzung von Variablen (Beispiele) ====&lt;br /&gt;
 isEmpty([input=fillin1])&lt;br /&gt;
&lt;br /&gt;
 isEmpty([var=a])&lt;br /&gt;
&lt;br /&gt;
=== Hinweise ===&lt;br /&gt;
* Anführungsstriche werden als Zeichenkette interpretiert, daher wird es nicht als leer gesehen.&lt;br /&gt;
* Ein Leerzeichen wird in JACK3 nicht mehr als leer interpretiert.&lt;br /&gt;
* Für die Überprüfung, ob die Platzhalter bei Formeln durch den Formeleditor leer gelassen wurde, steht die Funktion [[containsEditorPlaceholder|containsEditorPlaceholder()]] zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Chem-Evaluatorfunktion]][[Kategorie:Testfunktionen]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=StringLiteral_(R-GReQL)&amp;diff=10052</id>
		<title>StringLiteral (R-GReQL)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=StringLiteral_(R-GReQL)&amp;diff=10052"/>
		<updated>2024-03-12T15:37:30Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;StringLiteral stellt eine Zeichenkette dar. Der Knoten besitzt ein Attribut &amp;quot;value&amp;quot;, in dem der Wert gespeichert ist. Der Knoten wird in der Abbildung in blau dargestellt. [[Datei:6Literals.png|mini|&amp;lt;code&amp;gt;var4 &amp;lt;- 10; var5 &amp;lt;- 10.5; var6 &amp;lt;- &amp;quot;String&amp;quot;; var7 &amp;lt;- &#039;String&#039;&amp;lt;/code&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Der Knoten ist Teil der [[R-GReQL-Grammatik|GReQL-Grammatik]] für den [[StaticRChecker]].&lt;br /&gt;
&lt;br /&gt;
= Beispiel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;var &amp;lt;- &amp;lt;u&amp;gt;&amp;quot;String&amp;quot;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;var &amp;lt;- &amp;lt;u&amp;gt;&#039;String&#039;&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Hinweise =&lt;br /&gt;
&lt;br /&gt;
Der Wert von StringLiteral ist die Zeichenkette einschließlich ihrer Anführungszeichen. Da Anführungszeichen auch in GReQL-Regeln genutzt werden, um Zeichenketten zu kennzeichnen, müssen die zum StringLiteral gehörenden Anführungszeichen mit einem Backslash (&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;) escaped werden.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from&lt;br /&gt;
s2:V{StringLiteral} with&lt;br /&gt;
s2.value=&amp;quot;\&amp;quot;test\&amp;quot;&amp;quot;&lt;br /&gt;
report 0 end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:R-GReQL]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(JACK3)&amp;diff=9645</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=9645"/>
		<updated>2024-01-17T08:00:56Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Konfiguration_des_Kekul%C3%A9-Editors_(JACK3)&amp;diff=9319</id>
		<title>Konfiguration des Kekulé-Editors (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Konfiguration_des_Kekul%C3%A9-Editors_(JACK3)&amp;diff=9319"/>
		<updated>2023-11-14T14:29:20Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der web-basierte Editor für die studentische Eingabe im Aufgabwentyp &amp;quot;[[Molekül (JACK3)|Molekül]]&amp;quot; kann umfangreich konfiguriert werden, um Studierenden möglichst genau die Funktionen zur Verfügung zu stellen, die sie zur Bearbeitung der Aufgabe benötigen.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration kann dabei entweder durch einen Administrator zentral für die gesamte JACK-Instanz oder durch Lehrende individuell pro Aufgabe erfolgen.&lt;br /&gt;
&lt;br /&gt;
==Einstellungen für den Editor für Studierende==&lt;br /&gt;
===Einstellung für die allgemeinen Tool-Buttons===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche Buttons in der oberen Leiste des Editors verfügbar sind, also z. B. Laden, Speichern, Undo und Redo.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Namen der einzelnen Buttons können der Demo-Seite des Kekulé-Editors entnommen werden: http://partridgejiang.github.io/Kekule.js/demos/demoLauncher.html?id=composerCustomization&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleCommonToolButtons&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Es können weitere Voreinstellungen mit frei gewählten Namen angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;],&lt;br /&gt;
  &amp;quot;minimal&amp;quot; : [&amp;quot;undo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese können von Lehrenden dann alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von den gewählten Einstellung zeigt JACK ab Version 0.10.0 für Studierende niemand die Editor-Buttons zum Ändern der Einstellungen und zum Öffnen des Objekt-Inspektors an.&lt;br /&gt;
&lt;br /&gt;
===Einstellungen für die chemischen Tool-Buttons===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche Buttons in der linken und unteren Leiste des Editors verfügbar sind, also z. B. zum Erstellen von Bindungen und Atomen.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;manipulate&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;manipulateMarquee&amp;quot;, &amp;quot;manipulateLasso&amp;quot;, &amp;quot;manipulateAncestor&amp;quot;, &amp;quot;dragScroll&amp;quot;, &amp;quot;toggleSelect&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;erase&amp;quot;,&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;bond&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;bondSingle&amp;quot;,	&amp;quot;bondDouble&amp;quot;, &amp;quot;bondTriple&amp;quot;, &amp;quot;bondWedgeUp&amp;quot;, &amp;quot;bondWedgeDown&amp;quot;, &amp;quot;chain&amp;quot;, &amp;quot;trackInput&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;atomAndFormula&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;methane&amp;quot;, &amp;quot;atom&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;ring&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;ring3&amp;quot;, &amp;quot;ring4&amp;quot;, &amp;quot;ring5&amp;quot;, &amp;quot;ring6&amp;quot;, &amp;quot;flexRing&amp;quot;, &amp;quot;ringAr6&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;charge&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;chargeClear&amp;quot;, &amp;quot;chargePositive&amp;quot;, &amp;quot;chargeNegative&amp;quot; ]&lt;br /&gt;
	}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Namen der einzelnen Buttons können der Demo-Seite des Kekulé-Editors entnommen werden: http://partridgejiang.github.io/Kekule.js/demos/demoLauncher.html?id=composerCustomization&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleChemToolButtons&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;manipulate&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;manipulateMarquee&amp;quot;, &amp;quot;manipulateLasso&amp;quot;, &amp;quot;manipulateAncestor&amp;quot;, &amp;quot;dragScroll&amp;quot;, &amp;quot;toggleSelect&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;erase&amp;quot;,&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;bond&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;bondSingle&amp;quot;,	&amp;quot;bondDouble&amp;quot;, &amp;quot;bondTriple&amp;quot;, &amp;quot;bondWedgeUp&amp;quot;, &amp;quot;bondWedgeDown&amp;quot;, &amp;quot;chain&amp;quot;, &amp;quot;trackInput&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;atomAndFormula&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;methane&amp;quot;, &amp;quot;atom&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;ring&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;ring3&amp;quot;, &amp;quot;ring4&amp;quot;, &amp;quot;ring5&amp;quot;, &amp;quot;ring6&amp;quot;, &amp;quot;flexRing&amp;quot;, &amp;quot;ringAr6&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;charge&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;chargeClear&amp;quot;, &amp;quot;chargePositive&amp;quot;, &amp;quot;chargeNegative&amp;quot; ]&lt;br /&gt;
	}&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Wie bei den allgemeinen Buttons können weitere Voreinstellungen mit frei gewählten Namen angelegt werden, die dann von Lehrenden alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden können. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
===Einstellungen für die verfügbaren Object Modifier===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche zusätzlichen Buttons in der unteren Leiste des Editors verfügbar sind, wenn ein Element im Editor ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;quot;general&amp;quot;, &amp;quot;chemStruct&amp;quot;, &amp;quot;glyph&amp;quot;, &amp;quot;style&amp;quot;, &amp;quot;misc&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Namen der einzelnen Buttons können der Demo-Seite des Kekulé-Editors entnommen werden: http://partridgejiang.github.io/Kekule.js/demos/demoLauncher.html?id=composerCustomization&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleAllowedObjModifierCategories&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;general&amp;quot;, &amp;quot;chemStruct&amp;quot;, &amp;quot;glyph&amp;quot;, &amp;quot;style&amp;quot;, &amp;quot;misc&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Wie bei den allgemeinen Buttons können weitere Voreinstellungen mit frei gewählten Namen angelegt werden, die dann von Lehrenden alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden können. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
===Einstellungen für verfügbare Bindungsformen===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche Bindungsformen &#039;&#039;&#039;in den zusätzlichen Buttons&#039;&#039;&#039; in der unteren Leiste des Editors verfügbar sind. Bei Bindungsformen, die eigenen Buttons haben, müssen ggf. auch deren Einstellungen (siehe oben) konfiguriert werden. Dasselbe gilt für die Verfügbarkeit von Bindungen über Hotkeys (siehe unten).&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;single&amp;quot;: true,&lt;br /&gt;
    &amp;quot;double&amp;quot;: true,&lt;br /&gt;
    &amp;quot;triple&amp;quot;: false,&lt;br /&gt;
    &amp;quot;quad&amp;quot;: false,&lt;br /&gt;
    &amp;quot;explicitAromatic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;up&amp;quot;: true,&lt;br /&gt;
    &amp;quot;upInverted&amp;quot;: true,&lt;br /&gt;
    &amp;quot;down&amp;quot;: true,&lt;br /&gt;
    &amp;quot;downInverted&amp;quot;: true,&lt;br /&gt;
    &amp;quot;upOrDown&amp;quot;: true,&lt;br /&gt;
    &amp;quot;eOrZ&amp;quot;: true,&lt;br /&gt;
    &amp;quot;closer&amp;quot;: false,&lt;br /&gt;
    &amp;quot;ionic&amp;quot;: false,&lt;br /&gt;
    &amp;quot;coordinate&amp;quot;: false,&lt;br /&gt;
    &amp;quot;metallic&amp;quot;: false,&lt;br /&gt;
    &amp;quot;hydrogen&amp;quot;: false,&lt;br /&gt;
    &amp;quot;transition&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Auflistung enthält alle verfügbaren Namen von Bindungen, die jeweils über &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; aktiviert bzw. deaktiviert werden können.&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleAvailableBondForms&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : {&lt;br /&gt;
    &amp;quot;single&amp;quot;: true,&lt;br /&gt;
    &amp;quot;double&amp;quot;: true,&lt;br /&gt;
    &amp;quot;triple&amp;quot;: false,&lt;br /&gt;
    &amp;quot;quad&amp;quot;: false,&lt;br /&gt;
    &amp;quot;explicitAromatic&amp;quot;: true,&lt;br /&gt;
    &amp;quot;up&amp;quot;: true,&lt;br /&gt;
    &amp;quot;upInverted&amp;quot;: true,&lt;br /&gt;
    &amp;quot;down&amp;quot;: true,&lt;br /&gt;
    &amp;quot;downInverted&amp;quot;: true,&lt;br /&gt;
    &amp;quot;upOrDown&amp;quot;: true,&lt;br /&gt;
    &amp;quot;eOrZ&amp;quot;: true,&lt;br /&gt;
    &amp;quot;closer&amp;quot;: false,&lt;br /&gt;
    &amp;quot;ionic&amp;quot;: false,&lt;br /&gt;
    &amp;quot;coordinate&amp;quot;: false,&lt;br /&gt;
    &amp;quot;metallic&amp;quot;: false,&lt;br /&gt;
    &amp;quot;hydrogen&amp;quot;: false,&lt;br /&gt;
    &amp;quot;transition&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Wie bei den allgemeinen Buttons können weitere Voreinstellungen mit frei gewählten Namen angelegt werden, die dann von Lehrenden alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden können. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
===Einstellungen für verfügbare nicht-atomare Strukturelemente===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche zusätzlichen Strukturelemente außer Atomen in den zusätzlichen Buttons in der unteren Leiste des Editors verfügbar sind. Bei Elementen, die auch über Hotkeys gesetzt werden können, müssen ggf. auch deren Einstellungen (siehe unten) konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;RGroup&amp;quot;: true,&lt;br /&gt;
    &amp;quot;pseudoatomDummy&amp;quot;: true,&lt;br /&gt;
    &amp;quot;pseudoatomHetero&amp;quot;: true,&lt;br /&gt;
    &amp;quot;pseudoatomAny&amp;quot;: true,&lt;br /&gt;
    &amp;quot;variableAtomList&amp;quot;: false,&lt;br /&gt;
    &amp;quot;variableAtomNotList&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Auflistung enthält alle verfügbaren Namen von nicht-atomaren Elementen, die jeweils über &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; aktiviert bzw. deaktiviert werden können.&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleAvailableNonAtomTypes&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot;: {&lt;br /&gt;
    &amp;quot;RGroup&amp;quot;: true,&lt;br /&gt;
    &amp;quot;pseudoatomDummy&amp;quot;: true,&lt;br /&gt;
    &amp;quot;pseudoatomHetero&amp;quot;: true,&lt;br /&gt;
    &amp;quot;pseudoatomAny&amp;quot;: true,&lt;br /&gt;
    &amp;quot;variableAtomList&amp;quot;: false,&lt;br /&gt;
    &amp;quot;variableAtomNotList&amp;quot;: false&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Wie bei den allgemeinen Buttons können weitere Voreinstellungen mit frei gewählten Namen angelegt werden, die dann von Lehrenden alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden können. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
===Standard für die Anzeige von Wasserstoffatomen===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellung legt fest, ob alle Wasserstoffatome angezeigt werden oder die Standardeinstellung des Editors verwendet wird, die Wasserstoffatome nur in bestimmten Fällen anzeigt. Die Festlegung kann nur pro Aufgabe getroffen werden und nicht durch einen Administrator für die gesamte JACK-Instanz.&lt;br /&gt;
&lt;br /&gt;
==Einstellungen für alle Editoren==&lt;br /&gt;
===Hotkeys===&lt;br /&gt;
Administratoren können die Liste der verfügbaren Hotkeys für alle Editoren (d. h. sowohl für Studierende als auch Lehrende) ändern. Sie legen dazu im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleHotkeys&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;c&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_C&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;h&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_H&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;o&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_O&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;n&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_N&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;p&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_P&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;s&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_S&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;f&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_F&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Shift+C&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_Cl&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;b&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_Br&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;i&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_I&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Shift+B&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_B&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;k&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_K&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Shift+N&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_Na&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;d&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_D&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;m&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;subgroup_methyl&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;e&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;subgroup_ethyl&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;t&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;subgroup_TMS&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Shift+P&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;subgroup_phenyl&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Shift+T&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;subgroup_OTs&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Shift+E&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;subgroup_COOCH3&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;a&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_any&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;q&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_hetero&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;l&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;atom_variable&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;r&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;subgroup_R&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;1&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_single&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;2&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_double&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;3&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_triple&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;4&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_quad&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;b&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_closer&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;w&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_up&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;h&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_down&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Shift+W&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_down&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;y&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;bond_upOrDown&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Ctrl+A&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;selectAll&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Ctrl+C&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;copy&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Ctrl+X&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;cut&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Ctrl+V&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;paste&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Ctrl+Z&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;undo&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Ctrl+Shift+Z&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;redo&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;+&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;zoomIn&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;-&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;zoomOut&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Delete&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;eraseSelection&amp;quot; },&lt;br /&gt;
  { &amp;quot;key&amp;quot;: &amp;quot;Backspace&amp;quot;, &amp;quot;action&amp;quot;: &amp;quot;eraseSelection&amp;quot; }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Auflistung enthält alle verfügbaren Namen von Aktionen, denen ein Hotkey zugewiesen werden kann. Einträge können weggelassen werden, wenn die entsprechende Aktion nicht per Hotkey verfügbar sein soll.&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Konfiguration_des_Kekul%C3%A9-Editors_(JACK3)&amp;diff=9318</id>
		<title>Konfiguration des Kekulé-Editors (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Konfiguration_des_Kekul%C3%A9-Editors_(JACK3)&amp;diff=9318"/>
		<updated>2023-11-14T14:08:33Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der web-basierte Editor für die studentische Eingabe im Aufgabwentyp &amp;quot;[[Molekül (JACK3)|Molekül]]&amp;quot; kann umfangreich konfiguriert werden, um Studierenden möglichst genau die Funktionen zur Verfügung zu stellen, die sie zur Bearbeitung der Aufgabe benötigen.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration kann dabei entweder durch einen Administrator zentrale für die gesamte JACK-Instanz oder durch Lehrende individuell pro Aufgabe erfolgen.&lt;br /&gt;
&lt;br /&gt;
===Einstellung für die allgemeinen Tool-Buttons===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche Buttons in der oberen Leiste des Editors verfügbar sind, also z. B. Laden, Speichern, Undo und Redo.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Namen der einzelnen Buttons können der Demo-Seite des Kekulé-Editors entnommen werden: http://partridgejiang.github.io/Kekule.js/demos/demoLauncher.html?id=composerCustomization&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleCommonToolButtons&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Es können weitere Voreinstellungen mit frei gewählten Namen angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;],&lt;br /&gt;
  &amp;quot;minimal&amp;quot; : [&amp;quot;undo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese können von Lehrenden dann alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von den gewählten Einstellung zeigt JACK ab Version 0.10.0 für Studierende niemand die Editor-Buttons zum Ändern der Einstellungen und zum Öffnen des Objekt-Inspektors an.&lt;br /&gt;
&lt;br /&gt;
===Einstellungen für die chemischen Tool-Buttons===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche Buttons in der linken und unteren Leiste des Editors verfügbar sind, also z. B. zum Erstellen von Bindungen und Atomen.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;manipulate&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;manipulateMarquee&amp;quot;, &amp;quot;manipulateLasso&amp;quot;, &amp;quot;manipulateAncestor&amp;quot;, &amp;quot;dragScroll&amp;quot;, &amp;quot;toggleSelect&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;erase&amp;quot;,&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;bond&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;bondSingle&amp;quot;,	&amp;quot;bondDouble&amp;quot;, &amp;quot;bondTriple&amp;quot;, &amp;quot;bondWedgeUp&amp;quot;, &amp;quot;bondWedgeDown&amp;quot;, &amp;quot;chain&amp;quot;, &amp;quot;trackInput&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;atomAndFormula&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;methane&amp;quot;, &amp;quot;atom&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;ring&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;ring3&amp;quot;, &amp;quot;ring4&amp;quot;, &amp;quot;ring5&amp;quot;, &amp;quot;ring6&amp;quot;, &amp;quot;flexRing&amp;quot;, &amp;quot;ringAr6&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;charge&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;chargeClear&amp;quot;, &amp;quot;chargePositive&amp;quot;, &amp;quot;chargeNegative&amp;quot; ]&lt;br /&gt;
	}&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Namen der einzelnen Buttons können der Demo-Seite des Kekulé-Editors entnommen werden: http://partridgejiang.github.io/Kekule.js/demos/demoLauncher.html?id=composerCustomization&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleChemToolButtons&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;manipulate&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;manipulateMarquee&amp;quot;, &amp;quot;manipulateLasso&amp;quot;, &amp;quot;manipulateAncestor&amp;quot;, &amp;quot;dragScroll&amp;quot;, &amp;quot;toggleSelect&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;erase&amp;quot;,&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;bond&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;bondSingle&amp;quot;,	&amp;quot;bondDouble&amp;quot;, &amp;quot;bondTriple&amp;quot;, &amp;quot;bondWedgeUp&amp;quot;, &amp;quot;bondWedgeDown&amp;quot;, &amp;quot;chain&amp;quot;, &amp;quot;trackInput&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;atomAndFormula&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;methane&amp;quot;, &amp;quot;atom&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;ring&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;ring3&amp;quot;, &amp;quot;ring4&amp;quot;, &amp;quot;ring5&amp;quot;, &amp;quot;ring6&amp;quot;, &amp;quot;flexRing&amp;quot;, &amp;quot;ringAr6&amp;quot; ]&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;name&amp;quot;: &amp;quot;charge&amp;quot;,&lt;br /&gt;
		&amp;quot;attached&amp;quot;: [ &amp;quot;chargeClear&amp;quot;, &amp;quot;chargePositive&amp;quot;, &amp;quot;chargeNegative&amp;quot; ]&lt;br /&gt;
	}&lt;br /&gt;
]}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Wie bei den allgemeinen Buttons können weitere Voreinstellungen mit frei gewählten Namen angelegt werden, die dann von Lehrenden alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden können. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
===Einstellungen für die verfügbaren Object Modifier===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche zusätzlichen Buttons in der unteren Leiste des Editors verfügbar sind, wenn ein Element im Editor ausgewählt ist.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;quot;general&amp;quot;, &amp;quot;chemStruct&amp;quot;, &amp;quot;glyph&amp;quot;, &amp;quot;style&amp;quot;, &amp;quot;misc&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Namen der einzelnen Buttons können der Demo-Seite des Kekulé-Editors entnommen werden: http://partridgejiang.github.io/Kekule.js/demos/demoLauncher.html?id=composerCustomization&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleAllowedObjModifierCategories&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;general&amp;quot;, &amp;quot;chemStruct&amp;quot;, &amp;quot;glyph&amp;quot;, &amp;quot;style&amp;quot;, &amp;quot;misc&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Wie bei den allgemeinen Buttons können weitere Voreinstellungen mit frei gewählten Namen angelegt werden, die dann von Lehrenden alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden können. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Konfiguration_des_Kekul%C3%A9-Editors_(JACK3)&amp;diff=9317</id>
		<title>Konfiguration des Kekulé-Editors (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Konfiguration_des_Kekul%C3%A9-Editors_(JACK3)&amp;diff=9317"/>
		<updated>2023-11-14T14:00:18Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Die Seite wurde neu angelegt: „Der web-basierte Editor für die studentische Eingabe im Aufgabwentyp &amp;quot;Molekül&amp;quot; kann umfangreich konfiguriert werden, um Studierenden möglichst genau die Funktionen zur Verfügung zu stellen, die sie zur Bearbeitung der Aufgabe benötigen.  Die Konfiguration kann dabei entweder durch einen Administrator zentrale für die gesamte JACK-Instanz oder durch Lehrende individuell pro Aufgabe erfolgen.  ===Einstellung für die allgemeinen T…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der web-basierte Editor für die studentische Eingabe im Aufgabwentyp &amp;quot;[[Molekül (JACK3)|Molekül]]&amp;quot; kann umfangreich konfiguriert werden, um Studierenden möglichst genau die Funktionen zur Verfügung zu stellen, die sie zur Bearbeitung der Aufgabe benötigen.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration kann dabei entweder durch einen Administrator zentrale für die gesamte JACK-Instanz oder durch Lehrende individuell pro Aufgabe erfolgen.&lt;br /&gt;
&lt;br /&gt;
===Einstellung für die allgemeinen Tool-Buttons===&lt;br /&gt;
&lt;br /&gt;
Diese Einstellungen legen fest, welche Buttons in der oberen Leiste des Editors verfügbar sind, also z. B. Laden, Speichern, Undo und Redo.&lt;br /&gt;
&lt;br /&gt;
Um eine individuelle Konfiguration pro Aufgabe anzulegen, wählen Lehrende &amp;quot;Angepasst&amp;quot; und erstellen einen Eintrag der folgenden Form im Textfeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die verfügbaren Namen der einzelnen Buttons können der Demo-Seite des Kekulé-Editors entnommen werden: http://partridgejiang.github.io/Kekule.js/demos/demoLauncher.html?id=composerCustomization&lt;br /&gt;
&lt;br /&gt;
Um die Standardeinstellung der gesamten JACK-Instanz zu ändern, legen Administratoren im Bereich &amp;quot;Verwaltung -&amp;gt; Konfiguration&amp;quot; einen Eintrag mit Schlüssel &amp;quot;kekuleCommonToolButtons&amp;quot; und einem Wert der folgenden Form an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Eintrag &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; ist dabei fest vorgesehen für die Änderung der Standardeinstellung. Es können weitere Voreinstellungen mit frei gewählten Namen angelegt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;default&amp;quot; : [&amp;quot;newDoc&amp;quot;, &amp;quot;undo&amp;quot;, &amp;quot;redo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;],&lt;br /&gt;
  &amp;quot;minimal&amp;quot; : [&amp;quot;undo&amp;quot;, &amp;quot;copy&amp;quot;, &amp;quot;cut&amp;quot;, &amp;quot;paste&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese können von Lehrenden dann alternativ zur Standardeinstellung und der Anpassung pro Aufgabe gewählt werden. Wird vom Administrator kein Eintrag für &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; hinterlegt, gilt die Standardeinstellung des Editors.&lt;br /&gt;
&lt;br /&gt;
Unabhängig von den gewählten Einstellung zeigt JACK ab Version 0.10.0 für Studierende niemand die Editor-Buttons zum Ändern der Einstellungen und zum Öffnen des Objekt-Inspektors an.&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Molek%C3%BCl_(JACK3)&amp;diff=9316</id>
		<title>Molekül (JACK3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Molek%C3%BCl_(JACK3)&amp;diff=9316"/>
		<updated>2023-11-14T13:42:04Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Aufgabentyp &amp;quot;Molekül&amp;quot; ermöglich es Lehrenden nach bestimmten Molekülen, Reaktionsgleichungen oder ähnlichem zu fragen. Die Studierenden müssen dann die passende Struktur mithilfe eines Editors zeichnen. Dieser Aufgabentyp befindet sich derzeit noch im Aufbau, so dass spezielle Features in zukünftigen Versionen erweitert, verändert oder ergänmzt werden können.&lt;br /&gt;
&lt;br /&gt;
Der Aufgabentyp nutzt an verschiedenen Stellen die InChI-Notation (https://de.wikipedia.org/wiki/International_Chemical_Identifier), um Moleküle zu repräsentieren. Die Analyse studentischer Eingaben ist aber nicht auf Informationen beschränkt, die in InChI-Strings abgebildet werden können.&lt;br /&gt;
&lt;br /&gt;
===Aufgabeninhalt===&lt;br /&gt;
* &#039;&#039;&#039;Titel:&#039;&#039;&#039; Hier kann optional der Name der Stufe eingetragen werden.&lt;br /&gt;
* &#039;&#039;&#039;Aufgabentext:&#039;&#039;&#039; Im Aufgabentext steht die Aufgabenstellung. Mithilfe des Editors lässt sich die Aufgabenstellung einfach darstellen.&lt;br /&gt;
[[Datei:Molekuel_Aufgabentext.JPG|center]]&lt;br /&gt;
* &#039;&#039;&#039;Konfiguration des Editors:&#039;&#039;&#039; Hier können verschiedenen Einstellungen vorgenommen werden, mit denen die verfügbaren Funktionen des Molekül-Editors für die studentische Eingabe eingeschränkt werden können. Es besteht jeweils die Möglichkeit, zwischen einer Standardeinstellung und einer individuellen Einstellung pro Aufgabe zu wählen. Admins können zudem alternative Voreinstellungen definieren. Siehe dazu &amp;quot;[[Konfiguration des Kekulé-Editors]]&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Voreingestelltes Molekül im Editor:&#039;&#039;&#039; Hier kann eine Vorbelegung für den Editor erstellt werden, die den Studierenden beim Betreten der Aufgabe angezeigt wird. Klicken Sie rechts auf das Stift-Symbol, um einen Moleküleditor zu öffnen und die Vorbelegung zu erstellen oder zu ändern. In der Übersicht wird die Vorbelegung als InChI-String angezeigt. Es bleiben aber auch alle weiteren Bestandteile (z. B. Reaktionspfeile) erhalten, selbst wenn sie nicht im InChI-String abgebildet werden können.&lt;br /&gt;
&lt;br /&gt;
===Feedback===&lt;br /&gt;
Beim Feedback stehen verschiedene Standardoptionen und spezielle Features zur Verfügung.&lt;br /&gt;
* &#039;&#039;&#039;Gewichtung des Aufgabenteils:&#039;&#039;&#039; Gewichtung der Punktzahl einer Stufe innerhalb der Aufgabe.&lt;br /&gt;
* &#039;&#039;&#039;Aufgabentext:&#039;&#039;&#039; Zur Übersicht und besseren Erstellung des Feedbacks wird der Aufgabentext hier nochmal angezeigt.&lt;br /&gt;
* &#039;&#039;&#039;Erweiterte Eingabeanalyse:&#039;&#039;&#039; Die erweitere Eingabeanalyse ist derzeit im Aufbau. Es steht nur eine Funktion zur Verfügung, die nach Reaktionspfeilen sucht und die gefundenen Moleküle in Bezug auf diese Reaktionen auswertet und zuordnet. Dadurch entstehen zusätzliche Variablen, die im Folgenden in den Feedback-Regeln genutzt werden können (siehe unten). Das System nutzt zur Erkennung und Zuordnung gewisse Suchbereiche vor und nach sowie über und unter den Reaktionspfeilen.&lt;br /&gt;
* &#039;&#039;&#039;Erwartete Lösung:&#039;&#039;&#039; Hier wird die Formel der richtigen Lösung eingetragen. Klicken Sie rechts auf das Stift-Symbol, um einen Moleküleditor zu öffnen und die erwartete Lösung zu erstellen oder zu ändern. In der Übersicht wird die erwartete Lösung als InChI-String angezeigt.&lt;br /&gt;
[[Datei:Molekuel_erwarteteEingabe.JPG|center]]&lt;br /&gt;
* &#039;&#039;&#039;Feedback bei korrekter Antwort:&#039;&#039;&#039; Der Feedbacktext, der ausgegeben werden soll, wenn die Eingabe der erwarteten Lösung entspricht. Das System prüft dazu, ob die studentische Eingabe genau dieselben InChI-Strings enthält wie die erwartete Lösung. Die Reihenfolge der Eingabe sowie die Position auf der Zeichenfläche wird dabei ignoriert.&lt;br /&gt;
* &#039;&#039;&#039;Feedback bei falscher Antwort:&#039;&#039;&#039; Der Feedbacktext, der ausgegeben wird, wenn die studentische Eingabe nicht der erwarteten Lösung entspricht.&lt;br /&gt;
* &#039;&#039;&#039;Weitere Feedbacks (optional):&#039;&#039;&#039; Analog zum Aufgabentyp &amp;quot;[[Fill-In]]&amp;quot; können weitere Regeln angegeben werden, die jeweils Feedback auslösen. Anders als bei der erwarteten Lösung steht hier kein Molekül-Editor zur Verfügung. Stattdessen müssen passende [[Evaluator]]-Funktionen genutzt werden, um die studentische Eingabe zu analysieren. Diese steht dazu als Variablen der Form &amp;lt;code&amp;gt;[input=...]&amp;lt;/code&amp;gt; zur Verfügung (siehe unten).&lt;br /&gt;
* &#039;&#039;&#039;Feedback beim Überspringen:&#039;&#039;&#039; Der Lehrende kann jede Fill-In oder Drop-Down Stufe zum Überspringen anbieten. Dazu muss zunächst der Haken gesetzt werden. Danach gibt es noch die Möglichkeit einen Text den Lernenden anzuzeigen, wenn dieser diese Stufe übersprungen hat. Den Text kann man wieder über die Icons Schlüssel oder Stift hinzufügen.&lt;br /&gt;
&lt;br /&gt;
===Hinweise===&lt;br /&gt;
Jede Stufe kann beliebig viele Hinweise anbieten. Alle weiteren Information wie man Hinweise angibt sind [[Hinweise (JACK3)|hier]] zu finden.&lt;br /&gt;
&lt;br /&gt;
===Verknüpfungen===&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil (Standard):&#039;&#039;&#039; In dem Drop-Down Feld wird der nächste Zustand ausgewählt, in die die Aufgabe sein soll, wenn der Lernende eine Lösung eingereicht hat. Dieses wird immer dann durchgeführt, wenn keine andere Aktion zutrifft. Es gibt die folgenden Möglichkeiten: &lt;br /&gt;
** &#039;&#039;&#039;Ende der Aufgabe:&#039;&#039;&#039; Die Aufgabe ist mit der Aktion des Lernenden beendet.&lt;br /&gt;
** &#039;&#039;&#039;Aufgabenteil wiederholen:&#039;&#039;&#039; Der Aufgabenteil wird wiederholt. Der Lernende kann ein weiteres Ergebnis einreichen. Diese Aktion kann man z.B. bei Übungsaufgaben benutzen, wenn der Lernende eine Aufgabe solange wiederholen soll, bis das richtige Ergebnis eingereicht wurde.&lt;br /&gt;
** &#039;&#039;&#039;#x (x ist dabei eine beliebige Stufe dieser Aufgabe):&#039;&#039;&#039; Die entsprechende Stufe wird als nächstes angezeigt. Wenn man die Stufennummer der aktuellen Stufe wählt wird diese Stufe neu aufgerufen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Weitere nächste Aufgabenteile (optional):&#039;&#039;&#039; Hier kann die nächste Aktion dynamisch eingestellt werden, d.h. sie kann abhängig von der Variablen Konstelation sein oder von der Eingabe des Lernenden.&lt;br /&gt;
* &#039;&#039;&#039;Nächster Aufgabenteil beim Überspringen (optional):&#039;&#039;&#039; Hier wird eingestellt welcher nächste Aufgabenteil angezeigt werden soll, wennn der Lernende die Stufe übersprungen hat. Diese Einstellungsmöglichkeit steht nur zur Verfügung, wenn der Haken im Tab Feedback fürs Überspringen gesetzt wurde.&lt;br /&gt;
&lt;br /&gt;
===Variablenupdates===&lt;br /&gt;
Die Variablenupdates stehen nur zur Verfügung, wenn die Aufgabe auch Variablen hat. Es gelten die [[Variablenupdates (JACK3)|allgemeinen Informationen zum Anlegen von Variablenupdates]].&lt;br /&gt;
&lt;br /&gt;
Die folgenden Variablen stehen speziell im Aufgabentyp &amp;quot;Molekül&amp;quot; für &#039;&#039;&#039;jede&#039;&#039;&#039; studentische Einreichung zur Verfügung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[input=inchi]&amp;lt;/code&amp;gt;|| Enthält eine Liste von Strings, die jeweils einem InChI-String eines eingegebenen Molekül entsprechen.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[input=inchi_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Enthält jeweils einen InChI-String aus der studentischen Eingabe.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die folgenden Variablen stehen &#039;&#039;&#039;zusätzlich&#039;&#039;&#039; zur Verfügung, wenn die &#039;&#039;&#039;erweiterte Eingabeanalyse&#039;&#039;&#039; genutzt wurde:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=reactions]&amp;lt;/code&amp;gt;|| Anzahl der erkannten Reaktionen (entspricht der Anzahl der gefundenen Reaktionspfeile).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=reactionType_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Typ der jeweiligen Reaktion entsprechend des im Editor verwendeten Reaktionspfeils.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=educts_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als Edukt der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=products_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als Produkt der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=minorEducts_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als anorganisches Edukt oder sonstige Information oberhalb des Reaktionspfeils (z. B. &amp;quot;Hitze&amp;quot;) der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[check=minorProducts_X]&amp;lt;/code&amp;gt; (mit X = 1,2,...)|| Liste von Strings, die jeweils einem InChI-String eines Moleküls entsprechen, das als anorganisches Produkt oder sonstige Information unterhalb des Reaktionspfeils der jeweiligen Reaktion erkannt wurde.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===studentische Eingabe===&lt;br /&gt;
Die studentische Eingabe erfolgt über den Molekül-Editor von Kekule, indem man mit einigen Hilfsmitteln die Moleküle zeichnen kann. Die studentische Lösung des oben genannten Beispiels würde dann wie folgt aussehen:&lt;br /&gt;
[[Datei:Molekuel_studentischeEingabe.JPG|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:Benutzerhandbuch]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(JACK3)&amp;diff=9080</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=9080"/>
		<updated>2023-10-17T06:32:59Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Equals&amp;diff=9045</id>
		<title>Equals</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Equals&amp;diff=9045"/>
		<updated>2023-09-25T08:29:43Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Benutzung von Variablen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Zugehörige Evaluatoren==&lt;br /&gt;
*&#039;&#039;&#039;MathEvaluator&#039;&#039;&#039;&lt;br /&gt;
=== Beschreibung ===&lt;br /&gt;
Die Funktion &#039;&#039;equals&#039;&#039; vergleicht zwei Zeichenketten auf ihre exakte Übereinstimmung. Die Funktion erwartet zwei Strings und gibt einen Boolean zurück.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
 equals([[Zeichenkette]] zeichenkette1, [[Zeichenkette]] zeichenkette2)&lt;br /&gt;
 Die Zeichenketten sollten in einfachen Anführungszeichen stehen, da sonst bei Rechenausdrücken das Ergebnis verglichen wird.&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
* &#039;&#039;&#039;zeichenkette1&#039;&#039;&#039; - erste zu vergleichende Zeichenkette&lt;br /&gt;
* &#039;&#039;&#039;zeichenkette2&#039;&#039;&#039; - zweite zu vergleichende Zeichenkette&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;
 equals(&#039;hallo&#039;,&#039;hallo&#039;)   --&amp;gt; returns true&lt;br /&gt;
 equals(&#039;JACK&#039;,&#039;jack&#039;)   --&amp;gt; returns false&lt;br /&gt;
 equals(&#039;2&#039;, &#039;sqrt(4)&#039;)  --&amp;gt; returns false&lt;br /&gt;
 equals(2, sqrt(4))  --&amp;gt; returns true&lt;br /&gt;
&lt;br /&gt;
==== Benutzung von Variablen ====&lt;br /&gt;
 equals([input=antwort1],&#039;text&#039;)&lt;br /&gt;
 equals(&#039;text&#039;,[var=a])&lt;br /&gt;
 equals([var=b],[input=antwort2])&lt;br /&gt;
&lt;br /&gt;
=== Hinweise ===&lt;br /&gt;
* Es wird zwischen Groß- und Kleinschreibung unterschieden.&lt;br /&gt;
* Die Funktion &#039;&#039;equals&#039;&#039; vergleicht zwei strings, auch Leerzeichen werden gezählt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Math-Evaluatorfunktion]][[Kategorie:Zeichenkettenfunktionen]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(JACK3)&amp;diff=9003</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=9003"/>
		<updated>2023-09-19T06:15:53Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8974</id>
		<title>GReQL-Typegraph für Java</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8974"/>
		<updated>2023-08-25T10:54:49Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grundsätzlich folgt der Typegraph für GReQL-Queries zu Java der Java Language Specification für Java 8. Der Syntaxgraph wird durch den Eclipse-Parser erzeugt und verwendet die entsprechenden Namen für die Syntaxelemente. An einigen Stellen gibt es kleine Vereinfachungen und Erweiterungen.&lt;br /&gt;
&lt;br /&gt;
== Typegraph-Definitionen == &lt;br /&gt;
&lt;br /&gt;
=== Knotentypen ===&lt;br /&gt;
&lt;br /&gt;
Alle Knoten erben vom abstrakten Typen &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;. Zwei spezielle Knoten werden durch den Eclipse-Parser erzeugt und bilden die Wurzel und das erste Kind-Element des Syntaxbaumes.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Node;&lt;br /&gt;
VertexClass IJavaProject: Node { name:String };&lt;br /&gt;
VertexClass IPackageFragment: Node { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Sprachelemente von Java erben von &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; und erhalten darüber eine Zuordnung zu einer Zeilennummer.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Element: Node { line:Integer };&lt;br /&gt;
VertexClass AnonymousClassDeclaration:Element;&lt;br /&gt;
VertexClass CatchClause:Element;&lt;br /&gt;
VertexClass Comment:Element;&lt;br /&gt;
VertexClass CompilationUnit:Element { name:String };&lt;br /&gt;
VertexClass Dimension:Element;&lt;br /&gt;
VertexClass ImportDeclaration:Element { name:String, onDemand:Boolean, static:Boolean };&lt;br /&gt;
VertexClass Javadoc:Element;&lt;br /&gt;
VertexClass MemberRef:Element;&lt;br /&gt;
VertexClass MemberValuePair:Element;&lt;br /&gt;
VertexClass MethodRef:Element;&lt;br /&gt;
VertexClass MethodRefParameter:Element { varargs:Boolean };&lt;br /&gt;
VertexClass Modifier:Element { name:String };&lt;br /&gt;
VertexClass PackageDeclaration:Element { name:String };&lt;br /&gt;
VertexClass TagElement:Element { name:String };&lt;br /&gt;
VertexClass TextElement:Element { content:String };&lt;br /&gt;
VertexClass TypeParameter:Element;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deklarationen innerhalb einer Klasse (im Gegensatz zu den oben enthaltenen Import-Deklarationen) erben vom Typ &amp;lt;code&amp;gt;BodyDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass BodyDeclaration:Element;&lt;br /&gt;
VertexClass AnnotationTypeMemberDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass FieldDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass MethodDeclaration:BodyDeclaration { name:String, constructor:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass EnumConstantDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass Initializer:BodyDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klassendekelartionen selber erben vom Typ &amp;lt;code&amp;gt;AbstractTypeDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass AbstractTypeDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass AnnotationTypeDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
VertexClass TypeDeclaration:AbstractTypeDeclaration { name:String, interface:Boolean };&lt;br /&gt;
VertexClass EnumDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Typ-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt; zum Einsatz, ggf. auch von dessen Unterklasse &amp;lt;code&amp;gt;AnnotatableType&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Type:Element;&lt;br /&gt;
VertexClass ArrayType:Type { dimensions:Integer };&lt;br /&gt;
VertexClass IntersectionType:Type;&lt;br /&gt;
VertexClass ParameterizedType:Type { name:String };&lt;br /&gt;
VertexClass UnionType:Type;	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass AnnotatableType:Type;&lt;br /&gt;
VertexClass PrimitiveType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass SimpleType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass QualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass NameQualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass WildcardType:AnnotatableType { upperBound:Boolean };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen können einzeln oder als sogenanntes Fragment deklariert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass VariableDeclaration:Element;&lt;br /&gt;
VertexClass SingleVariableDeclaration:VariableDeclaration { name:String, varargs:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass VariableDeclarationFragment:VariableDeclaration { name:String, dimension:Integer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Anweisungen erben von &amp;lt;code&amp;gt;Statement&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Statement:Element;&lt;br /&gt;
VertexClass AssertStatement:Statement;&lt;br /&gt;
VertexClass Block:Statement;&lt;br /&gt;
VertexClass BreakStatement:Statement { name:String };&lt;br /&gt;
VertexClass ConstructorInvocation:Statement;&lt;br /&gt;
VertexClass ContinueStatement:Statement { name:String };&lt;br /&gt;
VertexClass DoStatement:Statement;&lt;br /&gt;
VertexClass EmptyStatement:Statement;&lt;br /&gt;
VertexClass EnhancedForStatement:Statement;&lt;br /&gt;
VertexClass ExpressionStatement:Statement;&lt;br /&gt;
VertexClass ForStatement:Statement;&lt;br /&gt;
VertexClass IfStatement:Statement;&lt;br /&gt;
VertexClass LabeledStatement:Statement;&lt;br /&gt;
VertexClass ReturnStatement:Statement;&lt;br /&gt;
VertexClass SuperConstructorInvocation:Statement;&lt;br /&gt;
VertexClass SwitchCase:Statement;&lt;br /&gt;
VertexClass SwitchStatement:Statement;&lt;br /&gt;
VertexClass SynchronizedStatement:Statement;&lt;br /&gt;
VertexClass ThrowStatement:Statement;&lt;br /&gt;
VertexClass TryStatement:Statement;&lt;br /&gt;
VertexClass TypeDeclarationStatement:Statement;&lt;br /&gt;
VertexClass VariableDeclarationStatement:Statement;&lt;br /&gt;
VertexClass WhileStatement:Statement;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Ausdrücke erben von &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Expression:Element;&lt;br /&gt;
VertexClass ArrayAccess:Expression;&lt;br /&gt;
VertexClass ArrayCreation:Expression;&lt;br /&gt;
VertexClass ArrayInitializer:Expression;&lt;br /&gt;
VertexClass Assignment:Expression { name:String };&lt;br /&gt;
VertexClass BooleanLiteral:Expression { content:String };&lt;br /&gt;
VertexClass CastExpression:Expression;&lt;br /&gt;
VertexClass CharacterLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ClassInstanceCreation:Expression;&lt;br /&gt;
VertexClass ConditionalExpression:Expression;&lt;br /&gt;
VertexClass FieldAccess:Expression;&lt;br /&gt;
VertexClass InfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass InstanceofExpression:Expression;&lt;br /&gt;
VertexClass LambdaExpression:Expression { parantheses:Boolean };&lt;br /&gt;
VertexClass MethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass NullLiteral:Expression;&lt;br /&gt;
VertexClass NumberLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ParenthesizedExpression:Expression;&lt;br /&gt;
VertexClass PostfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass PrefixExpression:Expression { name:String };&lt;br /&gt;
VertexClass StringLiteral:Expression { content:String };&lt;br /&gt;
VertexClass SuperFieldAccess:Expression;&lt;br /&gt;
VertexClass SuperMethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass ThisExpression:Expression;&lt;br /&gt;
VertexClass TypeLiteral:Expression;&lt;br /&gt;
VertexClass VariableDeclarationExpression:Expression;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Variablen und Methoden-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; zum Einsatz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Name:Expression;&lt;br /&gt;
VertexClass SimpleName:Name { name:String };&lt;br /&gt;
VertexClass QualifiedName:Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotationen erben von &amp;lt;code&amp;gt;Annotation&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Annotation:Expression;&lt;br /&gt;
VertexClass MarkerAnnotation:Annotation;&lt;br /&gt;
VertexClass NormalAnnotation:Annotation;&lt;br /&gt;
VertexClass SingleMemberAnnotation:Annotation;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methoden-Referenzen erben von &amp;lt;code&amp;gt;MethodReference&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass MethodReference:Expression;&lt;br /&gt;
VertexClass CreationReference:MethodReference;&lt;br /&gt;
VertexClass ExpressionMethodReference:MethodReference;&lt;br /&gt;
VertexClass SuperMethodReference:MethodReference { name:String };&lt;br /&gt;
VertexClass TypeMethodReference:MethodReference { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kantentypen ===&lt;br /&gt;
&lt;br /&gt;
Die Verbindung zwischen Knoten hat auch jeweils einen Kantentyp, der sich aus den beteiligten Typen (oder ggf. deren Obertypen) ergibt. Alle Beziehungen sind als Eltern-Kind-Beziehung definiert, die die Baumstruktur abbildet. Hat ein Eltern-Knoten mehrere Kinder, sind diese entsprechend ihrer Reihenfolge im Code über ein Attribut der Kante durchnummeriert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract EdgeClass Child from Node (0,1) to Node (0,*) { position:Integer } ;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationAnnotations:Child from AnnotationTypeDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationBodyDeclarations:Child from AnnotationTypeDeclaration (1,1) to AnnotationTypeMemberDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationModifiers:Child from AnnotationTypeDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationName:Child from AnnotationTypeDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationAnnotations:Child from AnnotationTypeMemberDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationDefault:Child from AnnotationTypeMemberDeclaration (1,1) to Expression (0,1) role default;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationModifiers:Child from AnnotationTypeMemberDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationName:Child from AnnotationTypeMemberDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationType:Child from AnnotationTypeMemberDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass AnonymousClassDeclarationBodyDeclarations:Child from AnonymousClassDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass ArrayAccessArray:Child from ArrayAccess (1,1) to Expression (0,1) role array;&lt;br /&gt;
EdgeClass ArrayAccessIndex:Child from ArrayAccess (1,1) to Expression (0,1) role index;&lt;br /&gt;
EdgeClass ArrayCreationDimensions:Child from ArrayCreation (1,1) to Expression (0,*) role dimensions;&lt;br /&gt;
EdgeClass ArrayCreationInitializer:Child from ArrayCreation (1,1) to ArrayInitializer (0,1) role initializer;&lt;br /&gt;
EdgeClass ArrayCreationType:Child from ArrayCreation (1,1) to ArrayType (0,1) role type;&lt;br /&gt;
EdgeClass ArrayInitializerExpressions:Child from ArrayInitializer (1,1) to Expression (0,*) role expressions;&lt;br /&gt;
EdgeClass ArrayTypeComponentType:Child from ArrayType (1,1) to Type (0,1) role elementType;&lt;br /&gt;
EdgeClass AssertStatementMessage:Child from AssertStatement (1,1) to Expression (0,1) role message;&lt;br /&gt;
EdgeClass AssignmentLeftHandSide:Child from Assignment (1,1) to Expression (0,1) role leftHandSide;&lt;br /&gt;
EdgeClass AssignmentRightHandSide:Child from Assignment (1,1) to Expression (0,1) role rightHandSide;&lt;br /&gt;
EdgeClass BlockStatements:Child from Block (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass BodyDeclarationJavadoc:Child from BodyDeclaration (1,1) to Javadoc (0,1) role javadoc;&lt;br /&gt;
EdgeClass CastExpressionType:Child from CastExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CatchClauseBody:Child from CatchClause (1,1) to Block (0,*) role body;&lt;br /&gt;
EdgeClass CatchClauseException:Child from CatchClause (1,1) to SingleVariableDeclaration (0,*) role exception;&lt;br /&gt;
EdgeClass ClassInstanceCreationAnonymousClassDecl:Child from ClassInstanceCreation (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass ClassInstanceCreationArguments:Child from ClassInstanceCreation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ClassInstanceCreationType:Child from ClassInstanceCreation (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CompilationUnitImports:Child from CompilationUnit (1,1) to ImportDeclaration (0,*) role imports;&lt;br /&gt;
EdgeClass CompilationUnitPackage:Child from CompilationUnit (1,1) to PackageDeclaration (0,*) role package;&lt;br /&gt;
EdgeClass CompilationUnitTypes:Child from CompilationUnit (1,1) to AbstractTypeDeclaration (0,*) role types;&lt;br /&gt;
EdgeClass ConditionalExpressionElseExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role elseExpression;&lt;br /&gt;
EdgeClass ConditionalExpressionThenExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role thenExpression;&lt;br /&gt;
EdgeClass ConstructorInvocationArguments:Child from ConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ConstructorInvocationTypeArguments:Child from ConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceTypeArguments:Child from CreationReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceType:Child from CreationReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass DimensionAnnotations:Child from Dimension (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass DoStatementBody:Child from DoStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass ElementExpression:Child from Element (1,1) to Expression (0,*) role expression;&lt;br /&gt;
EdgeClass EnhancedForStatementBody:Child from EnhancedForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass EnhancedForStatementParameter:Child from EnhancedForStatement (1,1) to SingleVariableDeclaration (0,1) role parameter;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnonymousClassDeclaration:Child from EnumConstantDeclaration (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnnotations:Child from EnumConstantDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumConstantDeclarationArguments:Child from EnumConstantDeclaration (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass EnumConstantDeclarationModifiers:Child from EnumConstantDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumConstantDeclarationName:Child from EnumConstantDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationAnnotations:Child from EnumDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumDeclarationBodyDeclaration:Child from EnumDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass EnumDeclarationEnumConstants:Child from EnumDeclaration (1,1) to EnumConstantDeclaration (0,*) role enumConstants;&lt;br /&gt;
EdgeClass EnumDeclarationModifiers:Child from EnumDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumDeclarationName:Child from EnumDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationSuperInterfaceTypes:Child from EnumDeclaration (1,1) to Type (0,*) role superInterfaceTypes; &lt;br /&gt;
EdgeClass ExpressionMethodReferenceArguments:Child from ExpressionMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass ExpressionMethodReferenceName:Child from ExpressionMethodReference (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldAccessName:Child from FieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldDeclarationAnnotation:Child from FieldDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass FieldDeclarationFragments:Child from FieldDeclaration (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass FieldDeclarationModifiers:Child from FieldDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass FieldDeclarationType:Child from FieldDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass ForStatementBody:Child from ForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass ForStatementInitializers:Child from ForStatement (1,1) to Expression (0,*) role initializers;&lt;br /&gt;
EdgeClass ForStatementUpdaters:Child from ForStatement (1,1) to Expression (0,*) role updaters;&lt;br /&gt;
EdgeClass IfStatementElseStatement:Child from IfStatement (1,1) to Statement (0,1) role elseStatement;&lt;br /&gt;
EdgeClass IfStatementThenStatement:Child from IfStatement (1,1) to Statement (0,1) role thenStatement;&lt;br /&gt;
EdgeClass IJavaProjectFragements:Child from IJavaProject (1,1) to IPackageFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass IJavaProjectUnits:Child from IJavaProject (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass InfixExpressionExtendedOperands:Child from InfixExpression (1,1) to Expression (0,*) role extendedOperands;&lt;br /&gt;
EdgeClass InfixExpressionLeftOperand:Child from InfixExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InfixExpressionRightOperand:Child from InfixExpression (1,1) to Expression (0,1) role rightOperand;&lt;br /&gt;
EdgeClass InitializerAnnotation:Child from Initializer (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass InitializerBody:Child from Initializer (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass InitializerModifiers:Child from Initializer (1,1) to Modifier(0,*) role modifiers2;&lt;br /&gt;
EdgeClass IntersectionTypeTypes:Child from IntersectionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass InstanceofExpressionLeftOperand:Child from InstanceofExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InstanceofExpressionRightOperand:Child from InstanceofExpression (1,1) to Type (0,1) role rightOperand;&lt;br /&gt;
EdgeClass IPackageFragmentUnits:Child from IPackageFragment (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass JavadocTags:Child from Javadoc (1,1) to TagElement (0,*) role tags;&lt;br /&gt;
EdgeClass LambdaExpressionBody:Child from LambdaExpression (1,1) to Element (0,1) role body;&lt;br /&gt;
EdgeClass LambdaExpressionParameters:Child from LambdaExpression (1,1) to VariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass LabeledStatementBody:Child from LabeledStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass LabeledStatementLabel:Child from LabeledStatement (1,1) to SimpleName (0,1) role label;&lt;br /&gt;
EdgeClass MarkerAnnotationTypeName:Child from MarkerAnnotation (1,1) to SimpleName (0,*) role typeName;&lt;br /&gt;
EdgeClass MemberRefName:Child from MemberRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberRefQualifier:Child from MemberRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MemberValuePairName:Child from MemberValuePair (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberValuePairValue:Child from MemberValuePair (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass MethodDeclarationAnnotation:Child from MethodDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass MethodDeclarationBody:Child from MethodDeclaration (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass MethodDeclarationModifiers:Child from MethodDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass MethodDeclarationParameters:Child from MethodDeclaration (1,1) to SingleVariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverQualifier:Child from MethodDeclaration (1,1) to SimpleName (0,1) role receiverQualifier;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverType:Child from MethodDeclaration (1,1) to Type (0,1) role receiverType;&lt;br /&gt;
EdgeClass MethodDeclarationReturnType:Child from MethodDeclaration (1,1) to Type (0,1) role returnType2;&lt;br /&gt;
EdgeClass MethodDeclarationThrownExceptions:Child from MethodDeclaration (1,1) to Type (0,*) role thrownExceptionTypes;&lt;br /&gt;
EdgeClass MethodDeclarationTypeParameters:Child from MethodDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass MethodInvocationArguments:Child from MethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass MethodRefName:Child from MethodRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameters:Child from MethodRef (1,1) to MethodRefParameter (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodRefQualifier:Child from MethodRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MethodRefParameterName:Child from MethodRefParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameterType:Child from MethodRefParameter (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass NormalAnnotationTypeName:Child from NormalAnnotation (1,1) to Name (0,1) role typeName;&lt;br /&gt;
EdgeClass NormalAnnotationValues:Child from NormalAnnotation (1,1) to MemberValuePair (0,*) role values;&lt;br /&gt;
EdgeClass ParameterizedTypeType:Child from ParameterizedType (1,1) to SimpleType (0,1) role type;&lt;br /&gt;
EdgeClass ParameterizedTypeTypeArguments:Child from ParameterizedType (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass PostfixExpressionOperand:Child from PostfixExpression (1,1) to SimpleName (0,1) role operand;&lt;br /&gt;
EdgeClass PrefixExpressionOperand:Child from PrefixExpression (1,1) to Expression (0,1) role operand;&lt;br /&gt;
EdgeClass QualifiedNameName:Child from QualifiedName (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass QualifiedNameQualifier:Child from QualifiedName (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SimpleNameValues:Child from SimpleName (1,1) to MethodDeclaration (0,*) role values;&lt;br /&gt;
EdgeClass SimpleTypeAnnotation:Child from SimpleType (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass SimpleTypeName:Child from SimpleType (1,1) to Name (0,1) role name2;&lt;br /&gt;
EdgeClass SingleMemberAnnotationTypeName:Child from SingleMemberAnnotation (1,1) to SimpleName (0,1) role typeName;&lt;br /&gt;
EdgeClass SingleMemberAnnotationValue:Child from SingleMemberAnnotation (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass SingleVariableDeclarationAnnotation:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass SingleVariableDeclarationExtraDimensions:Child from SingleVariableDeclaration (1,1) to Dimension (0,*) role extraDimensions2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationInitializer:Child from SingleVariableDeclaration (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass SingleVariableDeclarationModifiers:Child from SingleVariableDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationType:Child from SingleVariableDeclaration (1,1) to Type (0,*) role type;&lt;br /&gt;
EdgeClass SingleVariableDeclarationVarargsAnnotations:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role varargsAnnotations;&lt;br /&gt;
EdgeClass SuperConstructorInvocationArgument:Child from SuperConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperConstructorInvocationTypeArguments:Child from SuperConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperFieldAccessName:Child from SuperFieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass SuperFieldAccessQualifier:Child from SuperFieldAccess(1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodInvocationArguments:Child from SuperMethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperMethodInvocationQualifier:Child from SuperMethodInvocation (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodReferenceArguments:Child from SuperMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperMethodReferenceQualifier:Child from SuperMethodReference (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SwitchStatementStatements:Child from SwitchStatement (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass SynchronizedStatementBlock:Child from SynchronizedStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass TagElementFragments1:Child from TagElement (1,1) to TextElement (0,*) role fragments1;&lt;br /&gt;
EdgeClass TagElementFragments2:Child from TagElement (1,1) to Name (0,*) role fragments2;&lt;br /&gt;
EdgeClass TagElementFragments3:Child from TagElement (1,1) to MethodRef (0,*) role fragments3;&lt;br /&gt;
EdgeClass TagElementFragments4:Child from TagElement (1,1) to MemberRef (0,*) role fragments4;&lt;br /&gt;
EdgeClass TagElementFragments5:Child from TagElement (1,1) to TagElement (0,*) role fragments5;&lt;br /&gt;
EdgeClass ThisExpressionQualifier:Child from ThisExpression (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass TryStatementBody:Child from TryStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass TryStatementCatchClauses:Child from TryStatement (1,1) to CatchClause (0,*) role catchClauses;&lt;br /&gt;
EdgeClass TryStatementFinally:Child from TryStatement (1,1) to Block (0,1) role finally;&lt;br /&gt;
EdgeClass TryStatementResources:Child from TryStatement (1,1) to VariableDeclarationExpression (0,*) role resources;&lt;br /&gt;
EdgeClass TypeDeclarationAnnotation:Child from TypeDeclaration (1,1) to Annotation (0,*) role modifiers2;&lt;br /&gt;
EdgeClass TypeDeclarationBodyDeclarations1:Child from TypeDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass TypeDeclarationModifiers:Child from TypeDeclaration (1,1) to Modifier (0,*) role modifiers1;&lt;br /&gt;
EdgeClass TypeDeclarationSuperclassType:Child from TypeDeclaration (1,1) to Type (0,1) role superclassType;&lt;br /&gt;
EdgeClass TypeDeclarationSuperInterfaceTypes:Child from TypeDeclaration (1,1) to Type (0,*) role superInterfaceTypes;&lt;br /&gt;
EdgeClass TypeDeclarationTypeParameters:Child from TypeDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass TypeLiteralType:Child from TypeLiteral (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeMethodReferenceArguments:Child from TypeMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass TypeMethodReferenceType:Child from TypeMethodReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeParameterName:Child from TypeParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass TypeParameterType:Child from TypeParameter (1,1) to Type (0,*) role typeBounds;&lt;br /&gt;
EdgeClass UnionTypeTypes:Child from UnionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionAnnotation:Child from VariableDeclarationExpression (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionFragments:Child from VariableDeclarationExpression (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionModifiers:Child from VariableDeclarationExpression (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionType:Child from VariableDeclarationExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass VariableDeclarationFragmentInitializer:Child from VariableDeclarationFragment (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass VariableDeclarationStatementFragments:Child from VariableDeclarationStatement (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationStatementModifier:Child from VariableDeclarationStatement (1,1) to Modifier (0,*) role modifiers;&lt;br /&gt;
EdgeClass VariableDeclarationStatementType:Child from VariableDeclarationStatement (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass WhileStatementBody:Child from WhileStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass WildcardTypeBound1:Child from WildcardType (1,1) to ParameterizedType (0,*) role bound1;&lt;br /&gt;
EdgeClass WildcardTypeBound2:Child from WildcardType (1,1) to SimpleType (0,*) role bound2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JACK erzeugt zusätzliche Kanten vom Typ &amp;lt;code&amp;gt;Access &amp;lt;/code&amp;gt;, mit denen vom Zugriff auf ein Element auf dessen Deklaration verwiesen wird. Diese Kanten sind nicht Teil des Syntaxbaumes, sondern erweitern ihn zu einem Graph. Sie stehen nur zur Verfügung, wenn Zugriff und Deklaration innerhalb des geparsten Codes liegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract EdgeClass Access from Node (0,1) to Node (0,*);&lt;br /&gt;
EdgeClass ExpressionAccess1:Access from Expression (1,1) to BodyDeclaration (0,*) role access1;&lt;br /&gt;
EdgeClass ExpressionAccess2:Access from Expression (1,1) to VariableDeclaration (0,*) role access2;&lt;br /&gt;
EdgeClass TypeAccess:Access from Type (1,1) to TypeDeclaration (0,*) role access;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Exemplarischer Code in Java:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class Computer {&lt;br /&gt;
&lt;br /&gt;
	public Computer(int price) {&lt;br /&gt;
		this.price = price;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	private int price = 0;&lt;br /&gt;
&lt;br /&gt;
	public int getPrice() {&lt;br /&gt;
		return price;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static Computer[] getSortedByPrice(Computer[] computers) {&lt;br /&gt;
		for (int n = computers.length; n &amp;gt; 1; n--) {&lt;br /&gt;
			for (int i = 0; i &amp;lt; n - 1; i++) {&lt;br /&gt;
				if (computers[i].price &amp;gt; computers[i + 1].price) {&lt;br /&gt;
					Computer swapComputer = computers[i + 1];&lt;br /&gt;
					computers[i + 1] = computers[i];&lt;br /&gt;
					computers[i] = swapComputer;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return computers;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugehöriger Syntaxgraph:&lt;br /&gt;
&lt;br /&gt;
[[Datei:syntaxgraph-computer.png|600px|thumb|left]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8973</id>
		<title>GReQL-Typegraph für Java</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8973"/>
		<updated>2023-08-25T10:52:51Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grundsätzlich folgt der Typegraph für GReQL-Queries zu Java der Java Language Specification für Java 8. Der Syntaxgraph wird durch den Eclipse-Parser erzeugt und verwendet die entsprechenden Namen für die Syntaxelemente. An einigen Stellen gibt es kleine Vereinfachungen und Erweiterungen.&lt;br /&gt;
&lt;br /&gt;
== Typegraph-Definitionen == &lt;br /&gt;
&lt;br /&gt;
=== Knotentypen ===&lt;br /&gt;
&lt;br /&gt;
Alle Knoten erben vom abstrakten Typen &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;. Zwei spezielle Knoten werden durch den Eclipse-Parser erzeugt und bilden die Wurzel und das erste Kind-Element des Syntaxbaumes.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Node;&lt;br /&gt;
VertexClass IJavaProject: Node { name:String };&lt;br /&gt;
VertexClass IPackageFragment: Node { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Sprachelemente von Java erben von &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; und erhalten darüber eine Zuordnung zu einer Zeilennummer.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Element: Node { line:Integer };&lt;br /&gt;
VertexClass AnonymousClassDeclaration:Element;&lt;br /&gt;
VertexClass CatchClause:Element;&lt;br /&gt;
VertexClass Comment:Element;&lt;br /&gt;
VertexClass CompilationUnit:Element { name:String };&lt;br /&gt;
VertexClass Dimension:Element;&lt;br /&gt;
VertexClass ImportDeclaration:Element { name:String, onDemand:Boolean, static:Boolean };&lt;br /&gt;
VertexClass Javadoc:Element;&lt;br /&gt;
VertexClass MemberRef:Element;&lt;br /&gt;
VertexClass MemberValuePair:Element;&lt;br /&gt;
VertexClass MethodRef:Element;&lt;br /&gt;
VertexClass MethodRefParameter:Element { varargs:Boolean };&lt;br /&gt;
VertexClass Modifier:Element { name:String };&lt;br /&gt;
VertexClass PackageDeclaration:Element { name:String };&lt;br /&gt;
VertexClass TagElement:Element { name:String };&lt;br /&gt;
VertexClass TextElement:Element { content:String };&lt;br /&gt;
VertexClass TypeParameter:Element;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deklarationen innerhalb einer Klasse (im Gegensatz zu den oben enthaltenen Import-Deklarationen) erben vom Typ &amp;lt;code&amp;gt;BodyDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass BodyDeclaration:Element;&lt;br /&gt;
VertexClass AnnotationTypeMemberDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass FieldDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass MethodDeclaration:BodyDeclaration { name:String, constructor:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass EnumConstantDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass Initializer:BodyDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klassendekelartionen selber erben vom Typ &amp;lt;code&amp;gt;AbstractTypeDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass AbstractTypeDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass AnnotationTypeDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
VertexClass TypeDeclaration:AbstractTypeDeclaration { name:String, interface:Boolean };&lt;br /&gt;
VertexClass EnumDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Typ-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt; zum Einsatz, ggf. auch von dessen Unterklasse &amp;lt;code&amp;gt;AnnotatableType&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Type:Element;&lt;br /&gt;
VertexClass ArrayType:Type { dimensions:Integer };&lt;br /&gt;
VertexClass IntersectionType:Type;&lt;br /&gt;
VertexClass ParameterizedType:Type { name:String };&lt;br /&gt;
VertexClass UnionType:Type;	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass AnnotatableType:Type;&lt;br /&gt;
VertexClass PrimitiveType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass SimpleType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass QualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass NameQualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass WildcardType:AnnotatableType { upperBound:Boolean };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen können einzeln oder als sogenanntes Fragment deklariert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass VariableDeclaration:Element;&lt;br /&gt;
VertexClass SingleVariableDeclaration:VariableDeclaration { name:String, varargs:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass VariableDeclarationFragment:VariableDeclaration { name:String, dimension:Integer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Anweisungen erben von &amp;lt;code&amp;gt;Statement&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Statement:Element;&lt;br /&gt;
VertexClass AssertStatement:Statement;&lt;br /&gt;
VertexClass Block:Statement;&lt;br /&gt;
VertexClass BreakStatement:Statement { name:String };&lt;br /&gt;
VertexClass ConstructorInvocation:Statement;&lt;br /&gt;
VertexClass ContinueStatement:Statement { name:String };&lt;br /&gt;
VertexClass DoStatement:Statement;&lt;br /&gt;
VertexClass EmptyStatement:Statement;&lt;br /&gt;
VertexClass EnhancedForStatement:Statement;&lt;br /&gt;
VertexClass ExpressionStatement:Statement;&lt;br /&gt;
VertexClass ForStatement:Statement;&lt;br /&gt;
VertexClass IfStatement:Statement;&lt;br /&gt;
VertexClass LabeledStatement:Statement;&lt;br /&gt;
VertexClass ReturnStatement:Statement;&lt;br /&gt;
VertexClass SuperConstructorInvocation:Statement;&lt;br /&gt;
VertexClass SwitchCase:Statement;&lt;br /&gt;
VertexClass SwitchStatement:Statement;&lt;br /&gt;
VertexClass SynchronizedStatement:Statement;&lt;br /&gt;
VertexClass ThrowStatement:Statement;&lt;br /&gt;
VertexClass TryStatement:Statement;&lt;br /&gt;
VertexClass TypeDeclarationStatement:Statement;&lt;br /&gt;
VertexClass VariableDeclarationStatement:Statement;&lt;br /&gt;
VertexClass WhileStatement:Statement;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Ausdrücke erben von &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Expression:Element;&lt;br /&gt;
VertexClass ArrayAccess:Expression;&lt;br /&gt;
VertexClass ArrayCreation:Expression;&lt;br /&gt;
VertexClass ArrayInitializer:Expression;&lt;br /&gt;
VertexClass Assignment:Expression { name:String };&lt;br /&gt;
VertexClass BooleanLiteral:Expression { content:String };&lt;br /&gt;
VertexClass CastExpression:Expression;&lt;br /&gt;
VertexClass CharacterLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ClassInstanceCreation:Expression;&lt;br /&gt;
VertexClass ConditionalExpression:Expression;&lt;br /&gt;
VertexClass FieldAccess:Expression;&lt;br /&gt;
VertexClass InfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass InstanceofExpression:Expression;&lt;br /&gt;
VertexClass LambdaExpression:Expression { parantheses:Boolean };&lt;br /&gt;
VertexClass MethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass NullLiteral:Expression;&lt;br /&gt;
VertexClass NumberLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ParenthesizedExpression:Expression;&lt;br /&gt;
VertexClass PostfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass PrefixExpression:Expression { name:String };&lt;br /&gt;
VertexClass StringLiteral:Expression { content:String };&lt;br /&gt;
VertexClass SuperFieldAccess:Expression;&lt;br /&gt;
VertexClass SuperMethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass ThisExpression:Expression;&lt;br /&gt;
VertexClass TypeLiteral:Expression;&lt;br /&gt;
VertexClass VariableDeclarationExpression:Expression;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Variablen und Methoden-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; zum Einsatz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Name:Expression;&lt;br /&gt;
VertexClass SimpleName:Name { name:String };&lt;br /&gt;
VertexClass QualifiedName:Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotationen erben von &amp;lt;code&amp;gt;Annotation&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Annotation:Expression;&lt;br /&gt;
VertexClass MarkerAnnotation:Annotation;&lt;br /&gt;
VertexClass NormalAnnotation:Annotation;&lt;br /&gt;
VertexClass SingleMemberAnnotation:Annotation;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methoden-Referenzen erben von &amp;lt;code&amp;gt;MethodReference&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass MethodReference:Expression;&lt;br /&gt;
VertexClass CreationReference:MethodReference;&lt;br /&gt;
VertexClass ExpressionMethodReference:MethodReference;&lt;br /&gt;
VertexClass SuperMethodReference:MethodReference { name:String };&lt;br /&gt;
VertexClass TypeMethodReference:MethodReference { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kantentypen ===&lt;br /&gt;
&lt;br /&gt;
Die Verbindung zwischen Knoten hat auch jeweils einen Kantentyp, der sich aus den beteiligten Typen (oder ggf. deren Obertypen) ergibt. Alle Beziehungen sind als Eltern-Kind-Beziehung definiert, die die Baumstruktur abbildet. Hat ein Eltern-Knoten mehrere Kinder, sind diese entsprechend ihrer Reihenfolge im Code über ein Attribut der Kante durchnummeriert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract EdgeClass Child from Node (0,1) to Node (0,*) { position:Integer } ;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationAnnotations:Child from AnnotationTypeDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationBodyDeclarations:Child from AnnotationTypeDeclaration (1,1) to AnnotationTypeMemberDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationModifiers:Child from AnnotationTypeDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationName:Child from AnnotationTypeDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationAnnotations:Child from AnnotationTypeMemberDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationDefault:Child from AnnotationTypeMemberDeclaration (1,1) to Expression (0,1) role default;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationModifiers:Child from AnnotationTypeMemberDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationName:Child from AnnotationTypeMemberDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationType:Child from AnnotationTypeMemberDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass AnonymousClassDeclarationBodyDeclarations:Child from AnonymousClassDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass ArrayAccessArray:Child from ArrayAccess (1,1) to Expression (0,1) role array;&lt;br /&gt;
EdgeClass ArrayAccessIndex:Child from ArrayAccess (1,1) to Expression (0,1) role index;&lt;br /&gt;
EdgeClass ArrayCreationDimensions:Child from ArrayCreation (1,1) to Expression (0,*) role dimensions;&lt;br /&gt;
EdgeClass ArrayCreationInitializer:Child from ArrayCreation (1,1) to ArrayInitializer (0,1) role initializer;&lt;br /&gt;
EdgeClass ArrayCreationType:Child from ArrayCreation (1,1) to ArrayType (0,1) role type;&lt;br /&gt;
EdgeClass ArrayInitializerExpressions:Child from ArrayInitializer (1,1) to Expression (0,*) role expressions;&lt;br /&gt;
EdgeClass ArrayTypeComponentType:Child from ArrayType (1,1) to Type (0,1) role elementType;&lt;br /&gt;
EdgeClass AssertStatementMessage:Child from AssertStatement (1,1) to Expression (0,1) role message;&lt;br /&gt;
EdgeClass AssignmentLeftHandSide:Child from Assignment (1,1) to Expression (0,1) role leftHandSide;&lt;br /&gt;
EdgeClass AssignmentRightHandSide:Child from Assignment (1,1) to Expression (0,1) role rightHandSide;&lt;br /&gt;
EdgeClass BlockStatements:Child from Block (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass BodyDeclarationJavadoc:Child from BodyDeclaration (1,1) to Javadoc (0,1) role javadoc;&lt;br /&gt;
EdgeClass CastExpressionType:Child from CastExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CatchClauseBody:Child from CatchClause (1,1) to Block (0,*) role body;&lt;br /&gt;
EdgeClass CatchClauseException:Child from CatchClause (1,1) to SingleVariableDeclaration (0,*) role exception;&lt;br /&gt;
EdgeClass ClassInstanceCreationAnonymousClassDecl:Child from ClassInstanceCreation (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass ClassInstanceCreationArguments:Child from ClassInstanceCreation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ClassInstanceCreationType:Child from ClassInstanceCreation (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CompilationUnitImports:Child from CompilationUnit (1,1) to ImportDeclaration (0,*) role imports;&lt;br /&gt;
EdgeClass CompilationUnitPackage:Child from CompilationUnit (1,1) to PackageDeclaration (0,*) role package;&lt;br /&gt;
EdgeClass CompilationUnitTypes:Child from CompilationUnit (1,1) to AbstractTypeDeclaration (0,*) role types;&lt;br /&gt;
EdgeClass ConditionalExpressionElseExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role elseExpression;&lt;br /&gt;
EdgeClass ConditionalExpressionThenExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role thenExpression;&lt;br /&gt;
EdgeClass ConstructorInvocationArguments:Child from ConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ConstructorInvocationTypeArguments:Child from ConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceTypeArguments:Child from CreationReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceType:Child from CreationReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass DimensionAnnotations:Child from Dimension (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass DoStatementBody:Child from DoStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass ElementExpression:Child from Element (1,1) to Expression (0,*) role expression;&lt;br /&gt;
EdgeClass EnhancedForStatementBody:Child from EnhancedForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass EnhancedForStatementParameter:Child from EnhancedForStatement (1,1) to SingleVariableDeclaration (0,1) role parameter;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnonymousClassDeclaration:Child from EnumConstantDeclaration (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnnotations:Child from EnumConstantDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumConstantDeclarationArguments:Child from EnumConstantDeclaration (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass EnumConstantDeclarationModifiers:Child from EnumConstantDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumConstantDeclarationName:Child from EnumConstantDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationAnnotations:Child from EnumDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumDeclarationBodyDeclaration:Child from EnumDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass EnumDeclarationEnumConstants:Child from EnumDeclaration (1,1) to EnumConstantDeclaration (0,*) role enumConstants;&lt;br /&gt;
EdgeClass EnumDeclarationModifiers:Child from EnumDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumDeclarationName:Child from EnumDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationSuperInterfaceTypes:Child from EnumDeclaration (1,1) to Type (0,*) role superInterfaceTypes; &lt;br /&gt;
EdgeClass ExpressionMethodReferenceArguments:Child from ExpressionMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass ExpressionMethodReferenceName:Child from ExpressionMethodReference (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldAccessName:Child from FieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldDeclarationAnnotation:Child from FieldDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass FieldDeclarationFragments:Child from FieldDeclaration (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass FieldDeclarationModifiers:Child from FieldDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass FieldDeclarationType:Child from FieldDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass ForStatementBody:Child from ForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass ForStatementInitializers:Child from ForStatement (1,1) to Expression (0,*) role initializers;&lt;br /&gt;
EdgeClass ForStatementUpdaters:Child from ForStatement (1,1) to Expression (0,*) role updaters;&lt;br /&gt;
EdgeClass IfStatementElseStatement:Child from IfStatement (1,1) to Statement (0,1) role elseStatement;&lt;br /&gt;
EdgeClass IfStatementThenStatement:Child from IfStatement (1,1) to Statement (0,1) role thenStatement;&lt;br /&gt;
EdgeClass IJavaProjectFragements:Child from IJavaProject (1,1) to IPackageFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass IJavaProjectUnits:Child from IJavaProject (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass InfixExpressionExtendedOperands:Child from InfixExpression (1,1) to Expression (0,*) role extendedOperands;&lt;br /&gt;
EdgeClass InfixExpressionLeftOperand:Child from InfixExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InfixExpressionRightOperand:Child from InfixExpression (1,1) to Expression (0,1) role rightOperand;&lt;br /&gt;
EdgeClass InitializerAnnotation:Child from Initializer (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass InitializerBody:Child from Initializer (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass InitializerModifiers:Child from Initializer (1,1) to Modifier(0,*) role modifiers2;&lt;br /&gt;
EdgeClass IntersectionTypeTypes:Child from IntersectionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass InstanceofExpressionLeftOperand:Child from InstanceofExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InstanceofExpressionRightOperand:Child from InstanceofExpression (1,1) to Type (0,1) role rightOperand;&lt;br /&gt;
EdgeClass IPackageFragmentUnits:Child from IPackageFragment (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass JavadocTags:Child from Javadoc (1,1) to TagElement (0,*) role tags;&lt;br /&gt;
EdgeClass LambdaExpressionBody:Child from LambdaExpression (1,1) to Element (0,1) role body;&lt;br /&gt;
EdgeClass LambdaExpressionParameters:Child from LambdaExpression (1,1) to VariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass LabeledStatementBody:Child from LabeledStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass LabeledStatementLabel:Child from LabeledStatement (1,1) to SimpleName (0,1) role label;&lt;br /&gt;
EdgeClass MarkerAnnotationTypeName:Child from MarkerAnnotation (1,1) to SimpleName (0,*) role typeName;&lt;br /&gt;
EdgeClass MemberRefName:Child from MemberRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberRefQualifier:Child from MemberRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MemberValuePairName:Child from MemberValuePair (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberValuePairValue:Child from MemberValuePair (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass MethodDeclarationAnnotation:Child from MethodDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass MethodDeclarationBody:Child from MethodDeclaration (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass MethodDeclarationModifiers:Child from MethodDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass MethodDeclarationParameters:Child from MethodDeclaration (1,1) to SingleVariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverQualifier:Child from MethodDeclaration (1,1) to SimpleName (0,1) role receiverQualifier;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverType:Child from MethodDeclaration (1,1) to Type (0,1) role receiverType;&lt;br /&gt;
EdgeClass MethodDeclarationReturnType:Child from MethodDeclaration (1,1) to Type (0,1) role returnType2;&lt;br /&gt;
EdgeClass MethodDeclarationThrownExceptions:Child from MethodDeclaration (1,1) to Type (0,*) role thrownExceptionTypes;&lt;br /&gt;
EdgeClass MethodDeclarationTypeParameters:Child from MethodDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass MethodInvocationArguments:Child from MethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass MethodRefName:Child from MethodRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameters:Child from MethodRef (1,1) to MethodRefParameter (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodRefQualifier:Child from MethodRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MethodRefParameterName:Child from MethodRefParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameterType:Child from MethodRefParameter (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass NormalAnnotationTypeName:Child from NormalAnnotation (1,1) to Name (0,1) role typeName;&lt;br /&gt;
EdgeClass NormalAnnotationValues:Child from NormalAnnotation (1,1) to MemberValuePair (0,*) role values;&lt;br /&gt;
EdgeClass ParameterizedTypeType:Child from ParameterizedType (1,1) to SimpleType (0,1) role type;&lt;br /&gt;
EdgeClass ParameterizedTypeTypeArguments:Child from ParameterizedType (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass PostfixExpressionOperand:Child from PostfixExpression (1,1) to SimpleName (0,1) role operand;&lt;br /&gt;
EdgeClass PrefixExpressionOperand:Child from PrefixExpression (1,1) to Expression (0,1) role operand;&lt;br /&gt;
EdgeClass QualifiedNameName:Child from QualifiedName (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass QualifiedNameQualifier:Child from QualifiedName (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SimpleNameValues:Child from SimpleName (1,1) to MethodDeclaration (0,*) role values;&lt;br /&gt;
EdgeClass SimpleTypeAnnotation:Child from SimpleType (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass SimpleTypeName:Child from SimpleType (1,1) to Name (0,1) role name2;&lt;br /&gt;
EdgeClass SingleMemberAnnotationTypeName:Child from SingleMemberAnnotation (1,1) to SimpleName (0,1) role typeName;&lt;br /&gt;
EdgeClass SingleMemberAnnotationValue:Child from SingleMemberAnnotation (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass SingleVariableDeclarationAnnotation:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass SingleVariableDeclarationExtraDimensions:Child from SingleVariableDeclaration (1,1) to Dimension (0,*) role extraDimensions2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationInitializer:Child from SingleVariableDeclaration (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass SingleVariableDeclarationModifiers:Child from SingleVariableDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationType:Child from SingleVariableDeclaration (1,1) to Type (0,*) role type;&lt;br /&gt;
EdgeClass SingleVariableDeclarationVarargsAnnotations:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role varargsAnnotations;&lt;br /&gt;
EdgeClass SuperConstructorInvocationArgument:Child from SuperConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperConstructorInvocationTypeArguments:Child from SuperConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperFieldAccessName:Child from SuperFieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass SuperFieldAccessQualifier:Child from SuperFieldAccess(1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodInvocationArguments:Child from SuperMethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperMethodInvocationQualifier:Child from SuperMethodInvocation (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodReferenceArguments:Child from SuperMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperMethodReferenceQualifier:Child from SuperMethodReference (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SwitchStatementStatements:Child from SwitchStatement (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass SynchronizedStatementBlock:Child from SynchronizedStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass TagElementFragments1:Child from TagElement (1,1) to TextElement (0,*) role fragments1;&lt;br /&gt;
EdgeClass TagElementFragments2:Child from TagElement (1,1) to Name (0,*) role fragments2;&lt;br /&gt;
EdgeClass TagElementFragments3:Child from TagElement (1,1) to MethodRef (0,*) role fragments3;&lt;br /&gt;
EdgeClass TagElementFragments4:Child from TagElement (1,1) to MemberRef (0,*) role fragments4;&lt;br /&gt;
EdgeClass TagElementFragments5:Child from TagElement (1,1) to TagElement (0,*) role fragments5;&lt;br /&gt;
EdgeClass ThisExpressionQualifier:Child from ThisExpression (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass TryStatementBody:Child from TryStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass TryStatementCatchClauses:Child from TryStatement (1,1) to CatchClause (0,*) role catchClauses;&lt;br /&gt;
EdgeClass TryStatementFinally:Child from TryStatement (1,1) to Block (0,1) role finally;&lt;br /&gt;
EdgeClass TryStatementResources:Child from TryStatement (1,1) to VariableDeclarationExpression (0,*) role resources;&lt;br /&gt;
EdgeClass TypeDeclarationAnnotation:Child from TypeDeclaration (1,1) to Annotation (0,*) role modifiers2;&lt;br /&gt;
EdgeClass TypeDeclarationBodyDeclarations1:Child from TypeDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass TypeDeclarationModifiers:Child from TypeDeclaration (1,1) to Modifier (0,*) role modifiers1;&lt;br /&gt;
EdgeClass TypeDeclarationSuperclassType:Child from TypeDeclaration (1,1) to Type (0,1) role superclassType;&lt;br /&gt;
EdgeClass TypeDeclarationSuperInterfaceTypes:Child from TypeDeclaration (1,1) to Type (0,*) role superInterfaceTypes;&lt;br /&gt;
EdgeClass TypeDeclarationTypeParameters:Child from TypeDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass TypeLiteralType:Child from TypeLiteral (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeMethodReferenceArguments:Child from TypeMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass TypeMethodReferenceType:Child from TypeMethodReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeParameterName:Child from TypeParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass TypeParameterType:Child from TypeParameter (1,1) to Type (0,*) role typeBounds;&lt;br /&gt;
EdgeClass UnionTypeTypes:Child from UnionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionAnnotation:Child from VariableDeclarationExpression (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionFragments:Child from VariableDeclarationExpression (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionModifiers:Child from VariableDeclarationExpression (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionType:Child from VariableDeclarationExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass VariableDeclarationFragmentInitializer:Child from VariableDeclarationFragment (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass VariableDeclarationStatementFragments:Child from VariableDeclarationStatement (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationStatementModifier:Child from VariableDeclarationStatement (1,1) to Modifier (0,*) role modifiers;&lt;br /&gt;
EdgeClass VariableDeclarationStatementType:Child from VariableDeclarationStatement (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass WhileStatementBody:Child from WhileStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass WildcardTypeBound1:Child from WildcardType (1,1) to ParameterizedType (0,*) role bound1;&lt;br /&gt;
EdgeClass WildcardTypeBound2:Child from WildcardType (1,1) to SimpleType (0,*) role bound2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JACK erzeugt zusätzliche Kanten vom Typ &amp;lt;code&amp;gt;Access &amp;lt;/code&amp;gt;, mit denen vom Zugriff auf ein Element auf dessen Deklaration verwiesen wird. Diese Kanten sind nicht Teil des Syntaxbaumes, sondern erweitern ihn zu einem Graph. Sie stehen nur zur Verfügung, wenn Zugriff und Deklaration innerhalb des geparsten Codes liegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract EdgeClass Access from Node (0,1) to Node (0,*);&lt;br /&gt;
EdgeClass ExpressionAccess1:Access from Expression (1,1) to BodyDeclaration (0,*) role access1;&lt;br /&gt;
EdgeClass ExpressionAccess2:Access from Expression (1,1) to VariableDeclaration (0,*) role access2;&lt;br /&gt;
EdgeClass TypeAccess:Access from Type (1,1) to TypeDeclaration (0,*) role access;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Exemplarischer Code in Java:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class Computer {&lt;br /&gt;
&lt;br /&gt;
	public Computer(int price) {&lt;br /&gt;
		this.price = price;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	private int price = 0;&lt;br /&gt;
&lt;br /&gt;
	public int getPrice() {&lt;br /&gt;
		return price;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static Computer[] getSortedByPrice(Computer[] computers) {&lt;br /&gt;
		for (int n = computers.length; n &amp;gt; 1; n--) {&lt;br /&gt;
			for (int i = 0; i &amp;lt; n - 1; i++) {&lt;br /&gt;
				if (computers[i].price &amp;gt; computers[i + 1].price) {&lt;br /&gt;
					Computer swapComputer = computers[i + 1];&lt;br /&gt;
					computers[i + 1] = computers[i];&lt;br /&gt;
					computers[i] = swapComputer;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return computers;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugehöriger Syntaxgraph:&lt;br /&gt;
&lt;br /&gt;
[[Datei:syntaxgraph-computer.png]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8972</id>
		<title>GReQL-Typegraph für Java</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8972"/>
		<updated>2023-08-25T10:40:31Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grundsätzlich folgt der Typegraph für GReQL-Queries zu Java der Java Language Specification für Java 8. Der Syntaxgraph wird durch den Eclipse-Parser erzeugt und verwendet die entsprechenden Namen für die Syntaxelemente. An einigen Stellen gibt es kleine Vereinfachungen und Erweiterungen.&lt;br /&gt;
&lt;br /&gt;
== Typegraph-Definitionen == &lt;br /&gt;
&lt;br /&gt;
=== Knotentypen ===&lt;br /&gt;
&lt;br /&gt;
Alle Knoten erben vom abstrakten Typen &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;. Zwei spezielle Knoten werden durch den Eclipse-Parser erzeugt und bilden die Wurzel und das erste Kind-Element des Syntaxbaumes.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Node;&lt;br /&gt;
VertexClass IJavaProject: Node { name:String };&lt;br /&gt;
VertexClass IPackageFragment: Node { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Sprachelemente von Java erben von &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; und erhalten darüber eine Zuordnung zu einer Zeilennummer.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Element: Node { line:Integer };&lt;br /&gt;
VertexClass AnonymousClassDeclaration:Element;&lt;br /&gt;
VertexClass CatchClause:Element;&lt;br /&gt;
VertexClass Comment:Element;&lt;br /&gt;
VertexClass CompilationUnit:Element { name:String };&lt;br /&gt;
VertexClass Dimension:Element;&lt;br /&gt;
VertexClass ImportDeclaration:Element { name:String, onDemand:Boolean, static:Boolean };&lt;br /&gt;
VertexClass Javadoc:Element;&lt;br /&gt;
VertexClass MemberRef:Element;&lt;br /&gt;
VertexClass MemberValuePair:Element;&lt;br /&gt;
VertexClass MethodRef:Element;&lt;br /&gt;
VertexClass MethodRefParameter:Element { varargs:Boolean };&lt;br /&gt;
VertexClass Modifier:Element { name:String };&lt;br /&gt;
VertexClass PackageDeclaration:Element { name:String };&lt;br /&gt;
VertexClass TagElement:Element { name:String };&lt;br /&gt;
VertexClass TextElement:Element { content:String };&lt;br /&gt;
VertexClass TypeParameter:Element;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deklarationen innerhalb einer Klasse (im Gegensatz zu den oben enthaltenen Import-Deklarationen) erben vom Typ &amp;lt;code&amp;gt;BodyDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass BodyDeclaration:Element;&lt;br /&gt;
VertexClass AnnotationTypeMemberDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass FieldDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass MethodDeclaration:BodyDeclaration { name:String, constructor:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass EnumConstantDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass Initializer:BodyDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klassendekelartionen selber erben vom Typ &amp;lt;code&amp;gt;AbstractTypeDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass AbstractTypeDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass AnnotationTypeDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
VertexClass TypeDeclaration:AbstractTypeDeclaration { name:String, interface:Boolean };&lt;br /&gt;
VertexClass EnumDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Typ-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt; zum Einsatz, ggf. auch von dessen Unterklasse &amp;lt;code&amp;gt;AnnotatableType&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Type:Element;&lt;br /&gt;
VertexClass ArrayType:Type { dimensions:Integer };&lt;br /&gt;
VertexClass IntersectionType:Type;&lt;br /&gt;
VertexClass ParameterizedType:Type { name:String };&lt;br /&gt;
VertexClass UnionType:Type;	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass AnnotatableType:Type;&lt;br /&gt;
VertexClass PrimitiveType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass SimpleType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass QualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass NameQualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass WildcardType:AnnotatableType { upperBound:Boolean };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen können einzeln oder als sogenanntes Fragment deklariert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass VariableDeclaration:Element;&lt;br /&gt;
VertexClass SingleVariableDeclaration:VariableDeclaration { name:String, varargs:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass VariableDeclarationFragment:VariableDeclaration { name:String, dimension:Integer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Anweisungen erben von &amp;lt;code&amp;gt;Statement&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Statement:Element;&lt;br /&gt;
VertexClass AssertStatement:Statement;&lt;br /&gt;
VertexClass Block:Statement;&lt;br /&gt;
VertexClass BreakStatement:Statement { name:String };&lt;br /&gt;
VertexClass ConstructorInvocation:Statement;&lt;br /&gt;
VertexClass ContinueStatement:Statement { name:String };&lt;br /&gt;
VertexClass DoStatement:Statement;&lt;br /&gt;
VertexClass EmptyStatement:Statement;&lt;br /&gt;
VertexClass EnhancedForStatement:Statement;&lt;br /&gt;
VertexClass ExpressionStatement:Statement;&lt;br /&gt;
VertexClass ForStatement:Statement;&lt;br /&gt;
VertexClass IfStatement:Statement;&lt;br /&gt;
VertexClass LabeledStatement:Statement;&lt;br /&gt;
VertexClass ReturnStatement:Statement;&lt;br /&gt;
VertexClass SuperConstructorInvocation:Statement;&lt;br /&gt;
VertexClass SwitchCase:Statement;&lt;br /&gt;
VertexClass SwitchStatement:Statement;&lt;br /&gt;
VertexClass SynchronizedStatement:Statement;&lt;br /&gt;
VertexClass ThrowStatement:Statement;&lt;br /&gt;
VertexClass TryStatement:Statement;&lt;br /&gt;
VertexClass TypeDeclarationStatement:Statement;&lt;br /&gt;
VertexClass VariableDeclarationStatement:Statement;&lt;br /&gt;
VertexClass WhileStatement:Statement;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Ausdrücke erben von &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Expression:Element;&lt;br /&gt;
VertexClass ArrayAccess:Expression;&lt;br /&gt;
VertexClass ArrayCreation:Expression;&lt;br /&gt;
VertexClass ArrayInitializer:Expression;&lt;br /&gt;
VertexClass Assignment:Expression { name:String };&lt;br /&gt;
VertexClass BooleanLiteral:Expression { content:String };&lt;br /&gt;
VertexClass CastExpression:Expression;&lt;br /&gt;
VertexClass CharacterLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ClassInstanceCreation:Expression;&lt;br /&gt;
VertexClass ConditionalExpression:Expression;&lt;br /&gt;
VertexClass FieldAccess:Expression;&lt;br /&gt;
VertexClass InfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass InstanceofExpression:Expression;&lt;br /&gt;
VertexClass LambdaExpression:Expression { parantheses:Boolean };&lt;br /&gt;
VertexClass MethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass NullLiteral:Expression;&lt;br /&gt;
VertexClass NumberLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ParenthesizedExpression:Expression;&lt;br /&gt;
VertexClass PostfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass PrefixExpression:Expression { name:String };&lt;br /&gt;
VertexClass StringLiteral:Expression { content:String };&lt;br /&gt;
VertexClass SuperFieldAccess:Expression;&lt;br /&gt;
VertexClass SuperMethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass ThisExpression:Expression;&lt;br /&gt;
VertexClass TypeLiteral:Expression;&lt;br /&gt;
VertexClass VariableDeclarationExpression:Expression;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Variablen und Methoden-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; zum Einsatz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Name:Expression;&lt;br /&gt;
VertexClass SimpleName:Name { name:String };&lt;br /&gt;
VertexClass QualifiedName:Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotationen erben von &amp;lt;code&amp;gt;Annotation&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass Annotation:Expression;&lt;br /&gt;
VertexClass MarkerAnnotation:Annotation;&lt;br /&gt;
VertexClass NormalAnnotation:Annotation;&lt;br /&gt;
VertexClass SingleMemberAnnotation:Annotation;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methoden-Referenzen erben von &amp;lt;code&amp;gt;MethodReference&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract VertexClass MethodReference:Expression;&lt;br /&gt;
VertexClass CreationReference:MethodReference;&lt;br /&gt;
VertexClass ExpressionMethodReference:MethodReference;&lt;br /&gt;
VertexClass SuperMethodReference:MethodReference { name:String };&lt;br /&gt;
VertexClass TypeMethodReference:MethodReference { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kantentypen ===&lt;br /&gt;
&lt;br /&gt;
Die Verbindung zwischen Knoten hat auch jeweils einen Kantentyp, der sich aus den beteiligten Typen (oder ggf. deren Obertypen) ergibt. Alle Beziehungen sind als Eltern-Kind-Beziehung definiert, die die Baumstruktur abbildet. Hat ein Eltern-Knoten mehrere Kinder, sind diese entsprechend ihrer Reihenfolge im Code über ein Attribut der Kante durchnummeriert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract EdgeClass Child from Node (0,1) to Node (0,*) { position:Integer } ;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationAnnotations:Child from AnnotationTypeDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationBodyDeclarations:Child from AnnotationTypeDeclaration (1,1) to AnnotationTypeMemberDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationModifiers:Child from AnnotationTypeDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationName:Child from AnnotationTypeDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationAnnotations:Child from AnnotationTypeMemberDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationDefault:Child from AnnotationTypeMemberDeclaration (1,1) to Expression (0,1) role default;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationModifiers:Child from AnnotationTypeMemberDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationName:Child from AnnotationTypeMemberDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationType:Child from AnnotationTypeMemberDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass AnonymousClassDeclarationBodyDeclarations:Child from AnonymousClassDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass ArrayAccessArray:Child from ArrayAccess (1,1) to Expression (0,1) role array;&lt;br /&gt;
EdgeClass ArrayAccessIndex:Child from ArrayAccess (1,1) to Expression (0,1) role index;&lt;br /&gt;
EdgeClass ArrayCreationDimensions:Child from ArrayCreation (1,1) to Expression (0,*) role dimensions;&lt;br /&gt;
EdgeClass ArrayCreationInitializer:Child from ArrayCreation (1,1) to ArrayInitializer (0,1) role initializer;&lt;br /&gt;
EdgeClass ArrayCreationType:Child from ArrayCreation (1,1) to ArrayType (0,1) role type;&lt;br /&gt;
EdgeClass ArrayInitializerExpressions:Child from ArrayInitializer (1,1) to Expression (0,*) role expressions;&lt;br /&gt;
EdgeClass ArrayTypeComponentType:Child from ArrayType (1,1) to Type (0,1) role elementType;&lt;br /&gt;
EdgeClass AssertStatementMessage:Child from AssertStatement (1,1) to Expression (0,1) role message;&lt;br /&gt;
EdgeClass AssignmentLeftHandSide:Child from Assignment (1,1) to Expression (0,1) role leftHandSide;&lt;br /&gt;
EdgeClass AssignmentRightHandSide:Child from Assignment (1,1) to Expression (0,1) role rightHandSide;&lt;br /&gt;
EdgeClass BlockStatements:Child from Block (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass BodyDeclarationJavadoc:Child from BodyDeclaration (1,1) to Javadoc (0,1) role javadoc;&lt;br /&gt;
EdgeClass CastExpressionType:Child from CastExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CatchClauseBody:Child from CatchClause (1,1) to Block (0,*) role body;&lt;br /&gt;
EdgeClass CatchClauseException:Child from CatchClause (1,1) to SingleVariableDeclaration (0,*) role exception;&lt;br /&gt;
EdgeClass ClassInstanceCreationAnonymousClassDecl:Child from ClassInstanceCreation (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass ClassInstanceCreationArguments:Child from ClassInstanceCreation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ClassInstanceCreationType:Child from ClassInstanceCreation (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CompilationUnitImports:Child from CompilationUnit (1,1) to ImportDeclaration (0,*) role imports;&lt;br /&gt;
EdgeClass CompilationUnitPackage:Child from CompilationUnit (1,1) to PackageDeclaration (0,*) role package;&lt;br /&gt;
EdgeClass CompilationUnitTypes:Child from CompilationUnit (1,1) to AbstractTypeDeclaration (0,*) role types;&lt;br /&gt;
EdgeClass ConditionalExpressionElseExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role elseExpression;&lt;br /&gt;
EdgeClass ConditionalExpressionThenExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role thenExpression;&lt;br /&gt;
EdgeClass ConstructorInvocationArguments:Child from ConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ConstructorInvocationTypeArguments:Child from ConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceTypeArguments:Child from CreationReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceType:Child from CreationReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass DimensionAnnotations:Child from Dimension (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass DoStatementBody:Child from DoStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass ElementExpression:Child from Element (1,1) to Expression (0,*) role expression;&lt;br /&gt;
EdgeClass EnhancedForStatementBody:Child from EnhancedForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass EnhancedForStatementParameter:Child from EnhancedForStatement (1,1) to SingleVariableDeclaration (0,1) role parameter;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnonymousClassDeclaration:Child from EnumConstantDeclaration (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnnotations:Child from EnumConstantDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumConstantDeclarationArguments:Child from EnumConstantDeclaration (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass EnumConstantDeclarationModifiers:Child from EnumConstantDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumConstantDeclarationName:Child from EnumConstantDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationAnnotations:Child from EnumDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumDeclarationBodyDeclaration:Child from EnumDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass EnumDeclarationEnumConstants:Child from EnumDeclaration (1,1) to EnumConstantDeclaration (0,*) role enumConstants;&lt;br /&gt;
EdgeClass EnumDeclarationModifiers:Child from EnumDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumDeclarationName:Child from EnumDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationSuperInterfaceTypes:Child from EnumDeclaration (1,1) to Type (0,*) role superInterfaceTypes; &lt;br /&gt;
EdgeClass ExpressionMethodReferenceArguments:Child from ExpressionMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass ExpressionMethodReferenceName:Child from ExpressionMethodReference (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldAccessName:Child from FieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldDeclarationAnnotation:Child from FieldDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass FieldDeclarationFragments:Child from FieldDeclaration (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass FieldDeclarationModifiers:Child from FieldDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass FieldDeclarationType:Child from FieldDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass ForStatementBody:Child from ForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass ForStatementInitializers:Child from ForStatement (1,1) to Expression (0,*) role initializers;&lt;br /&gt;
EdgeClass ForStatementUpdaters:Child from ForStatement (1,1) to Expression (0,*) role updaters;&lt;br /&gt;
EdgeClass IfStatementElseStatement:Child from IfStatement (1,1) to Statement (0,1) role elseStatement;&lt;br /&gt;
EdgeClass IfStatementThenStatement:Child from IfStatement (1,1) to Statement (0,1) role thenStatement;&lt;br /&gt;
EdgeClass IJavaProjectFragements:Child from IJavaProject (1,1) to IPackageFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass IJavaProjectUnits:Child from IJavaProject (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass InfixExpressionExtendedOperands:Child from InfixExpression (1,1) to Expression (0,*) role extendedOperands;&lt;br /&gt;
EdgeClass InfixExpressionLeftOperand:Child from InfixExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InfixExpressionRightOperand:Child from InfixExpression (1,1) to Expression (0,1) role rightOperand;&lt;br /&gt;
EdgeClass InitializerAnnotation:Child from Initializer (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass InitializerBody:Child from Initializer (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass InitializerModifiers:Child from Initializer (1,1) to Modifier(0,*) role modifiers2;&lt;br /&gt;
EdgeClass IntersectionTypeTypes:Child from IntersectionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass InstanceofExpressionLeftOperand:Child from InstanceofExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InstanceofExpressionRightOperand:Child from InstanceofExpression (1,1) to Type (0,1) role rightOperand;&lt;br /&gt;
EdgeClass IPackageFragmentUnits:Child from IPackageFragment (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass JavadocTags:Child from Javadoc (1,1) to TagElement (0,*) role tags;&lt;br /&gt;
EdgeClass LambdaExpressionBody:Child from LambdaExpression (1,1) to Element (0,1) role body;&lt;br /&gt;
EdgeClass LambdaExpressionParameters:Child from LambdaExpression (1,1) to VariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass LabeledStatementBody:Child from LabeledStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass LabeledStatementLabel:Child from LabeledStatement (1,1) to SimpleName (0,1) role label;&lt;br /&gt;
EdgeClass MarkerAnnotationTypeName:Child from MarkerAnnotation (1,1) to SimpleName (0,*) role typeName;&lt;br /&gt;
EdgeClass MemberRefName:Child from MemberRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberRefQualifier:Child from MemberRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MemberValuePairName:Child from MemberValuePair (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberValuePairValue:Child from MemberValuePair (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass MethodDeclarationAnnotation:Child from MethodDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass MethodDeclarationBody:Child from MethodDeclaration (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass MethodDeclarationModifiers:Child from MethodDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass MethodDeclarationParameters:Child from MethodDeclaration (1,1) to SingleVariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverQualifier:Child from MethodDeclaration (1,1) to SimpleName (0,1) role receiverQualifier;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverType:Child from MethodDeclaration (1,1) to Type (0,1) role receiverType;&lt;br /&gt;
EdgeClass MethodDeclarationReturnType:Child from MethodDeclaration (1,1) to Type (0,1) role returnType2;&lt;br /&gt;
EdgeClass MethodDeclarationThrownExceptions:Child from MethodDeclaration (1,1) to Type (0,*) role thrownExceptionTypes;&lt;br /&gt;
EdgeClass MethodDeclarationTypeParameters:Child from MethodDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass MethodInvocationArguments:Child from MethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass MethodRefName:Child from MethodRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameters:Child from MethodRef (1,1) to MethodRefParameter (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodRefQualifier:Child from MethodRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MethodRefParameterName:Child from MethodRefParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameterType:Child from MethodRefParameter (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass NormalAnnotationTypeName:Child from NormalAnnotation (1,1) to Name (0,1) role typeName;&lt;br /&gt;
EdgeClass NormalAnnotationValues:Child from NormalAnnotation (1,1) to MemberValuePair (0,*) role values;&lt;br /&gt;
EdgeClass ParameterizedTypeType:Child from ParameterizedType (1,1) to SimpleType (0,1) role type;&lt;br /&gt;
EdgeClass ParameterizedTypeTypeArguments:Child from ParameterizedType (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass PostfixExpressionOperand:Child from PostfixExpression (1,1) to SimpleName (0,1) role operand;&lt;br /&gt;
EdgeClass PrefixExpressionOperand:Child from PrefixExpression (1,1) to Expression (0,1) role operand;&lt;br /&gt;
EdgeClass QualifiedNameName:Child from QualifiedName (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass QualifiedNameQualifier:Child from QualifiedName (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SimpleNameValues:Child from SimpleName (1,1) to MethodDeclaration (0,*) role values;&lt;br /&gt;
EdgeClass SimpleTypeAnnotation:Child from SimpleType (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass SimpleTypeName:Child from SimpleType (1,1) to Name (0,1) role name2;&lt;br /&gt;
EdgeClass SingleMemberAnnotationTypeName:Child from SingleMemberAnnotation (1,1) to SimpleName (0,1) role typeName;&lt;br /&gt;
EdgeClass SingleMemberAnnotationValue:Child from SingleMemberAnnotation (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass SingleVariableDeclarationAnnotation:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass SingleVariableDeclarationExtraDimensions:Child from SingleVariableDeclaration (1,1) to Dimension (0,*) role extraDimensions2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationInitializer:Child from SingleVariableDeclaration (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass SingleVariableDeclarationModifiers:Child from SingleVariableDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationType:Child from SingleVariableDeclaration (1,1) to Type (0,*) role type;&lt;br /&gt;
EdgeClass SingleVariableDeclarationVarargsAnnotations:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role varargsAnnotations;&lt;br /&gt;
EdgeClass SuperConstructorInvocationArgument:Child from SuperConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperConstructorInvocationTypeArguments:Child from SuperConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperFieldAccessName:Child from SuperFieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass SuperFieldAccessQualifier:Child from SuperFieldAccess(1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodInvocationArguments:Child from SuperMethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperMethodInvocationQualifier:Child from SuperMethodInvocation (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodReferenceArguments:Child from SuperMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperMethodReferenceQualifier:Child from SuperMethodReference (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SwitchStatementStatements:Child from SwitchStatement (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass SynchronizedStatementBlock:Child from SynchronizedStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass TagElementFragments1:Child from TagElement (1,1) to TextElement (0,*) role fragments1;&lt;br /&gt;
EdgeClass TagElementFragments2:Child from TagElement (1,1) to Name (0,*) role fragments2;&lt;br /&gt;
EdgeClass TagElementFragments3:Child from TagElement (1,1) to MethodRef (0,*) role fragments3;&lt;br /&gt;
EdgeClass TagElementFragments4:Child from TagElement (1,1) to MemberRef (0,*) role fragments4;&lt;br /&gt;
EdgeClass TagElementFragments5:Child from TagElement (1,1) to TagElement (0,*) role fragments5;&lt;br /&gt;
EdgeClass ThisExpressionQualifier:Child from ThisExpression (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass TryStatementBody:Child from TryStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass TryStatementCatchClauses:Child from TryStatement (1,1) to CatchClause (0,*) role catchClauses;&lt;br /&gt;
EdgeClass TryStatementFinally:Child from TryStatement (1,1) to Block (0,1) role finally;&lt;br /&gt;
EdgeClass TryStatementResources:Child from TryStatement (1,1) to VariableDeclarationExpression (0,*) role resources;&lt;br /&gt;
EdgeClass TypeDeclarationAnnotation:Child from TypeDeclaration (1,1) to Annotation (0,*) role modifiers2;&lt;br /&gt;
EdgeClass TypeDeclarationBodyDeclarations1:Child from TypeDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass TypeDeclarationModifiers:Child from TypeDeclaration (1,1) to Modifier (0,*) role modifiers1;&lt;br /&gt;
EdgeClass TypeDeclarationSuperclassType:Child from TypeDeclaration (1,1) to Type (0,1) role superclassType;&lt;br /&gt;
EdgeClass TypeDeclarationSuperInterfaceTypes:Child from TypeDeclaration (1,1) to Type (0,*) role superInterfaceTypes;&lt;br /&gt;
EdgeClass TypeDeclarationTypeParameters:Child from TypeDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass TypeLiteralType:Child from TypeLiteral (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeMethodReferenceArguments:Child from TypeMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass TypeMethodReferenceType:Child from TypeMethodReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeParameterName:Child from TypeParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass TypeParameterType:Child from TypeParameter (1,1) to Type (0,*) role typeBounds;&lt;br /&gt;
EdgeClass UnionTypeTypes:Child from UnionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionAnnotation:Child from VariableDeclarationExpression (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionFragments:Child from VariableDeclarationExpression (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionModifiers:Child from VariableDeclarationExpression (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionType:Child from VariableDeclarationExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass VariableDeclarationFragmentInitializer:Child from VariableDeclarationFragment (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass VariableDeclarationStatementFragments:Child from VariableDeclarationStatement (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationStatementModifier:Child from VariableDeclarationStatement (1,1) to Modifier (0,*) role modifiers;&lt;br /&gt;
EdgeClass VariableDeclarationStatementType:Child from VariableDeclarationStatement (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass WhileStatementBody:Child from WhileStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass WildcardTypeBound1:Child from WildcardType (1,1) to ParameterizedType (0,*) role bound1;&lt;br /&gt;
EdgeClass WildcardTypeBound2:Child from WildcardType (1,1) to SimpleType (0,*) role bound2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JACK erzeugt zusätzliche Kanten vom Typ &amp;lt;code&amp;gt;Access &amp;lt;/code&amp;gt;, mit denen vom Zugriff auf ein Element auf dessen Deklaration verwiesen wird. Diese Kanten sind nicht Teil des Syntaxbaumes, sondern erweitern ihn zu einem Graph. Sie stehen nur zur Verfügung, wenn Zugriff und Deklaration innerhalb des geparsten Codes liegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
abstract EdgeClass Access from Node (0,1) to Node (0,*);&lt;br /&gt;
EdgeClass ExpressionAccess1:Access from Expression (1,1) to BodyDeclaration (0,*) role access1;&lt;br /&gt;
EdgeClass ExpressionAccess2:Access from Expression (1,1) to VariableDeclaration (0,*) role access2;&lt;br /&gt;
EdgeClass TypeAccess:Access from Type (1,1) to TypeDeclaration (0,*) role access;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Exemplarischer Code in Java:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot; line=&amp;quot;line&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class Computer {&lt;br /&gt;
&lt;br /&gt;
	public Computer(int price) {&lt;br /&gt;
		this.price = price;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	private int price = 0;&lt;br /&gt;
&lt;br /&gt;
	public int getPrice() {&lt;br /&gt;
		return price;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static Computer[] getSortedByPrice(Computer[] computers) {&lt;br /&gt;
		for (int n = computers.length; n &amp;gt; 1; n--) {&lt;br /&gt;
			for (int i = 0; i &amp;lt; n - 1; i++) {&lt;br /&gt;
				if (computers[i].price &amp;gt; computers[i + 1].price) {&lt;br /&gt;
					Computer swapComputer = computers[i + 1];&lt;br /&gt;
					computers[i + 1] = computers[i];&lt;br /&gt;
					computers[i] = swapComputer;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return computers;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugehöriger Syntaxgraph:&lt;br /&gt;
&lt;br /&gt;
[[Datei:syntaxgraph-computer.jpeg]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:Syntaxgraph-computer.png&amp;diff=8971</id>
		<title>Datei:Syntaxgraph-computer.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:Syntaxgraph-computer.png&amp;diff=8971"/>
		<updated>2023-08-25T10:32:54Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Datei:Syntaxgraph-computer.jpeg&amp;diff=8970</id>
		<title>Datei:Syntaxgraph-computer.jpeg</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Datei:Syntaxgraph-computer.jpeg&amp;diff=8970"/>
		<updated>2023-08-25T10:18:19Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8969</id>
		<title>GReQL-Typegraph für Java</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQL-Typegraph_f%C3%BCr_Java&amp;diff=8969"/>
		<updated>2023-08-25T08:21:33Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Die Seite wurde neu angelegt: „Grundsätzlich folgt der Typegraph für GReQL-Queries zu Java der Java Language Specification für Java 8. Der Syntaxgraph wird durch den Eclipse-Parser erzeugt und verwendet die entsprechenden Namen für die Syntaxelemente. An einigen Stellen gibt es kleine Vereinfachungen und Erweiterungen.  Alle Knoten erben vom abstrakten Typen &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;. Zwei spezielle Knoten werden durch den Eclipse-Parser erzeugt und bilden die Wurzel und das erste Kind-Ele…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Grundsätzlich folgt der Typegraph für GReQL-Queries zu Java der Java Language Specification für Java 8. Der Syntaxgraph wird durch den Eclipse-Parser erzeugt und verwendet die entsprechenden Namen für die Syntaxelemente. An einigen Stellen gibt es kleine Vereinfachungen und Erweiterungen.&lt;br /&gt;
&lt;br /&gt;
Alle Knoten erben vom abstrakten Typen &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt;. Zwei spezielle Knoten werden durch den Eclipse-Parser erzeugt und bilden die Wurzel und das erste Kind-Element des Syntaxbaumes.&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass Node;&lt;br /&gt;
VertexClass IJavaProject: Node { name:String };&lt;br /&gt;
VertexClass IPackageFragment: Node { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Sprachelemente von Java erben von &amp;lt;code&amp;gt;Element&amp;lt;/code&amp;gt; und erhalten darüber eine Zuordnung zu einer Zeilennummer.&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass Element: Node { line:Integer };&lt;br /&gt;
VertexClass AnonymousClassDeclaration:Element;&lt;br /&gt;
VertexClass CatchClause:Element;&lt;br /&gt;
VertexClass Comment:Element;&lt;br /&gt;
VertexClass CompilationUnit:Element { name:String };&lt;br /&gt;
VertexClass Dimension:Element;&lt;br /&gt;
VertexClass ImportDeclaration:Element { name:String, onDemand:Boolean, static:Boolean };&lt;br /&gt;
VertexClass Javadoc:Element;&lt;br /&gt;
VertexClass MemberRef:Element;&lt;br /&gt;
VertexClass MemberValuePair:Element;&lt;br /&gt;
VertexClass MethodRef:Element;&lt;br /&gt;
VertexClass MethodRefParameter:Element { varargs:Boolean };&lt;br /&gt;
VertexClass Modifier:Element { name:String };&lt;br /&gt;
VertexClass PackageDeclaration:Element { name:String };&lt;br /&gt;
VertexClass TagElement:Element { name:String };&lt;br /&gt;
VertexClass TextElement:Element { content:String };&lt;br /&gt;
VertexClass TypeParameter:Element;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deklarationen innerhalb einer Klasse (im Gegensatz zu den oben enthaltenen Import-Deklarationen) erben vom Typ &amp;lt;code&amp;gt;BodyDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass BodyDeclaration:Element;&lt;br /&gt;
VertexClass AnnotationTypeMemberDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass FieldDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass MethodDeclaration:BodyDeclaration { name:String, constructor:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass EnumConstantDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass Initializer:BodyDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klassendekelartionen selber erben vom Typ &amp;lt;code&amp;gt;AbstractTypeDeclaration&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass AbstractTypeDeclaration:BodyDeclaration;&lt;br /&gt;
VertexClass AnnotationTypeDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
VertexClass TypeDeclaration:AbstractTypeDeclaration { name:String, interface:Boolean };&lt;br /&gt;
VertexClass EnumDeclaration:AbstractTypeDeclaration;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Typ-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt; zum Einsatz, ggf. auch von dessen Unterklasse &amp;lt;code&amp;gt;AnnotatableType&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass Type:Element;&lt;br /&gt;
VertexClass ArrayType:Type { dimensions:Integer };&lt;br /&gt;
VertexClass IntersectionType:Type;&lt;br /&gt;
VertexClass ParameterizedType:Type { name:String };&lt;br /&gt;
VertexClass UnionType:Type;	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass AnnotatableType:Type;&lt;br /&gt;
VertexClass PrimitiveType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass SimpleType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass QualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass NameQualifiedType:AnnotatableType { name:String };&lt;br /&gt;
VertexClass WildcardType:AnnotatableType { upperBound:Boolean };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variablen können einzeln oder als sogenanntes Fragment deklariert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass VariableDeclaration:Element;&lt;br /&gt;
VertexClass SingleVariableDeclaration:VariableDeclaration { name:String, varargs:Boolean, dimension:Integer };&lt;br /&gt;
VertexClass VariableDeclarationFragment:VariableDeclaration { name:String, dimension:Integer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Anweisungen erben von &amp;lt;code&amp;gt;Statement&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass Statement:Element;&lt;br /&gt;
VertexClass AssertStatement:Statement;&lt;br /&gt;
VertexClass Block:Statement;&lt;br /&gt;
VertexClass BreakStatement:Statement { name:String };&lt;br /&gt;
VertexClass ConstructorInvocation:Statement;&lt;br /&gt;
VertexClass ContinueStatement:Statement { name:String };&lt;br /&gt;
VertexClass DoStatement:Statement;&lt;br /&gt;
VertexClass EmptyStatement:Statement;&lt;br /&gt;
VertexClass EnhancedForStatement:Statement;&lt;br /&gt;
VertexClass ExpressionStatement:Statement;&lt;br /&gt;
VertexClass ForStatement:Statement;&lt;br /&gt;
VertexClass IfStatement:Statement;&lt;br /&gt;
VertexClass LabeledStatement:Statement;&lt;br /&gt;
VertexClass ReturnStatement:Statement;&lt;br /&gt;
VertexClass SuperConstructorInvocation:Statement;&lt;br /&gt;
VertexClass SwitchCase:Statement;&lt;br /&gt;
VertexClass SwitchStatement:Statement;&lt;br /&gt;
VertexClass SynchronizedStatement:Statement;&lt;br /&gt;
VertexClass ThrowStatement:Statement;&lt;br /&gt;
VertexClass TryStatement:Statement;&lt;br /&gt;
VertexClass TypeDeclarationStatement:Statement;&lt;br /&gt;
VertexClass VariableDeclarationStatement:Statement;&lt;br /&gt;
VertexClass WhileStatement:Statement;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Ausdrücke erben von &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass Expression:Element;&lt;br /&gt;
VertexClass ArrayAccess:Expression;&lt;br /&gt;
VertexClass ArrayCreation:Expression;&lt;br /&gt;
VertexClass ArrayInitializer:Expression;&lt;br /&gt;
VertexClass Assignment:Expression { name:String };&lt;br /&gt;
VertexClass BooleanLiteral:Expression { content:String };&lt;br /&gt;
VertexClass CastExpression:Expression;&lt;br /&gt;
VertexClass CharacterLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ClassInstanceCreation:Expression;&lt;br /&gt;
VertexClass ConditionalExpression:Expression;&lt;br /&gt;
VertexClass FieldAccess:Expression;&lt;br /&gt;
VertexClass InfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass InstanceofExpression:Expression;&lt;br /&gt;
VertexClass LambdaExpression:Expression { parantheses:Boolean };&lt;br /&gt;
VertexClass MethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass NullLiteral:Expression;&lt;br /&gt;
VertexClass NumberLiteral:Expression { content:String };&lt;br /&gt;
VertexClass ParenthesizedExpression:Expression;&lt;br /&gt;
VertexClass PostfixExpression:Expression { name:String };&lt;br /&gt;
VertexClass PrefixExpression:Expression { name:String };&lt;br /&gt;
VertexClass StringLiteral:Expression { content:String };&lt;br /&gt;
VertexClass SuperFieldAccess:Expression;&lt;br /&gt;
VertexClass SuperMethodInvocation:Expression { name:String };&lt;br /&gt;
VertexClass ThisExpression:Expression;&lt;br /&gt;
VertexClass TypeLiteral:Expression;&lt;br /&gt;
VertexClass VariableDeclarationExpression:Expression;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In Variablen und Methoden-Referenzen kommen Unterklassen von &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; zum Einsatz:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass Name:Expression;&lt;br /&gt;
VertexClass SimpleName:Name { name:String };&lt;br /&gt;
VertexClass QualifiedName:Name;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annotationen erben von &amp;lt;code&amp;gt;Annotation&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass Annotation:Expression;&lt;br /&gt;
VertexClass MarkerAnnotation:Annotation;&lt;br /&gt;
VertexClass NormalAnnotation:Annotation;&lt;br /&gt;
VertexClass SingleMemberAnnotation:Annotation;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methoden-Referenzen erben von &amp;lt;code&amp;gt;MethodReference&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract VertexClass MethodReference:Expression;&lt;br /&gt;
VertexClass CreationReference:MethodReference;&lt;br /&gt;
VertexClass ExpressionMethodReference:MethodReference;&lt;br /&gt;
VertexClass SuperMethodReference:MethodReference { name:String };&lt;br /&gt;
VertexClass TypeMethodReference:MethodReference { name:String };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Verbindung zwischen Knoten hat auch jeweils einen Kantentyp, der sich aus den beteiligten Typen (oder ggf. deren Obertypen) ergibt. Alle Beziehungen sind als Eltern-Kind-Beziehung definiert, die die Baumstruktur abbildet. Hat ein Eltern-Knoten mehrere Kinder, sind diese entsprechend ihrer Reihenfolge im Code über ein Attribut der Kante durchnummeriert:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract EdgeClass Child from Node (0,1) to Node (0,*) { position:Integer } ;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationAnnotations:Child from AnnotationTypeDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationBodyDeclarations:Child from AnnotationTypeDeclaration (1,1) to AnnotationTypeMemberDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationModifiers:Child from AnnotationTypeDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeDeclarationName:Child from AnnotationTypeDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationAnnotations:Child from AnnotationTypeMemberDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationDefault:Child from AnnotationTypeMemberDeclaration (1,1) to Expression (0,1) role default;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationModifiers:Child from AnnotationTypeMemberDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationName:Child from AnnotationTypeMemberDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass AnnotationTypeMemberDeclarationType:Child from AnnotationTypeMemberDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass AnonymousClassDeclarationBodyDeclarations:Child from AnonymousClassDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass ArrayAccessArray:Child from ArrayAccess (1,1) to Expression (0,1) role array;&lt;br /&gt;
EdgeClass ArrayAccessIndex:Child from ArrayAccess (1,1) to Expression (0,1) role index;&lt;br /&gt;
EdgeClass ArrayCreationDimensions:Child from ArrayCreation (1,1) to Expression (0,*) role dimensions;&lt;br /&gt;
EdgeClass ArrayCreationInitializer:Child from ArrayCreation (1,1) to ArrayInitializer (0,1) role initializer;&lt;br /&gt;
EdgeClass ArrayCreationType:Child from ArrayCreation (1,1) to ArrayType (0,1) role type;&lt;br /&gt;
EdgeClass ArrayInitializerExpressions:Child from ArrayInitializer (1,1) to Expression (0,*) role expressions;&lt;br /&gt;
EdgeClass ArrayTypeComponentType:Child from ArrayType (1,1) to Type (0,1) role elementType;&lt;br /&gt;
EdgeClass AssertStatementMessage:Child from AssertStatement (1,1) to Expression (0,1) role message;&lt;br /&gt;
EdgeClass AssignmentLeftHandSide:Child from Assignment (1,1) to Expression (0,1) role leftHandSide;&lt;br /&gt;
EdgeClass AssignmentRightHandSide:Child from Assignment (1,1) to Expression (0,1) role rightHandSide;&lt;br /&gt;
EdgeClass BlockStatements:Child from Block (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass BodyDeclarationJavadoc:Child from BodyDeclaration (1,1) to Javadoc (0,1) role javadoc;&lt;br /&gt;
EdgeClass CastExpressionType:Child from CastExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CatchClauseBody:Child from CatchClause (1,1) to Block (0,*) role body;&lt;br /&gt;
EdgeClass CatchClauseException:Child from CatchClause (1,1) to SingleVariableDeclaration (0,*) role exception;&lt;br /&gt;
EdgeClass ClassInstanceCreationAnonymousClassDecl:Child from ClassInstanceCreation (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass ClassInstanceCreationArguments:Child from ClassInstanceCreation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ClassInstanceCreationType:Child from ClassInstanceCreation (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass CompilationUnitImports:Child from CompilationUnit (1,1) to ImportDeclaration (0,*) role imports;&lt;br /&gt;
EdgeClass CompilationUnitPackage:Child from CompilationUnit (1,1) to PackageDeclaration (0,*) role package;&lt;br /&gt;
EdgeClass CompilationUnitTypes:Child from CompilationUnit (1,1) to AbstractTypeDeclaration (0,*) role types;&lt;br /&gt;
EdgeClass ConditionalExpressionElseExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role elseExpression;&lt;br /&gt;
EdgeClass ConditionalExpressionThenExpression:Child from ConditionalExpression (1,1) to Expression (0,1) role thenExpression;&lt;br /&gt;
EdgeClass ConstructorInvocationArguments:Child from ConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass ConstructorInvocationTypeArguments:Child from ConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceTypeArguments:Child from CreationReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass CreationReferenceType:Child from CreationReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass DimensionAnnotations:Child from Dimension (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass DoStatementBody:Child from DoStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass ElementExpression:Child from Element (1,1) to Expression (0,*) role expression;&lt;br /&gt;
EdgeClass EnhancedForStatementBody:Child from EnhancedForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass EnhancedForStatementParameter:Child from EnhancedForStatement (1,1) to SingleVariableDeclaration (0,1) role parameter;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnonymousClassDeclaration:Child from EnumConstantDeclaration (1,1) to AnonymousClassDeclaration (0,1) role anonymousClassDeclaration;&lt;br /&gt;
EdgeClass EnumConstantDeclarationAnnotations:Child from EnumConstantDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumConstantDeclarationArguments:Child from EnumConstantDeclaration (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass EnumConstantDeclarationModifiers:Child from EnumConstantDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumConstantDeclarationName:Child from EnumConstantDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationAnnotations:Child from EnumDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass EnumDeclarationBodyDeclaration:Child from EnumDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass EnumDeclarationEnumConstants:Child from EnumDeclaration (1,1) to EnumConstantDeclaration (0,*) role enumConstants;&lt;br /&gt;
EdgeClass EnumDeclarationModifiers:Child from EnumDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass EnumDeclarationName:Child from EnumDeclaration (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass EnumDeclarationSuperInterfaceTypes:Child from EnumDeclaration (1,1) to Type (0,*) role superInterfaceTypes; &lt;br /&gt;
EdgeClass ExpressionMethodReferenceArguments:Child from ExpressionMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass ExpressionMethodReferenceName:Child from ExpressionMethodReference (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldAccessName:Child from FieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass FieldDeclarationAnnotation:Child from FieldDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass FieldDeclarationFragments:Child from FieldDeclaration (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass FieldDeclarationModifiers:Child from FieldDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass FieldDeclarationType:Child from FieldDeclaration (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass ForStatementBody:Child from ForStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass ForStatementInitializers:Child from ForStatement (1,1) to Expression (0,*) role initializers;&lt;br /&gt;
EdgeClass ForStatementUpdaters:Child from ForStatement (1,1) to Expression (0,*) role updaters;&lt;br /&gt;
EdgeClass IfStatementElseStatement:Child from IfStatement (1,1) to Statement (0,1) role elseStatement;&lt;br /&gt;
EdgeClass IfStatementThenStatement:Child from IfStatement (1,1) to Statement (0,1) role thenStatement;&lt;br /&gt;
EdgeClass IJavaProjectFragements:Child from IJavaProject (1,1) to IPackageFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass IJavaProjectUnits:Child from IJavaProject (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass InfixExpressionExtendedOperands:Child from InfixExpression (1,1) to Expression (0,*) role extendedOperands;&lt;br /&gt;
EdgeClass InfixExpressionLeftOperand:Child from InfixExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InfixExpressionRightOperand:Child from InfixExpression (1,1) to Expression (0,1) role rightOperand;&lt;br /&gt;
EdgeClass InitializerAnnotation:Child from Initializer (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass InitializerBody:Child from Initializer (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass InitializerModifiers:Child from Initializer (1,1) to Modifier(0,*) role modifiers2;&lt;br /&gt;
EdgeClass IntersectionTypeTypes:Child from IntersectionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass InstanceofExpressionLeftOperand:Child from InstanceofExpression (1,1) to Expression (0,1) role leftOperand;&lt;br /&gt;
EdgeClass InstanceofExpressionRightOperand:Child from InstanceofExpression (1,1) to Type (0,1) role rightOperand;&lt;br /&gt;
EdgeClass IPackageFragmentUnits:Child from IPackageFragment (1,1) to CompilationUnit (0,*) role units;&lt;br /&gt;
EdgeClass JavadocTags:Child from Javadoc (1,1) to TagElement (0,*) role tags;&lt;br /&gt;
EdgeClass LambdaExpressionBody:Child from LambdaExpression (1,1) to Element (0,1) role body;&lt;br /&gt;
EdgeClass LambdaExpressionParameters:Child from LambdaExpression (1,1) to VariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass LabeledStatementBody:Child from LabeledStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass LabeledStatementLabel:Child from LabeledStatement (1,1) to SimpleName (0,1) role label;&lt;br /&gt;
EdgeClass MarkerAnnotationTypeName:Child from MarkerAnnotation (1,1) to SimpleName (0,*) role typeName;&lt;br /&gt;
EdgeClass MemberRefName:Child from MemberRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberRefQualifier:Child from MemberRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MemberValuePairName:Child from MemberValuePair (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MemberValuePairValue:Child from MemberValuePair (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass MethodDeclarationAnnotation:Child from MethodDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass MethodDeclarationBody:Child from MethodDeclaration (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass MethodDeclarationModifiers:Child from MethodDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass MethodDeclarationParameters:Child from MethodDeclaration (1,1) to SingleVariableDeclaration (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverQualifier:Child from MethodDeclaration (1,1) to SimpleName (0,1) role receiverQualifier;&lt;br /&gt;
EdgeClass MethodDeclarationReceiverType:Child from MethodDeclaration (1,1) to Type (0,1) role receiverType;&lt;br /&gt;
EdgeClass MethodDeclarationReturnType:Child from MethodDeclaration (1,1) to Type (0,1) role returnType2;&lt;br /&gt;
EdgeClass MethodDeclarationThrownExceptions:Child from MethodDeclaration (1,1) to Type (0,*) role thrownExceptionTypes;&lt;br /&gt;
EdgeClass MethodDeclarationTypeParameters:Child from MethodDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass MethodInvocationArguments:Child from MethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass MethodRefName:Child from MethodRef (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameters:Child from MethodRef (1,1) to MethodRefParameter (0,*) role parameters;&lt;br /&gt;
EdgeClass MethodRefQualifier:Child from MethodRef (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass MethodRefParameterName:Child from MethodRefParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass MethodRefParameterType:Child from MethodRefParameter (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass NormalAnnotationTypeName:Child from NormalAnnotation (1,1) to Name (0,1) role typeName;&lt;br /&gt;
EdgeClass NormalAnnotationValues:Child from NormalAnnotation (1,1) to MemberValuePair (0,*) role values;&lt;br /&gt;
EdgeClass ParameterizedTypeType:Child from ParameterizedType (1,1) to SimpleType (0,1) role type;&lt;br /&gt;
EdgeClass ParameterizedTypeTypeArguments:Child from ParameterizedType (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass PostfixExpressionOperand:Child from PostfixExpression (1,1) to SimpleName (0,1) role operand;&lt;br /&gt;
EdgeClass PrefixExpressionOperand:Child from PrefixExpression (1,1) to Expression (0,1) role operand;&lt;br /&gt;
EdgeClass QualifiedNameName:Child from QualifiedName (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass QualifiedNameQualifier:Child from QualifiedName (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SimpleNameValues:Child from SimpleName (1,1) to MethodDeclaration (0,*) role values;&lt;br /&gt;
EdgeClass SimpleTypeAnnotation:Child from SimpleType (1,1) to Annotation (0,*) role annotations;&lt;br /&gt;
EdgeClass SimpleTypeName:Child from SimpleType (1,1) to Name (0,1) role name2;&lt;br /&gt;
EdgeClass SingleMemberAnnotationTypeName:Child from SingleMemberAnnotation (1,1) to SimpleName (0,1) role typeName;&lt;br /&gt;
EdgeClass SingleMemberAnnotationValue:Child from SingleMemberAnnotation (1,1) to Expression (0,1) role value;&lt;br /&gt;
EdgeClass SingleVariableDeclarationAnnotation:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass SingleVariableDeclarationExtraDimensions:Child from SingleVariableDeclaration (1,1) to Dimension (0,*) role extraDimensions2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationInitializer:Child from SingleVariableDeclaration (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass SingleVariableDeclarationModifiers:Child from SingleVariableDeclaration (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass SingleVariableDeclarationType:Child from SingleVariableDeclaration (1,1) to Type (0,*) role type;&lt;br /&gt;
EdgeClass SingleVariableDeclarationVarargsAnnotations:Child from SingleVariableDeclaration (1,1) to Annotation (0,*) role varargsAnnotations;&lt;br /&gt;
EdgeClass SuperConstructorInvocationArgument:Child from SuperConstructorInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperConstructorInvocationTypeArguments:Child from SuperConstructorInvocation (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperFieldAccessName:Child from SuperFieldAccess (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass SuperFieldAccessQualifier:Child from SuperFieldAccess(1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodInvocationArguments:Child from SuperMethodInvocation (1,1) to Expression (0,*) role arguments;&lt;br /&gt;
EdgeClass SuperMethodInvocationQualifier:Child from SuperMethodInvocation (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SuperMethodReferenceArguments:Child from SuperMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass SuperMethodReferenceQualifier:Child from SuperMethodReference (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass SwitchStatementStatements:Child from SwitchStatement (1,1) to Statement (0,*) role statements;&lt;br /&gt;
EdgeClass SynchronizedStatementBlock:Child from SynchronizedStatement (1,1) to Block (0,1) role body;&lt;br /&gt;
EdgeClass TagElementFragments1:Child from TagElement (1,1) to TextElement (0,*) role fragments1;&lt;br /&gt;
EdgeClass TagElementFragments2:Child from TagElement (1,1) to Name (0,*) role fragments2;&lt;br /&gt;
EdgeClass TagElementFragments3:Child from TagElement (1,1) to MethodRef (0,*) role fragments3;&lt;br /&gt;
EdgeClass TagElementFragments4:Child from TagElement (1,1) to MemberRef (0,*) role fragments4;&lt;br /&gt;
EdgeClass TagElementFragments5:Child from TagElement (1,1) to TagElement (0,*) role fragments5;&lt;br /&gt;
EdgeClass ThisExpressionQualifier:Child from ThisExpression (1,1) to Name (0,1) role qualifier;&lt;br /&gt;
EdgeClass TryStatementBody:Child from TryStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass TryStatementCatchClauses:Child from TryStatement (1,1) to CatchClause (0,*) role catchClauses;&lt;br /&gt;
EdgeClass TryStatementFinally:Child from TryStatement (1,1) to Block (0,1) role finally;&lt;br /&gt;
EdgeClass TryStatementResources:Child from TryStatement (1,1) to VariableDeclarationExpression (0,*) role resources;&lt;br /&gt;
EdgeClass TypeDeclarationAnnotation:Child from TypeDeclaration (1,1) to Annotation (0,*) role modifiers2;&lt;br /&gt;
EdgeClass TypeDeclarationBodyDeclarations1:Child from TypeDeclaration (1,1) to BodyDeclaration (0,*) role bodyDeclarations;&lt;br /&gt;
EdgeClass TypeDeclarationModifiers:Child from TypeDeclaration (1,1) to Modifier (0,*) role modifiers1;&lt;br /&gt;
EdgeClass TypeDeclarationSuperclassType:Child from TypeDeclaration (1,1) to Type (0,1) role superclassType;&lt;br /&gt;
EdgeClass TypeDeclarationSuperInterfaceTypes:Child from TypeDeclaration (1,1) to Type (0,*) role superInterfaceTypes;&lt;br /&gt;
EdgeClass TypeDeclarationTypeParameters:Child from TypeDeclaration (1,1) to TypeParameter (0,*) role typeParameters;&lt;br /&gt;
EdgeClass TypeLiteralType:Child from TypeLiteral (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeMethodReferenceArguments:Child from TypeMethodReference (1,1) to Type (0,*) role typeArguments;&lt;br /&gt;
EdgeClass TypeMethodReferenceType:Child from TypeMethodReference (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass TypeParameterName:Child from TypeParameter (1,1) to SimpleName (0,1) role name;&lt;br /&gt;
EdgeClass TypeParameterType:Child from TypeParameter (1,1) to Type (0,*) role typeBounds;&lt;br /&gt;
EdgeClass UnionTypeTypes:Child from UnionType (1,1) to Type (0,*) role types;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionAnnotation:Child from VariableDeclarationExpression (1,1) to Annotation (0,*) role modifiers1;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionFragments:Child from VariableDeclarationExpression (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionModifiers:Child from VariableDeclarationExpression (1,1) to Modifier (0,*) role modifiers2;&lt;br /&gt;
EdgeClass VariableDeclarationExpressionType:Child from VariableDeclarationExpression (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass VariableDeclarationFragmentInitializer:Child from VariableDeclarationFragment (1,1) to Expression (0,1) role initializer;&lt;br /&gt;
EdgeClass VariableDeclarationStatementFragments:Child from VariableDeclarationStatement (1,1) to VariableDeclarationFragment (0,*) role fragments;&lt;br /&gt;
EdgeClass VariableDeclarationStatementModifier:Child from VariableDeclarationStatement (1,1) to Modifier (0,*) role modifiers;&lt;br /&gt;
EdgeClass VariableDeclarationStatementType:Child from VariableDeclarationStatement (1,1) to Type (0,1) role type;&lt;br /&gt;
EdgeClass WhileStatementBody:Child from WhileStatement (1,1) to Statement (0,1) role body;&lt;br /&gt;
EdgeClass WildcardTypeBound1:Child from WildcardType (1,1) to ParameterizedType (0,*) role bound1;&lt;br /&gt;
EdgeClass WildcardTypeBound2:Child from WildcardType (1,1) to SimpleType (0,*) role bound2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JACK erzeugt zusätzliche Kanten vom Typ &amp;lt;code&amp;gt;Access &amp;lt;/code&amp;gt;, mit denen vom Zugriff auf ein Element auf dessen Deklaration verwiesen wird. Diese Kanten sind nicht Teil des Syntaxbaumes, sondern erweitern ihn zu einem Graph. Sie stehen nur zur Verfügung, wenn Zugriff und Deklaration innerhalb des geparsten Codes liegen:&lt;br /&gt;
&amp;lt;syntaxhighlight line=&#039;line&#039;&amp;gt;&lt;br /&gt;
abstract EdgeClass Access from Node (0,1) to Node (0,*);&lt;br /&gt;
EdgeClass ExpressionAccess1:Access from Expression (1,1) to BodyDeclaration (0,*) role access1;&lt;br /&gt;
EdgeClass ExpressionAccess2:Access from Expression (1,1) to VariableDeclaration (0,*) role access2;&lt;br /&gt;
EdgeClass TypeAccess:Access from Type (1,1) to TypeDeclaration (0,*) role access;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQLJavaChecker&amp;diff=8968</id>
		<title>GReQLJavaChecker</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=GReQLJavaChecker&amp;diff=8968"/>
		<updated>2023-08-25T08:06:46Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &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;
&#039;&#039;&amp;amp;rarr; Details zu den verwendeten GReQL-Bezeichnern:&#039;&#039; [[GReQL-Typegraph für Java]]&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>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=8710</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=8710"/>
		<updated>2023-07-12T06:43:09Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Codestil */&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=&#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;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>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=GReQL_Regeln&amp;diff=8709</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=8709"/>
		<updated>2023-07-12T06:41:15Z</updated>

		<summary type="html">&lt;p&gt;Striewe: /* Beispiele für statische Prüfregeln für UML-Modelle im XMI2-Format */&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;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;
&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=&#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;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>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Hauptseite&amp;diff=8627</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Hauptseite&amp;diff=8627"/>
		<updated>2023-06-12T14:15:56Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Herzlich Willkommenen im JACK-Wiki für Lehrende. In diesem Nachschlagewerk finden Sie eine umfassende Dokumentation über die Funktionen und die Arbeitsweise von JACK. Bei weitergehenden Fragen können Sie sich jederzeit [mailto:jack@paluno.uni-due.de per E-Mail] an uns wenden.&lt;br /&gt;
&lt;br /&gt;
== JACK 3 ==&lt;br /&gt;
JACK 3 ist die aktuelle Version des Übungs- und Prüfungssystems JACK, die an der Universität Duisburg-Essen und weiteren Hochschulen im Produktivbetrieb eingesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; row-gap:10px; column-gap:10px; width:100%; color:white;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Benutzerhandbuch|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold; text-decoration:underline;&amp;quot;&amp;gt;JACK 3 Benutzerhandbuch&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Das Benutzerhandbuch erklärt alle Einstellungsmöglichkeiten und Funktionen von JACK. Es bietet eine umfassende Referenz für alle, die JACK intensiv nutzen möchten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Versionshistorie (JACK3)|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold; text-decoration:underline;&amp;quot;&amp;gt;JACK 3 Versionshistorie&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Die Versionshistorie listet die neuesten JACK-Versionen und die darin neu eingeführten Features auf. Schauen Sie regelmäßig hier vorbei, um neue Möglichkeiten zu entdecken.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[https://jack-demo.s3.uni-due.de &amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold; text-decoration:underline;&amp;quot;&amp;gt;JACK 3 Demoserver&amp;lt;/span&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Auf unserem Demoserver können Sie das System aus Studierendensicht erleben. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de &amp;lt;span style=&amp;quot;color:white; text-decoration:underline;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um das System auch aus Lehrendensicht kennenzulernen.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kontakt und Support ==&lt;br /&gt;
&lt;br /&gt;
=== Mailingliste ===&lt;br /&gt;
Über unsere Mailingliste halten wir Sie über aktuelle Entwicklungen auf dem Laufenden. Sie können sich selbständig [https://lists.uni-due.de/mailman/listinfo/jack-announce in die Liste eintragen], um jederzeit über Updates und andere, wichtige Neuerungen informiert zu werden.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung von Prüfungsterminen ===&lt;br /&gt;
Wenn Sie eine Prüfung mit JACK durchführen möchten, melden Sie uns die Prüfung bitte [mailto:jack@paluno.uni-due.de per Mail] an. Nur so kann sichergestellt werden, dass Sie technischen Support bei der Durchführung der Prüfung erhalten und zur Prüfungszeit keine Wartungsarbeiten durchgeführt werden, die die Durchführung der Prüfung behindern könnten.&lt;br /&gt;
&lt;br /&gt;
== JACK 2 ==&lt;br /&gt;
JACK 2 ist die von einigen unserer Kunden noch eingesetzte Vorgängerversion von JACK 3. Mittelfristig ist eine Ablösung aller noch im Einsatz befindlichen Produktivsysteme von JACK2 vorgesehen. In JACK 2 werden &#039;&#039;keine neuen Funktionen&#039;&#039; mehr umgesetzt und es ist nur noch begrenzter technischer und inhaltlicher Support verfügbar. Für den Umzug von JACK 2 auf JACK 3 stehen Import-Funktionen und weitere Unterstützung zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[JACK 2 Benutzerhandbuch]]&lt;br /&gt;
* [[Evaluator|Der JACK 2 Evaluator]]&lt;br /&gt;
* [[Versionshistorie (Jack2)|JACK 2 Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(JACK3)&amp;diff=8626</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=8626"/>
		<updated>2023-06-12T14:10:48Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(JACK3)&amp;diff=8625</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=8625"/>
		<updated>2023-06-12T14:09:22Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Die Seite wurde neu angelegt: „==Mai 2023== ===Version 0.7.1=== Neuerungen in dieser Version: * Mit dem Stufentyp MCTable kehrt ein alter Bekannter aus JACK 2 wieder in den Schoß der JACK Familie zurück. * Der Aufgabeneditor hat jetzt ein Werkzeugmenü, über das auch der freie Moleküleditor verfügbar ist. * Mit dem Validator haben wir ein Werkzeug hinzugefügt, dass vor typischen Fehlern und Fehlkonfigurationen in Aufgaben und Kursen warnt. * Der Ex- und Import von Kursen ist jetz…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8624</id>
		<title>Benutzer:Striewe/Testseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8624"/>
		<updated>2023-06-12T13:57:53Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Herzlich Willkommenen im JACK-Wiki für Lehrende. In diesem Nachschlagewerk finden Sie eine umfassende Dokumentation über die Funktionen und die Arbeitsweise von JACK. Bei weitergehenden Fragen können Sie sich jederzeit [mailto:jack@paluno.uni-due.de per E-Mail] an uns wenden.&lt;br /&gt;
&lt;br /&gt;
== JACK 3 ==&lt;br /&gt;
JACK 3 ist die aktuelle Version des Übungs- und Prüfungssystems JACK, die an der Universität Duisburg-Essen und weiteren Hochschulen im Produktivbetrieb eingesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; row-gap:10px; column-gap:10px; width:100%; color:white;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Benutzerhandbuch|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Benutzerhandbuch&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Das Benutzerhandbuch erklärt alle Einstellungsmöglichkeiten und Funktionen von JACK. Es bietet eine umfassende Referenz für alle, die JACK intensiv nutzen möchten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Schnelleinstieg (JACK3)|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Schnelleinstieg&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Nutzen Sie den Schnelleinstieg, um in wenigen Schritten erste Inhalte in JACK anzulegen. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de|&amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um eine Schulung für einen persönlichen Einstieg zu erhalten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Versionshistorie (JACK3)|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Versionshistorie&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Die Versionshistorie listet die neuesten JACK-Versionen und die darin neu eingeführten Features auf. Schauen Sie regelmäßig hier vorbei, um neue Möglichkeiten zu entdecken.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[https://jack-demo.s3.uni-due.de &amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Demoserver&amp;lt;/span&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Auf unserem Demoserver können Sie das System aus Studierendensicht erleben. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de &amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um das System auch aus Lehrendensicht kennenzulernen.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kontakt und Support ==&lt;br /&gt;
&lt;br /&gt;
=== Mailingliste ===&lt;br /&gt;
Über unsere Mailingliste halten wir Sie über aktuelle Entwicklungen auf dem Laufenden. Sie können sich selbständig [https://lists.uni-due.de/mailman/listinfo/jack-announce in die Liste eintragen], um jederzeit über Updates und andere, wichtige Neuerungen informiert zu werden.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung von Prüfungsterminen ===&lt;br /&gt;
Wenn Sie eine Prüfung mit JACK durchführen möchten, melden Sie uns die Prüfung bitte [mailto:jack@paluno.uni-due.de per Mail] an. Nur so kann sichergestellt werden, dass Sie technischen Support bei der Durchführung der Prüfung erhalten und zur Prüfungszeit keine Wartungsarbeiten durchgeführt werden, die die Durchführung der Prüfung behindern könnten.&lt;br /&gt;
&lt;br /&gt;
== JACK 2 ==&lt;br /&gt;
JACK 2 ist die von einigen unserer Kunden noch eingesetzte Vorgängerversion von JACK 3. Mittelfristig ist eine Ablösung aller noch im Einsatz befindlichen Produktivsysteme von JACK2 vorgesehen. In JACK 2 werden &#039;&#039;keine neuen Funktionen&#039;&#039; mehr umgesetzt und es ist nur noch begrenzter technischer und inhaltlicher Support verfügbar. Für den Umzug von JACK 2 auf JACK 3 stehen Import-Funktionen und weitere Unterstützung zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[JACK 2 Benutzerhandbuch]]&lt;br /&gt;
* [[Evaluator|Der JACK 2 Evaluator]]&lt;br /&gt;
* [[Versionshistorie (Jack2)|JACK 2 Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Neuigkeiten&amp;diff=8623</id>
		<title>Neuigkeiten</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Neuigkeiten&amp;diff=8623"/>
		<updated>2023-06-12T13:52:53Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Weiterleitungsziel von Neuigkeiten (Jack2) nach Versionshistorie (Jack2) geändert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#WEITERLEITUNG [[Versionshistorie (Jack2)]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Neuigkeiten_(Jack2)&amp;diff=8622</id>
		<title>Neuigkeiten (Jack2)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Neuigkeiten_(Jack2)&amp;diff=8622"/>
		<updated>2023-06-12T13:52:26Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Striewe verschob die Seite Neuigkeiten (Jack2) nach Versionshistorie (Jack2)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#WEITERLEITUNG [[Versionshistorie (Jack2)]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(Jack2)&amp;diff=8621</id>
		<title>Versionshistorie (Jack2)</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Versionshistorie_(Jack2)&amp;diff=8621"/>
		<updated>2023-06-12T13:52:26Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Striewe verschob die Seite Neuigkeiten (Jack2) nach Versionshistorie (Jack2)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Februar 2022 ==&lt;br /&gt;
==== JACK 2.6.11 ====&lt;br /&gt;
* Die Fehler, die die Bewertung von Aufgaben verhindert haben (Bewertungen wurden nicht für die entsprechende Einreichung verbucht), wurden behoben.&lt;br /&gt;
* Fehler beim Aktivieren des Prüfungsmodus wurden behoben.&lt;br /&gt;
* R-Aufgaben werden nach dem Betreten nicht mehr direkt als &amp;quot;Bearbeitet&amp;quot; angezeigt, sondern erst nach einer Einreichung.&lt;br /&gt;
* Die Anzahl der Lösungen wird nun korrekt im Excel-Export angezeigt.&lt;br /&gt;
* Verbesserungen des Excel-Exportes von R-Aufgaben:&lt;br /&gt;
** Im Excel-Export von R-Aufgaben ist jetzt bei den Hinweisen(H) &amp;quot;N/A&amp;quot; eingetragen.&lt;br /&gt;
** Die bislang fehlende Punktezahl wird jetzt bei &amp;quot;Stufe 1&amp;quot; eingetragen.&lt;br /&gt;
** R-Aufgaben tauchen nicht mehr im Tabellenblatt &amp;quot;fillInDetails&amp;quot; auf.&lt;br /&gt;
* Ein Fehler, der das Anzeigen von Hinweisen in R-Aufgaben verhindert hat, wurde behoben.&lt;br /&gt;
* Ein Fehler, durch den die Aufgabenliste eines Kurses in einer Aufgabenbearbeitung angezeigt wurde, wurde behoben.&lt;br /&gt;
* Der Fehler, der Kurse mit Zeitlimit noch vor Ablauf der Zeit  nicht mehr bearbeitbar gemacht hat, wurde behoben.&lt;br /&gt;
* Aufgaben mit gleichem Namen sind im Excel-Export nun durch das Hinzufügen ihrer Ids unterscheidbar.&lt;br /&gt;
&lt;br /&gt;
== August 2021 ==&lt;br /&gt;
==== &#039;&#039;02.August 2021&#039;&#039;: JACK 2.6.8 ====&lt;br /&gt;
* Beim Importieren von fehlerhaften Aufgaben wird nun eine für den Nutzer brauchbare Fehlermeldung ausgegeben.&lt;br /&gt;
* Ein Fehler, der die Bearbeitung einer R-Aufgabe verhindern konnte, wurde behoben.&lt;br /&gt;
* Ein Fehler, bei dem das Betrachten einer R-Aufgabe im Lösungsüberblick eine Einreichung verursacht hat, wurde behoben.&lt;br /&gt;
* Starten einer AES-Aufgabe zeigt nun nicht mehr die solutionData aus einer vorher bearbeiteten R-Aufgabe an.&lt;br /&gt;
&lt;br /&gt;
== Juli 2021 ==&lt;br /&gt;
==== &#039;&#039;12.Juli 2021&#039;&#039;: JACK 2.6.8 ====&lt;br /&gt;
* Wurde mithilfe der &amp;quot;Zurück-Funktion&amp;quot; des Browsers während der Bearbeitung einer Aufgabe die Seite gewechselt, wurden Einreichungen in speziellen Fällen nicht mehr angenommen. Passen Aufgabe und Einreichung nicht zusammen, wird den Studierenden nun eine Fehlerseite mit Anweisungen angezeigt. Die Dokumentation der Fehlerseite finden Sie [[Navigations-Fehlerseite| hier]].&lt;br /&gt;
* Aufgaben werden nun nicht mehr zu Unrecht als &amp;quot;zu spät eingereicht&amp;quot; gewertet.&lt;br /&gt;
* Zeilen, die in R-Aufgaben nur eine Leerstelle enthalten, verursachen nun keinen Fehler mehr.&lt;br /&gt;
&lt;br /&gt;
== März 2021 ==&lt;br /&gt;
==== &#039;&#039;01.März 2021&#039;&#039;: JACK 2.6.6====&lt;br /&gt;
* Verspätete Einreichungen oder interne Fehler verschlechtern den Kursdurchschnitt nicht mehr&lt;br /&gt;
* Kurse enden nun nicht mehr verfrüht.&lt;br /&gt;
* Fehlender Auslöser für die Erstellung von BackendJobs wurde ergänzt.&lt;br /&gt;
* Ein Fehler, der bei der Aktualisierung des Kursdurchschnittes auftrat, wurde behoben.&lt;br /&gt;
* Die Sortierung der Kursaufgaben in der Kursbearbeitung findet nun alphabetisch statt.&lt;br /&gt;
* Lösungsüberblick kann nun, wenn vom Lehrenden deaktiviert, nicht mehr exportiert werden (teilweise als Hotfix bereits verteilt).&lt;br /&gt;
* Aufgaben lassen sich nun durch &amp;quot;Alle erneut checken&amp;quot; wieder erneut überprüfen.&lt;br /&gt;
* Nicht-abgeschlossene Kursabgaben werden nun in der Kursstatistik miteinbezogen.&lt;br /&gt;
* Im Lösungsüberblick werden Einreichungen der 53. Kalenderwoche nicht mehr falsch einsortiert.&lt;br /&gt;
&lt;br /&gt;
== Dezember 2020 ==&lt;br /&gt;
====&#039;&#039;16.Dezember 2020&#039;&#039;: JACK 2.6.5====&lt;br /&gt;
* Evaluatorregeln in Prüfungen akzeptieren nun 4096 Zeichen.&lt;br /&gt;
* Meldung bei der Authentifizierung auf Moodle überarbeitet.&lt;br /&gt;
* Wenn die Umleitung in Moodle nicht korrekt funktioniert, wird nun der korrekte Fehler angezeigt&lt;br /&gt;
* Fehlende Vorlagen in der Aufgabenliste eines Kurses von Moodle heraus wurden der Ansicht hinzugefügt&lt;br /&gt;
&lt;br /&gt;
== Juli 2020 ==&lt;br /&gt;
==== &#039;&#039;15.Juli 2020&#039;&#039;: JACK 2.6.4====&lt;br /&gt;
* Ein Fehler, der beim Testen einer Aufgabe, nachdem sie auf einem speziellen Weg aufgerufen worden ist, aufgetreten ist, wurde behoben.&lt;br /&gt;
* Die Palette der Mathematik-Didaktikern wurde repariert.&lt;br /&gt;
* Die im Hintergrund genutzte Java-Version wurde aktualisiert.&lt;br /&gt;
* Aufgaben in Kursen werden nun geordnet aufgelistet.&lt;br /&gt;
&lt;br /&gt;
== Januar 2020 ==&lt;br /&gt;
* &#039;&#039;16.Januar 2020&#039;&#039;:&#039;&#039;&#039;JACK 2.6.3&#039;&#039;&#039;&lt;br /&gt;
Fixes:&lt;br /&gt;
*Hinweisbutton in R-Aufgaben ist nicht mehr anwählbar, wenn keine Hinweise mehr verfügbar sind&lt;br /&gt;
*Fehlenden Button &amp;quot;Aufgabe beenden und zum Lösungsüberblick&amp;quot; im Hauptmenü bei Formbased Aufgaben eingefügt (in Moodle)&lt;br /&gt;
*Link zum Lösungsüberblick im Hauptmenü bei Kursen eingefügt (in Moodle)&lt;br /&gt;
*Eingabe der Art &amp;lt;code&amp;gt;-(-2)&amp;lt;/code&amp;gt; werden nicht mehr vom Formulaeditor geändert&lt;br /&gt;
*Multiplikationen der Form &amp;lt;code&amp;gt;(x+1)(x-1)&amp;lt;/code&amp;gt; werden auch ohne Malzeichen evaluiert&lt;br /&gt;
* Beim Befehl &amp;lt;code&amp;gt;eval&amp;lt;/code&amp;gt; wird nicht mehr der Rechenweg angezeigt, wenn ein Ergebnis nicht ausrechenbar ist&lt;br /&gt;
&lt;br /&gt;
OrbitalChecker:&lt;br /&gt;
*Spezielles Feedback für das Element Niob&lt;br /&gt;
*Check um Hund&#039;sche Regeln erweitert&lt;br /&gt;
&lt;br /&gt;
Formulaeditor:&lt;br /&gt;
*Palette für Mathematikdidaktiker hinzugefügt&lt;br /&gt;
&lt;br /&gt;
== Oktober 2019 ==&lt;br /&gt;
* &#039;&#039;31. September 2019&#039;&#039;: &#039;&#039;&#039;JACK 2.6.2&#039;&#039;&#039;&lt;br /&gt;
Evaluator:&lt;br /&gt;
&lt;br /&gt;
* Versionsnummer wurde von 3.1.13 auf 3.1.14 geändert.&lt;br /&gt;
&lt;br /&gt;
OrbitalChecker:&lt;br /&gt;
&lt;br /&gt;
* Eine zusätzliche Überprüfung zur Füllung der Orbitale wurde hinzugefügt.&lt;br /&gt;
* Die Standardantworten für den OrbitalChecker wurden überarbeitet.&lt;br /&gt;
&lt;br /&gt;
Generelles:&lt;br /&gt;
&lt;br /&gt;
* Eine Lücke im Rechtesystem wurde geschlossen.&lt;br /&gt;
* Nutzer bekommen nur noch Aufgaben in der Suche angezeigt, für die sie autorisiert sind.&lt;br /&gt;
* Nutzer, die sich anonym einloggen, bekommen nun einen zufällig generierten Namen.&lt;br /&gt;
== September 2019 ==&lt;br /&gt;
* &#039;&#039;19. September 2019&#039;&#039;: &#039;&#039;&#039; JACK 2.6.1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Einige Fehlernachrichten vom InstantOrbitalChecker wurden überarbeitet&lt;br /&gt;
* Der Verweis zur Startseite wird nun ausgeblendet, wenn der Nutzer über Moodle authentifiziert wurde.&lt;br /&gt;
* Ein Fehler der während einer Prüfung auftreten kann wurde behoben.&lt;br /&gt;
* Für die Dropbox-Anbindung wird nur noch der Token verwendet.&lt;br /&gt;
* Ein Fehler, der dazu führte, dass die Chemie-Palette nicht mehr mit den Fill-In Feldern verknüpft war, wurde behoben.&lt;br /&gt;
* Die Hinweise bei R-Aufgaben sollten nun nicht mehr beim Wechseln der Aufgabe übernommen werden.&lt;br /&gt;
* Eine zusätzliche Feedback-Option wurde für den InstantOrbitalChecker hinzugefügt.&lt;br /&gt;
* Eine fehlende Leerstelle zwischen &amp;quot;Frage&amp;quot; und der Nummer der Frage wurden hinzugefügt.&lt;br /&gt;
* Eine überflüssige Leerstelle bei der Anzeige des Aufgabennamens (beim bearbeiten der Aufgabe) wurde entfernt.&lt;br /&gt;
* In Kursen mit nicht-Formbased Aufgaben sollte der Wert &amp;quot;Durchschnittspunkte&amp;quot; im Lösungsüberblick des Kurses nun (korrekt) berechnet werden.&lt;br /&gt;
* Das Feature &amp;quot;Distraktoranalyse&amp;quot; ist bis auf weiteres nicht mehr nutzbar. **Variablen sollten nun nicht mehr mithilfe von &amp;quot;McIndex-Variablen&amp;quot; ( https://jack-community.org/wiki/index.php?title=McIndex-Variablen ) gesetzt werden.**&lt;br /&gt;
&lt;br /&gt;
== Juni 2019 ==&lt;br /&gt;
* &#039;&#039;10.Juli 2019&#039;&#039;: &#039;&#039;&#039;JACK 2.6.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Erweiterungen:&lt;br /&gt;
&lt;br /&gt;
* Ein neuer Aufgabentyp &amp;quot;Orbitalmodell&amp;quot; (inkl. eines dazugehörigen Editors) wurde als Stufentyp von Formbased-Aufgaben hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
Änderungen:&lt;br /&gt;
&lt;br /&gt;
* Die Evaluierungsregel wird nicht mehr bei der Erstellung von Formbased-Aufgaben angezeigt, da diese bei der Bepunktung einer Aufgabe nicht beachtet wird.&lt;br /&gt;
* Ist die Evaluierungsregel ungültig, wird nun ein Fehler angezeigt.&lt;br /&gt;
* Das Exportieren von Ergebnissen als Excel-Tabelle wird nur noch bis 255 Spalten unterstützt. Bei 256 oder mehr Spalten werden nur die Ersten 255 Spalten in einer Exel-Tabelle ausgegeben und eine Fehlernachricht wird angezeigt.&lt;br /&gt;
* Die Ergebnisübersicht wurde überarbeitet und zeigt nun nicht mehr jede Einreichung, sondern nur noch die Letzte.&lt;br /&gt;
* Einige Standardpaletten wurden überarbeitet. Eine Übersicht über die aktuellen Standardpaletten und einen Hinweis zu den Symbolen, die im Moment nicht ausgewertet werden können, finden Sie auf: https://jack-community.org/wiki/index.php/Standardpaletten &lt;br /&gt;
* Die ID einer Ressource wird nun auf der Seite &amp;quot;Aufgabe bearbeiten&amp;quot; angezeigt.&lt;br /&gt;
&lt;br /&gt;
Fixes:&lt;br /&gt;
&lt;br /&gt;
* Das Auswerten von R-Code, in dem vom Lernenden eine Funktion definiert wird, ist nun möglich.&lt;br /&gt;
* Der experimentelle Kurs &amp;quot;Adaptiver Kurs&amp;quot; ist nun über Moodle absolvierbar.&lt;br /&gt;
* Der experimentelle Kurs &amp;quot;Adaptiver Kurs&amp;quot; gibt nun die angedachten Werte als Referenzwerte aus.&lt;br /&gt;
* Ein Fehler, der bei der Evaluierung eines Betrages auftreten konnte, wurde behoben.&lt;br /&gt;
* Ein Fehler beim Exportieren von Lösungen eines Nutzers als Zip-Datei wurde behoben.&lt;br /&gt;
* SCList Aufgaben können nun in Prüfungen mehrfach eingereicht werden.&lt;br /&gt;
* Das Filtern nach Matrikelnummern ist nun wieder möglich.&lt;br /&gt;
* Aufgaben mit einem bestimmten Fehler in der exerciseChain können wieder über die Übersicht erreichen werden.&lt;br /&gt;
* Ein Fehler, der bei der Navigation in der Oberfläche auftreten kann, wurde behoben.&lt;br /&gt;
* Ein Fehler, der die Knöpfe zur Navigation zwischen den Fragen einer Aufgabe fehlen ließ, wurde behoben.&lt;br /&gt;
* Beim Absolvieren von Kursen in JACK (nicht von Moodle aus) ist nun nicht mehr fälschlicherweise der Knopf &amp;quot;Vorherige Aufgabe&amp;quot; bzw. &amp;quot;Nächste Aufgabe&amp;quot; anwählbar (falls es eine nächste Aufgabe gibt, ist er natürlich immer noch anwählbar)&lt;br /&gt;
&lt;br /&gt;
== Januar 2019 ==&lt;br /&gt;
* &#039;&#039;10.Januar 2019&#039;&#039;: &#039;&#039;&#039;JACK 2.5.6&#039;&#039;&#039;&lt;br /&gt;
*Das Variabalen- und Evaluator-Feld wird dem Lehrenden nun in allen FormBased-Aufgaben angezeigt&lt;br /&gt;
*Man kann den Formulaeditor nun auch pro Stage einbinden&lt;br /&gt;
*Als Admin kann man nun die Namen der eingeloggten User sehen&lt;br /&gt;
*Fehlermeldungen für Aufgaben, von denen man Besitzer ist, werden einem angezeigt&lt;br /&gt;
*Neue Math-Evaluatorfunktionen : arccosh, arccot, arccoth, arccsc, arccsch, arcsec, arcsech, arcsinh, arctan, arctanh, cosh, cot, coth, csc, csch, sec, sech, sinh, tanh&lt;br /&gt;
*Adaptiver Kursmodus: Ausgabe der Fähigkeit und des geschätzten Fehlers möglich&lt;br /&gt;
*Neue Funktion im ChemEvaluator: Particle&lt;br /&gt;
&lt;br /&gt;
== August 2018 ==&lt;br /&gt;
* &#039;&#039;29. August 2018&#039;&#039;: &#039;&#039;&#039;JACK 2.5&#039;&#039;&#039;&lt;br /&gt;
** Der Lösungsüberblick zu Kursen ist nun in den Kurseinstellungen ein- und ausschaltbar. Standardmäßig sind diese bei schon existierenden Kursen sichtbar. &lt;br /&gt;
** Der &#039;&#039;&#039;Evaluator&#039;&#039;&#039; unterstützt nun auch OpenChem mithilfe des [[ChemEvaluator]]s:&lt;br /&gt;
*** arith1: [[Plus]], [[Times]], [[UnaryMinus]], [[UnaryPlus]]&lt;br /&gt;
*** chemistry1: [[CheckOxidationState]], [[CheckStateOfMatter]], [[CompareNumberOfAtoms]], [[ConsistOf]], [[Contains]]&lt;br /&gt;
*** list1: [[List]]&lt;br /&gt;
*** logic1: [[And]], [[False]], [[Not]], [[Or]], [[True]]&lt;br /&gt;
*** molecule1: [[AtomarrayElement]], [[Atomarray]], [[Charge]], [[Molecule]], [[OxidationState]], [[StateOfMatter]]&lt;br /&gt;
*** nums1: [[E]], [[PI]]&lt;br /&gt;
*** periodictable_group1 - 18&lt;br /&gt;
*** testterminal_jack: [[IsEmpty]]&lt;br /&gt;
*** variable_jack: [[Exercise]], [[FillIn]]&lt;br /&gt;
** Des Weiteren verhält sich das Zeichen „/“ in Mathematik-Formeln nun exakt (d.h. als Bruch). Möchte man eine Dezimalzahl erzeugen, so kann man den „:“-Operator nutzen. &lt;br /&gt;
*** Neue MathEvaluator-Funktionen: [[IsVector]], [[IsNVector]], [[GetFromMatrix]], [[GetFromVector]]&lt;br /&gt;
&lt;br /&gt;
== Juni 2018 ==&lt;br /&gt;
* &#039;&#039;13. Juni 2018&#039;&#039;: Die [[:Kategorie:Testfunktionen|Testfunktionen]] des Evaluators haben Zuwachs bekommen: Mit [[IsVector]] und [[IsNVector]] können nun Vektoren überprüft werden.&lt;br /&gt;
* &#039;&#039;6. Juni 2018&#039;&#039;: Die Dokumentation für den [[TracingChecker]] und den [[KovidaChecker (Jack2)|KovidaChecker]] für Programmieraufgaben ist nun auch in diesem Wiki verfügbar.&lt;br /&gt;
* &#039;&#039;5. Juni 2018&#039;&#039;: Die meisten JACK-Instanzen wurden eine neue Version mit vielen kleinen Fehlerkorrekturen und Verbesserungen aktualisiert.&lt;br /&gt;
&lt;br /&gt;
== April 2018 ==&lt;br /&gt;
* &#039;&#039;25. April 2018&#039;&#039;: Mit der neuen Evaluator-Funktion [[ImplodeList]] können nun Listen in Zeichenketten verwandelt werden.&lt;br /&gt;
&lt;br /&gt;
== November 2017 ==&lt;br /&gt;
* &#039;&#039;20. November 2017&#039;&#039;: Der Evaluator 2.0 läuft nun auch auf http://jack.s3.uni-due.de. Hinweise zu notwendigen Änderungen an formularbasierten Aufgaben findet man unter [[Migration zur Evaluator 2 Syntax]]&lt;br /&gt;
&lt;br /&gt;
== Oktober 2017 ==&lt;br /&gt;
* &#039;&#039;04. Oktober 2017&#039;&#039;: Die Funktionen des [[Evaluator|Evaluators]] sind nun in diesem Wiki kategorisiert. Eine Übersicht aller Kategorien findet man unter [[:Kategorie:Evaluatorfunktionenkategorie|Evaluatorfunktionenkategorien]]&lt;br /&gt;
&lt;br /&gt;
== September 2017 ==&lt;br /&gt;
* &#039;&#039;29. September 2017&#039;&#039;: Auf der Spielwiese läuft seit heute Version 2 vom [[Evaluator]]. Neu ist insbesondere, dass Lehrende in den Funktionen anstatt CAS-Syntax sogenannte [[:Kategorie:Konstruktoren|Konstruktoren]] verwendet werden müssen. Dies zieht ggf. Änderungen nach sich, z.B. an der Funktion [[equalsExpr]].&lt;br /&gt;
&lt;br /&gt;
== August 2017 ==&lt;br /&gt;
* &#039;&#039;30. August 2017&#039;&#039;: In [[Checker#InstantFillInChecker|Fill-In-Aufgaben]] können die Warnungen des Checkers bei leerer Eingabe unterdrückt werden. Die Dokumentation dazu findet man im Artikel [[Stage]] in der Erläuterung des Tags &#039;&#039;&#039;exercise&#039;&#039;&#039;. Bisher kann dieses Feature nur auf der Spielwiese verwendet werden.&lt;br /&gt;
* &#039;&#039;29. August 2017&#039;&#039;: Sage läuft jetzt in JACK auf Version 8.0&lt;br /&gt;
* &#039;&#039;29. August 2017&#039;&#039;: [[Checker#InstantFillInChecker|Fill-In-Aufgaben]] erhalten eine [[Evaluator-Konsole]] für Lehrende, um Aufgaben einfacher Testen zu können.&lt;br /&gt;
&lt;br /&gt;
== Juli 2017 ==&lt;br /&gt;
* &#039;&#039;5. Juli 2017&#039;&#039;: Der Server jack-server05.s3.uni-due.de (Spielwiese) wird ab ca. 14:45 Uhr offline sein um ihn zu aktualisieren. Bis ca. 16 Uhr sollten alle Maßnahmen abgeschlossen und der Server wieder verfügbar sein. Vielen Dank für ihr Verständnis!&lt;br /&gt;
&lt;br /&gt;
== Juni 2017 ==&lt;br /&gt;
* &#039;&#039;29. Juni 2017&#039;&#039;: Eine neue stabile Version findet sich auf allen JACK-Servern, eine neue Testversion (2.4.2) befindet sich auf der Spielwiesen-Instanz! Im Wesentlichen beinhaltet die neue Version zahlreiche Bugfixes.&lt;br /&gt;
* &#039;&#039;19. Juni 2017&#039;&#039;: Herzlich Willkommen auf dem Feature-News-Ticker. Auf dieser Seite stellen wir in Zukunft neue Features innerhalb von JACK vor und dokumentieren ihre Verwendung. Bitte schauen Sie also regelmäßig rein.&lt;br /&gt;
&lt;br /&gt;
[[Category:Hauptseiten]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8620</id>
		<title>Benutzer:Striewe/Testseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8620"/>
		<updated>2023-06-12T13:50:31Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Herzlich Willkommenen im JACK-Wiki für Lehrende. In diesem Nachschlagewerk finden Sie eine umfassende Dokumentation über die Funktionen und die Arbeitsweise von JACK. Bei weitergehenden Fragen können Sie sich jederzeit [mailto:jack@paluno.uni-due.de per E-Mail] an uns wenden.&lt;br /&gt;
&lt;br /&gt;
== JACK 3 ==&lt;br /&gt;
JACK 3 ist die aktuelle Version des Übungs- und Prüfungssystems JACK, die an der Universität Duisburg-Essen und weiteren Hochschulen im Produktivbetrieb eingesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; row-gap:10px; column-gap:10px; width:100%; color:white;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Benutzerhandbuch|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Benutzerhandbuch&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Das Benutzerhandbuch erklärt alle Einstellungsmöglichkeiten und Funktionen von JACK. Es bietet eine umfassende Referenz für alle, die JACK intensiv nutzen möchten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Schnelleinstieg (JACK3)|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Schnelleinstieg&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Nutzen Sie den Schnelleinstieg, um in wenigen Schritten erste Inhalte in JACK anzulegen. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de|&amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um eine Schulung für einen persönlichen Einstieg zu erhalten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Versionshistorie (JACK3)|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Versionshistorie&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Die Versionshistorie listet die neuesten JACK-Versionen und die darin neu eingeführten Features auf. Schauen Sie regelmäßig hier vorbei, um neue Möglichkeiten zu entdecken.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[https://jack-demo.s3.uni-due.de &amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Demoserver&amp;lt;/span&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Auf unserem Demoserver können Sie das System aus Studierendensicht erleben. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de &amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um das System auch aus Lehrendensicht kennenzulernen.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kontakt und Support ==&lt;br /&gt;
&lt;br /&gt;
=== Mailingliste ===&lt;br /&gt;
Über unsere Mailingliste halten wir Sie über aktuelle Entwicklungen auf dem Laufenden. Sie können sich selbständig [https://lists.uni-due.de/mailman/listinfo/jack-announce in die Liste eintragen], um jederzeit über Updates und andere, wichtige Neuerungen informiert zu werden.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung von Prüfungsterminen ===&lt;br /&gt;
Wenn Sie eine Prüfung mit JACK durchführen möchten, melden Sie uns die Prüfung bitte [mailto:jack@paluno.uni-due.de per Mail] an. Nur so kann sichergestellt werden, dass Sie technischen Support bei der Durchführung der Prüfung erhalten und zur Prüfungszeit keine Wartungsarbeiten durchgeführt werden, die die Durchführung der Prüfung behindern könnten.&lt;br /&gt;
&lt;br /&gt;
== JACK 2 ==&lt;br /&gt;
JACK 2 ist die von einigen unserer Kunden noch eingesetzte Vorgängerversion von JACK 3. Mittelfristig ist eine Ablösung aller noch im Einsatz befindlichen Produktivsysteme von JACK2 vorgesehen. In JACK 2 werden &#039;&#039;keine neuen Funktionen&#039;&#039; mehr umgesetzt und es ist nur noch begrenzter technischer und inhaltlicher Support verfügbar. Für den Umzug von JACK 2 auf JACK 3 stehen Import-Funktionen und weitere Unterstützung zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[JACK 2 Benutzerhandbuch]]&lt;br /&gt;
* [[Evaluator|Der JACK 2 Evaluator]]&lt;br /&gt;
* [[Neuigkeiten|JACK 2 Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8421</id>
		<title>Benutzer:Striewe/Testseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8421"/>
		<updated>2023-06-01T11:04:59Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Herzlich Willkommenen im JACK-Wiki für Lehrende. In diesem Nachschlagewerk finden Sie eine umfassende Dokumentation über die Funktionen und die Arbeitsweise von JACK. Bei weitergehenden Fragen können Sie sich jederzeit [mailto:jack@paluno.uni-due.de per E-Mail] an uns wenden.&lt;br /&gt;
&lt;br /&gt;
== JACK 3 ==&lt;br /&gt;
JACK 3 ist die aktuelle Version des Übungs- und Prüfungssystems JACK, die an der Universität Duisburg-Essen und weiteren Hochschulen im Produktivbetrieb eingesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; row-gap:10px; column-gap:10px; width:100%; color:white;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Benutzerhandbuch|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Benutzerhandbuch&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Das Benutzerhandbuch erklärt alle Einstellungsmöglichkeiten und Funktionen von JACK. Es bietet eine umfassende Referenz für alle, die JACK intensiv nutzen möchten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Schnelleinstieg (JACK3)|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Schnelleinstieg&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Nutzen Sie den Schnelleinstieg, um in wenigen Schritten erste Inhalte in JACK anzulegen. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de|&amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um eine Schulung für einen persönlichen Einstieg zu erhalten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Versionshistorie (JACK3)|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Versionshistorie&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Die Versionshistorie listet die neuesten JACK-Versionen und die darin neu eingeführten Features auf. Schauen Sie regelmäßig hier vorbei, um neue Möglichkeiten zu entdecken.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[https://jack-demo.s3.uni-due.de|&amp;lt;span style=&amp;quot;color:white; font-size:140%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Demoserver&amp;lt;/span&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Auf unserem Demoserver können Sie das System aus Studierendensicht erleben. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de|&amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um das System auch aus Lehrendensicht kennenzulernen.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kontakt und Support ==&lt;br /&gt;
&lt;br /&gt;
=== Mailingliste ===&lt;br /&gt;
Über unsere Mailingliste halten wir Sie über aktuelle Entwicklungen auf dem Laufenden. Sie können sich selbständig [https://lists.uni-due.de/mailman/listinfo/jack-announce in die Liste eintragen], um jederzeit über Updates und andere, wichtige Neuerungen informiert zu werden.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung von Prüfungsterminen ===&lt;br /&gt;
Wenn Sie eine Prüfung mit JACK durchführen möchten, melden Sie uns die Prüfung bitte [mailto:jack@paluno.uni-due.de per Mail] an. Nur so kann sichergestellt werden, dass Sie technischen Support bei der Durchführung der Prüfung erhalten und zur Prüfungszeit keine Wartungsarbeiten durchgeführt werden, die die Durchführung der Prüfung behindern könnten.&lt;br /&gt;
&lt;br /&gt;
== JACK 2 ==&lt;br /&gt;
JACK 2 ist die von einigen unserer Kunden noch eingesetzte Vorgängerversion von JACK 3. Mittelfristig ist eine Ablösung aller noch im Einsatz befindlichen Produktivsysteme von JACK2 vorgesehen. In JACK 2 werden &#039;&#039;keine neuen Funktionen&#039;&#039; mehr umgesetzt und es ist nur noch begrenzter technischer und inhaltlicher Support verfügbar. Für den Umzug von JACK 2 auf JACK 3 stehen Import-Funktionen und weitere Unterstützung zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[JACK 2 Benutzerhandbuch]]&lt;br /&gt;
* [[Evaluator|Der JACK 2 Evaluator]]&lt;br /&gt;
* [[Neuigkeiten|JACK 2 Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8420</id>
		<title>Benutzer:Striewe/Testseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8420"/>
		<updated>2023-06-01T10:34:13Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Herzlich Willkommenen im JACK-Wiki für Lehrende. In diesem Nachschlagewerk finden Sie eine umfassende Dokumentation über die Funktionen und die Arbeitsweise von JACK. Bei weitergehenden Fragen können Sie sich jederzeit [mailto:jack@paluno.uni-due.de per E-Mail] an uns wenden.&lt;br /&gt;
&lt;br /&gt;
== JACK 3 ==&lt;br /&gt;
JACK 3 ist die aktuelle Version des Übungs- und Prüfungssystems JACK, die an der Universität Duisburg-Essen und weiteren Hochschulen im Produktivbetrieb eingesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; row-gap:10px; column-gap:10px; width:100%; color:white;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div class=&amp;quot;uniBlueBox&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Benutzerhandbuch|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Benutzerhandbuch&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Schnelleinstieg|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Schnelleinstieg&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Versionshistorie|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Versionshistorie&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[https://jack-demo.s3.uni-due.de|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Demoserver&amp;lt;/span&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Auf unserem Demoserver können Sie das System bereits aus Studierendensicht testen. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de|&amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um das System auch aus Lehrendensicht zu begutachten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[Benutzerhandbuch|JACK 3 Benutzerhandbuch]]&lt;br /&gt;
* [https://jack-demo.s3.uni-due.de JACK 3 Demoserver]&lt;br /&gt;
&lt;br /&gt;
== Kontakt und Support ==&lt;br /&gt;
&lt;br /&gt;
=== Mailingliste ===&lt;br /&gt;
Über unsere Mailingliste halten wir Sie über aktuelle Entwicklungen auf dem Laufenden. Sie können sich selbständig [https://lists.uni-due.de/mailman/listinfo/jack-announce in die Liste eintragen], um jederzeit über Updates und andere, wichtige Neuerungen informiert zu werden.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung von Prüfungsterminen ===&lt;br /&gt;
Wenn Sie eine Prüfung mit JACK durchführen möchten, melden Sie uns die Prüfung bitte [mailto:jack@paluno.uni-due.de per Mail] an. Nur so kann sichergestellt werden, dass Sie technischen Support bei der Durchführung der Prüfung erhalten und zur Prüfungszeit keine Wartungsarbeiten durchgeführt werden, die die Durchführung der Prüfung behindern könnten.&lt;br /&gt;
&lt;br /&gt;
== JACK 2 ==&lt;br /&gt;
JACK 2 ist die von einigen unserer Kunden noch eingesetzte Vorgängerversion von JACK 3. Mittelfristig ist eine Ablösung aller noch im Einsatz befindlichen Produktivsysteme von JACK2 vorgesehen. In JACK 2 werden &#039;&#039;keine neuen Funktionen&#039;&#039; mehr umgesetzt und es ist nur noch begrenzter technischer und inhaltlicher Support verfügbar. Für den Umzug von JACK 2 auf JACK 3 stehen Import-Funktionen und weitere Unterstützung zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[JACK 2 Benutzerhandbuch]]&lt;br /&gt;
* [[Evaluator|Der JACK 2 Evaluator]]&lt;br /&gt;
* [[Neuigkeiten|JACK 2 Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/common.css&amp;diff=8419</id>
		<title>Benutzer:Striewe/common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/common.css&amp;diff=8419"/>
		<updated>2023-06-01T10:33:08Z</updated>

		<summary type="html">&lt;p&gt;Striewe: Die Seite wurde neu angelegt: „div.uniBlueBox {min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;}“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;div.uniBlueBox {min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;}&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8418</id>
		<title>Benutzer:Striewe/Testseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8418"/>
		<updated>2023-06-01T08:24:46Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Herzlich Willkommenen im JACK-Wiki für Lehrende. In diesem Nachschlagewerk finden Sie eine umfassende Dokumentation über die Funktionen und die Arbeitsweise von JACK. Bei weitergehenden Fragen können Sie sich jederzeit [mailto:jack@paluno.uni-due.de per E-Mail] an uns wenden.&lt;br /&gt;
&lt;br /&gt;
== JACK 3 ==&lt;br /&gt;
JACK 3 ist die aktuelle Version des Übungs- und Prüfungssystems JACK, die an der Universität Duisburg-Essen und weiteren Hochschulen im Produktivbetrieb eingesetzt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; row-gap:10px; column-gap:10px; width:100%; color:white;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Benutzerhandbuch|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Benutzerhandbuch&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Schnelleinstieg|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Schnelleinstieg&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[[Versionshistorie|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Versionshistorie&amp;lt;/span&amp;gt;]]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 300px; text-align: center; min-height: 50px; background-color: #004c93; flex-grow:1; flex-basis:0; padding:10px;&amp;quot;&amp;gt;&amp;lt;p&amp;gt;[https://jack-demo.s3.uni-due.de|&amp;lt;span style=&amp;quot;color:white; font-size:130%; font-weight:bold;&amp;quot;&amp;gt;JACK 3 Demoserver&amp;lt;/span&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Auf unserem Demoserver können Sie das System bereits aus Studierendensicht testen. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de|&amp;lt;span style=&amp;quot;color:white;&amp;quot;&amp;gt;per E-Mail&amp;lt;/span&amp;gt;], um das System auch aus Lehrendensicht zu begutachten.&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[Benutzerhandbuch|JACK 3 Benutzerhandbuch]]&lt;br /&gt;
* [https://jack-demo.s3.uni-due.de JACK 3 Demoserver]&lt;br /&gt;
&lt;br /&gt;
== Kontakt und Support ==&lt;br /&gt;
&lt;br /&gt;
=== Mailingliste ===&lt;br /&gt;
Über unsere Mailingliste halten wir Sie über aktuelle Entwicklungen auf dem Laufenden. Sie können sich selbständig [https://lists.uni-due.de/mailman/listinfo/jack-announce in die Liste eintragen], um jederzeit über Updates und andere, wichtige Neuerungen informiert zu werden.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung von Prüfungsterminen ===&lt;br /&gt;
Wenn Sie eine Prüfung mit JACK durchführen möchten, melden Sie uns die Prüfung bitte [mailto:jack@paluno.uni-due.de per Mail] an. Nur so kann sichergestellt werden, dass Sie technischen Support bei der Durchführung der Prüfung erhalten und zur Prüfungszeit keine Wartungsarbeiten durchgeführt werden, die die Durchführung der Prüfung behindern könnten.&lt;br /&gt;
&lt;br /&gt;
== JACK 2 ==&lt;br /&gt;
JACK 2 ist die von einigen unserer Kunden noch eingesetzte Vorgängerversion von JACK 3. Mittelfristig ist eine Ablösung aller noch im Einsatz befindlichen Produktivsysteme von JACK2 vorgesehen. In JACK 2 werden &#039;&#039;keine neuen Funktionen&#039;&#039; mehr umgesetzt und es ist nur noch begrenzter technischer und inhaltlicher Support verfügbar. Für den Umzug von JACK 2 auf JACK 3 stehen Import-Funktionen und weitere Unterstützung zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[JACK 2 Benutzerhandbuch]]&lt;br /&gt;
* [[Evaluator|Der JACK 2 Evaluator]]&lt;br /&gt;
* [[Neuigkeiten|JACK 2 Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
	<entry>
		<id>https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8417</id>
		<title>Benutzer:Striewe/Testseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.uni-due.de/jack/index.php?title=Benutzer:Striewe/Testseite&amp;diff=8417"/>
		<updated>2023-06-01T07:18:30Z</updated>

		<summary type="html">&lt;p&gt;Striewe: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Herzlich Willkommenen im JACK-Wiki für Lehrende. In diesem Nachschlagewerk finden Sie eine umfassende Dokumentation über die Funktionen und die Arbeitsweise von JACK. Bei weitergehenden Fragen können Sie sich jederzeit [mailto:jack@paluno.uni-due.de per E-Mail] an uns wenden.&lt;br /&gt;
&lt;br /&gt;
== JACK 3 ==&lt;br /&gt;
JACK 3 ist die aktuelle Version des Übungs- und Prüfungssystems JACK, die an der Universität Duisburg-Essen und weiteren Hochschulen im Produktivbetrieb eingesetzt wird. Auf unserem [https://jack-demo.s3.uni-due.de/ Demoserver] können Sie das System bereits aus Studierendensicht testen. Kontaktieren Sie uns [mailto:jack@paluno.uni-due.de per E-Mail], um das System auch aus Lehrendensicht zu begutachten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; row-gap:10px; column-gap:10px; width:100%; &amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 400px; text-align: center; height: 100px; background-color: #fef6e7; flex-grow:1;&amp;quot;&amp;gt;[[Benutzerhandbuch|JACK 3 Benutzerhandbuch]]&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 400px; text-align: center; height: 100px; background-color: #fef6e7; flex-grow:1;&amp;quot;&amp;gt;[[Schnelleinstieg|JACK 3 Schnelleinstieg]]&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 400px; text-align: center; height: 100px; background-color: #fef6e7; flex-grow:1;&amp;quot;&amp;gt;[[Versionshistorie|JACK 3 Versionshistorie]]&amp;lt;/div&amp;gt;&lt;br /&gt;
 &amp;lt;div style=&amp;quot;min-width: 400px; text-align: center; height: 100px; background-color: #fef6e7; flex-grow:1;&amp;quot;&amp;gt;[https://jack-demo.s3.uni-due.de JACK 3 Demoserver]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[Benutzerhandbuch|JACK 3 Benutzerhandbuch]]&lt;br /&gt;
* [https://jack-demo.s3.uni-due.de JACK 3 Demoserver]&lt;br /&gt;
&lt;br /&gt;
== Kontakt und Support ==&lt;br /&gt;
&lt;br /&gt;
=== Mailingliste ===&lt;br /&gt;
Über unsere Mailingliste halten wir Sie über aktuelle Entwicklungen auf dem Laufenden. Sie können sich selbständig [https://lists.uni-due.de/mailman/listinfo/jack-announce in die Liste eintragen], um jederzeit über Updates und andere, wichtige Neuerungen informiert zu werden.&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung von Prüfungsterminen ===&lt;br /&gt;
Wenn Sie eine Prüfung mit JACK durchführen möchten, melden Sie uns die Prüfung bitte [mailto:jack@paluno.uni-due.de per Mail] an. Nur so kann sichergestellt werden, dass Sie technischen Support bei der Durchführung der Prüfung erhalten und zur Prüfungszeit keine Wartungsarbeiten durchgeführt werden, die die Durchführung der Prüfung behindern könnten.&lt;br /&gt;
&lt;br /&gt;
== JACK 2 ==&lt;br /&gt;
JACK 2 ist die von einigen unserer Kunden noch eingesetzte Vorgängerversion von JACK 3. Mittelfristig ist eine Ablösung aller noch im Einsatz befindlichen Produktivsysteme von JACK2 vorgesehen. In JACK 2 werden &#039;&#039;keine neuen Funktionen&#039;&#039; mehr umgesetzt und es ist nur noch begrenzter technischer und inhaltlicher Support verfügbar. Für den Umzug von JACK 2 auf JACK 3 stehen Import-Funktionen und weitere Unterstützung zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiterführende Links&#039;&#039;&#039;&lt;br /&gt;
* [[JACK 2 Benutzerhandbuch]]&lt;br /&gt;
* [[Evaluator|Der JACK 2 Evaluator]]&lt;br /&gt;
* [[Neuigkeiten|JACK 2 Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Striewe</name></author>
	</entry>
</feed>