Skip to content

Fix parser defects (multiselect enums, image conversion, namespaces) + Maven build, CI and tests#2

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

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

Conversation

@Tob1as864

Copy link
Copy Markdown
Owner

Überblick

Dieser PR analysiert und behebt die gemeldeten 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 Fehleranalyse liegt in FEHLERANALYSE.md.

37 Tests, alle grün (mvn verify).

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 (nach Bereich)

Multiselect-Enums (gemeldet)

  • Es werden jetzt 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 (unbekannte IDs werfen keine NPE mehr).

Bild-/Objekt-Konvertierung (gemeldet)

  • XHTMLElementObject rendert gültiges Markup (data="…" type="…"), behält URI-Schrägstriche plattformübergreifend und crasht nicht mehr bei fehlendem data-Attribut.
  • Tote Deconstruction-Logik reaktiviert (P/TBL/L/H/OBJ-Token inkl. 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, damit präfixiertes XHTML (xhtml:div, xhtml:object) ü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 registriert.
  • MIN/MAX/MAX-LENGTH optional; Long-Grenzen (DOORS) laufen nicht mehr ü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 jetzt eine Strategie (TypeClassifier), die das fertig geparste SpecObject 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.
  • Hinweis: REQ/SUB-REQ/HEADLINE/TEXT sind parserinterne Kategorien, keine offiziellen ReqIF-Typen.

Tests

XHTMLNamespaceTest, ParserHardeningTest, MultiselectEnumTest, ImagePipelineTest, RobustnessTest, TypeClassifierTest, ImplementationGuideClassifierTest

API-Änderungen (relevant für Nutzer)

  • XHTMLElementObject.getData() liefert die URI mit Schrägstrichen (vorher OS-Pfad); neu: getDataAsFilePath().
  • DatatypeInteger.getMin()/getMax() geben long statt int zurück.
  • Parse-Fehler werfen ReqIFParseException statt die JVM zu beenden.

Bewusst nicht angefasst

type-Semantik von SpecRelation (4.3), HTML-Escaping/Attribut-Erhalt in toString() (4.8) und die kosmetischen Punkte aus Abschnitt 5 — jeweils in FEHLERANALYSE.md begründet.

🤖 Generated with Claude Code


Generated by 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
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