Skip to content

Fix parser defects (multiselect enums, images, namespaces, XHTML) + Maven build, CI and 68 tests - #2

Merged
Tob1as864 merged 2 commits into
masterfrom
claude/reqif-parser-error-analysis-fz13y4
Jul 24, 2026
Merged

Fix parser defects (multiselect enums, images, namespaces, XHTML) + Maven build, CI and 68 tests#2
Tob1as864 merged 2 commits into
masterfrom
claude/reqif-parser-error-analysis-fz13y4

Conversation

@Tob1as864

@Tob1as864 Tob1as864 commented Jul 24, 2026

Copy link
Copy Markdown
Owner

Überblick

Analysiert und behebt die Fehler im ReqIF-Parser (u. a. Multiselect-Enums und Bildkonvertierung), führt ein Maven-Build mit GitHub-Actions-Pipeline ein und sichert jeden behobenen Fehler mit Tests ab. Die vollständige Analyse inklusive Behebungsstand liegt in FEHLERANALYSE.md.

68 Tests in 11 Testklassen, alle grün (mvn verify). Alle Punkte der Analyse (Abschnitte 1–5) sind abgearbeitet.

Build & CI

  • Quellen ins Maven-Standardlayout verschoben (src/main/java), pom.xml (Java 17, JUnit 5)
  • .github/workflows/ci.yml: mvn verify bei jedem Push und Pull Request, Testberichte als Artefakt

Behobene Fehler

Multiselect-Enums (gemeldet)

  • Es werden alle ENUM-VALUE-REFs gelesen; vorher überlebte nur der erste Wert
  • AttributeValueEnumeration führt die vollständige Werteliste (getValues()/getValueRefs()); getValue() liefert kompatibel den verketteten String
  • Enum-Default-Werte werden aufgelöst (DEFAULT-VALUE sind Elemente, kein THE-VALUE-Attribut); MULTI-VALUED ist auslesbar
  • Null-sichere Enum-Lookups

Bild-/Objekt-Konvertierung (gemeldet)

  • XHTMLElementObject rendert gültiges Markup, behält URI-Schrägstriche plattformübergreifend, crasht nicht bei fehlendem data-Attribut
  • Tote Deconstruction-Logik reaktiviert (Bildpfade)
  • Bild-Zuordnung in .reqifz: konsistente Map-Keys, Lookup per URI oder Dateiname; Zip-Slip-Absicherung; Streams werden geschlossen (ReqIFFile implements Closeable)

Namespace-Handling & Parser-Härtung

  • Namespace-aware Parsing + Matching über lokale Namen — Voraussetzung dafür, dass präfixiertes XHTML (xhtml:div) überhaupt ankommt
  • System.exit(1) bei Parse-Fehlern → ReqIFParseException
  • XXE-Härtung (DOCTYPE/externe Entities gesperrt)
  • Element-basierte Navigation statt fixer item(1)-Indizes → minifiziertes XML wird korrekt geparst

Crash-/Robustheitsfehler

  • Unbekannte Datentypen unter ihrer ID statt null-Key
  • MIN/MAX/MAX-LENGTH optional; Long-Grenzen (DOORS) laufen nicht über; leere Zahlenwerte parsen als 0
  • SpecHierarchy.getXHTMLContent() wirft keine ClassCastException mehr
  • Specification verarbeitet DATE/REAL-Werte; Header verkraftet Kommentare ohne „Created by:"
  • XHTMLElement.hasChildren() korrigiert (invertierte Logik)

Typklassifizierung (konfigurierbar statt hartkodiert)

  • Klassifizierung ist eine Strategie (TypeClassifier), die das fertig geparste SpecObject inkl. Attributwerte erhält
  • Default LongNameTypeClassifier = bisheriges Verhalten
  • Neuer ReqIFImplementationGuideClassifier: klassifiziert nach den standardisierten Attributnamen des ProSTEP-Implementor-Forums (ReqIF.ChapterName, ReqIF.Text) — tool-übergreifend robuster, empfohlen für DOORS-/Polarion-Exporte
  • REQ/SUB-REQ/HEADLINE/TEXT sind parserinterne Kategorien, keine offiziellen ReqIF-Typen (im README dokumentiert)

SpecRelation

  • Das geerbte type (Inhaltskategorie) wurde mit der Relationstyp-Referenz überschrieben → enthält jetzt UNDEFINED; Referenz in getRelationTypeRef(), aufgelöster Name in getRelationTypeName()
  • Attributwerte der Relation werden jetzt geparst
  • isText() lieferte für jede Relation true — jetzt sind alle Kategorie-Methoden false

XHTML-Deconstruction

  • Token-Liste wird aus dem Knotenbaum abgeleitet statt ein zweites Mal aus dem rohen DOM → keine doppelte Parse-Logik mehr
  • Tabellenzellen verlieren keinen Inhalt mehr (letzter item(1)-Fehler); Kopfzellen als TH; Bilder in Zellen erhalten
  • Ausbalancierte L//L-Marker; ol-Listen werden nicht mehr ignoriert
  • Token-Grammatik im Javadoc und README dokumentiert

XHTML-Rendering (getValue())

  • Text und Attributwerte werden escaped — die Ausgabe war zuvor nicht wohlgeformt (aus &lt; wurde <) und damit weder erneut parsebar noch sicher einbettbar
  • Alle XML-Attribute bleiben erhalten (style, colspan, href …)
  • Void-Elemente selbstschließend (<br/> statt <br></br>, das HTML5 als zwei Umbrüche liest)
  • Inhaltsverlust behoben: Elemente ohne eigene Klasse (a, em, strong …) verloren ihren kompletten Inhalt — Linktexte verschwanden
  • Inline-Abstände bleiben erhalten („Siehe Link" lief zu „SieheLink" zusammen)

Code-Qualität (Abschnitt 5)

  • Feld-Verschattung in DatatypeBoolean/DatatypeXHTML entfernt
  • ExceptionSpecObject: lesbare Meldung statt zusammengeklebtem Objekt-Dump
  • AttributeValueDate parst zusätzlich nach OffsetDateTime (getDateTime(), getDate())
  • _Template-Hack aus getTitle() entfernt; getComment() reaktiviert
  • Auskommentierter Code entfernt

Tests

XHTMLNamespaceTest, ParserHardeningTest, MultiselectEnumTest, ImagePipelineTest, RobustnessTest, TypeClassifierTest, ImplementationGuideClassifierTest, SpecRelationTest, XHTMLDeconstructionTest, XHTMLRenderingTest, CodeQualityFixesTest

Breaking Changes

Was Vorher Jetzt
XHTMLElementObject.getData() OS-Pfad URI mit / (neu: getDataAsFilePath())
DatatypeInteger.getMin()/getMax() int long
Parse-Fehler System.exit(1) ReqIFParseException
SpecRelation.getType() Relationstyp-Referenz "UNDEFINED" (neu: getRelationTypeRef())
AttributeValueXHTML.getValue() fehlerhaftes Markup korrektes, wohlgeformtes XHTML
ReqIFHeader.getTitle() ohne _Template-Suffix wie im Dokument

🤖 Generated with Claude Code

claude added 2 commits July 23, 2026 20:13
The requirement/headline/text classification relied on a hardcoded
LONG-NAME substring heuristic that only fits certain tool profiles.

- Add TypeClassifier strategy interface (classifySpecType,
  isRequirement, isSubRequirement)
- Extract the historic heuristic unchanged into LongNameTypeClassifier,
  which remains the default - existing behavior is fully preserved
- Thread the classifier through ReqIF/ReqIFz/ReqIFDocument/
  ReqIFCoreContent via new constructor overloads; null falls back to
  the default
- SpecObject delegates classification and isReq/isSubReq to the
  classifier; boolean-flag lookup is now null-safe for unresolved
  datatypes
- Document usage in README and FEHLERANALYSE.md
- Tests: TypeClassifierTest

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011mat2d7AJkouKhXWUYzHxs
The type classification strategy now receives the fully parsed
SpecObject (attribute values included), so classifiers can decide by
attributes rather than only by the free-form spec type name.

- TypeClassifier.classifySpecType(SpecType) -> classify(SpecObject);
  SpecObject classifies after its attribute values are parsed
- Add ReqIFImplementationGuideClassifier: classifies by the ProSTEP
  Implementor Forum's standardized attribute names (ReqIF.ChapterName ->
  HEADLINE, ReqIF.Text -> REQ, else TEXT), tool-independent and more
  robust than the LONG-NAME heuristic; supports custom attribute names
- LongNameTypeClassifier and the existing custom-classifier test adapted
  to the new signature (behavior unchanged)
- Document the classification strategies in README (default heuristic,
  Implementation Guide classifier, custom classifier) and note that
  REQ/SUB-REQ/HEADLINE/TEXT are parser-internal, not official ReqIF types
- Tests: ImplementationGuideClassifierTest

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011mat2d7AJkouKhXWUYzHxs
@Tob1as864
Tob1as864 merged commit c7507c4 into master Jul 24, 2026
4 checks passed
@Tob1as864 Tob1as864 changed the title Fix parser defects (multiselect enums, image conversion, namespaces) + Maven build, CI and tests Fix parser defects (multiselect enums, images, namespaces, XHTML) + Maven build, CI and 68 tests Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants