Skip to content

Wdrożenie Metodologii AIP w OpenCMS: Architektura oparta na typach standardowych

Date:
czw., lip 2, 2026
By:
V B

Niniejszy dokument opisuje pragmatyczną architekturę techniczną i procedury konfiguracji systemu zarządzania treścią OpenCMS (wersja 10.5+) pod kątem obsługi Atomów Informacyjnych Projektu (AIP) przy użyciu standardowych, fabrycznych typów treści.

Zamiast wdrażać niestandardowe schematy XSD i modyfikować strukturę bazy danych CMS, niniejsze podejście wykorzystuje domyślny, wbudowany typ zawartości article-m (standardowy artykuł z podziałem na akapity). Mapowanie to zapewnia natychmiastową gotowość systemu do pracy, pełne wsparcie dla Headless API oraz bezproblemową współpracę z istniejącymi narzędziami edytorskimi i prezentacyjnymi OpenCMS.

1. Mapowanie Poziomu 1 (Atomy) na Standardowy Typ article-m

W OpenCMS standardowy typ article-m posiada elastyczną strukturę składającą się z metadanych, wprowadzenia oraz powtarzalnych bloków akapitów. Nasza trójpoziomowa hierarchia poznawcza AIP (System 1 i System 2) zostaje bezpośrednio odwzorowana na te istniejące pola:

┌────────────────────────────────────────────────────────────────────────┐
│ ATOM INFORMACYJNY (AIP)   ──►   STANDARDOWY ZASÓB OpenCMS (article-m)  │
├────────────────────────────────────────────────────────────────────────┤
│ ID Atomu (np. AIP-05)     ──►   Nazwa pliku w VFS (Name, np. AIP-05)   │
│ Tytuł                     ──►   Pole "Title"                           │
│ Norma / Pochodzenie       ──►   Kategorie OpenCMS (Categories)         │
│ Warstwa L0: Wstęp         ──►   Pole "Preface" (Zajawka)               │
│ Warstwa L1/L2: Streszcz.  ──►   Pole "Paragraph 1" (Akapit 1)          │
│ Warstwa L3: Detal         ──►   Pole "Paragraph 2" (Akapit 2)          │
└────────────────────────────────────────────────────────────────────────┘


1.1. Konfiguracja Mapowania Pól w XML

Podczas importu lub ręcznej edycji, struktura XML standardowego pliku article-m (zwykle zlokalizowanego w /shared/atoms/ lub /shared/news/) przechowuje dane w następujący sposób:

<!-- Przykład wyrenderowanego zasobu: /shared/atoms/AIP-05-PATENT.xml -->
<ArticleMs xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)" xsi:noNamespaceSchemaLocation="opencms://system/modules/org.opencms.ade.config/schemas/article-m.xsd">
  <ArticleM language="pl">
    <!-- Tytuł Atomu -->
    <Title><![CDATA[Status ochrony własności intelektualnej i analiza czystości patentowej (FTO)]]></Title>
    
    <!-- Warstwa L0 (Wstęp - Szybka orientacja) -->
    <Preface><![CDATA[Projekt posiada pełną czystość patentową na rynkach UE i USA, zabezpieczoną dwoma aktywnymi zgłoszeniami patentowymi w procedurze PCT.]]></Preface>
    
    <!-- Warstwa L1/L2 (Streszczenie parametrów i metryk) -->
    <Paragraph>
      <Text><![CDATA[<ul><li>Zgłoszenie PCT/PL2025/000123 z dnia 14.03.2025 r.</li><li>Badanie FTO zrealizowane przez Kancelarię X w styczniu 2026 r. potwierdza brak ryzyk naruszenia praw osób trzecich.</li><li>Budżet ochrony: 150 000 PLN.</li></ul>]]></Text>
    </Paragraph>
    
    <!-- Warstwa L3 (Tekst Główny - Głęboka analiza i dowody naukowe) -->
    <Paragraph>
      <Text><![CDATA[<p>Przeprowadzone badanie stanu techniki w bazach Espacenet, USPTO oraz WIPO z wykorzystaniem klasyfikacji IPC (sekcja C08G) wykazało unikalność naszej metody syntezy biodegradowalnych kopolimerów... [pełna treść dowodowa]</p>]]></Text>
    </Paragraph>
  </ArticleM>
</ArticleMs>


1.2. Kategoryzacja jako "Standard / Pochodzenie" w strukturze folderów .categories

W OpenCMS kategorie są reprezentowane fizycznie w strukturze VFS (Virtual File System) jako foldery typu category umieszczone wewnątrz specjalnego, systemowego katalogu .categories. Ponieważ każdy Twój projekt stanowi odrębną, wyizolowaną podstronę, architektura kategoryzacji opiera się na elastycznym podziale na kontekst globalny i lokalny:

  1. Wspólny (Globalny) rejestr kategorii:

    Definiowany w nadrzędnym folderze .categories na poziomie całego serwisu (np. /sites/default/.categories/ lub w systemowym /system/categories/). Przechowuje uniwersalne standardy i normy pochodzenia, do których odwołują się wszystkie projekty:

    • /system/categories/standards/feng-smart/

    • /system/categories/standards/prince2/

    • /system/categories/standards/vb-methodology/

  2. Dedykowany (Lokalny) rejestr kategorii:

    Dla każdego niezależnego projektu realizowanego na osobnej podstronie (np. w ścieżce /projekty/projekt-alfa/), OpenCMS wyszukuje lokalny folder /projekty/projekt-alfa/.categories/. W tym miejscu definiuje się specyficzne, unikalne i poufne standardy, reguły techniczne oraz wewnętrzne normatywy, które nie mogą lub nie powinny być współdzielone z innymi podstronami:

    • /projekty/projekt-alfa/.categories/internal-standards/spec-tech-v1/

    • /projekty/projekt-alfa/.categories/internal-standards/dev-guidelines/

OpenCMS automatycznie obsługuje dziedziczenie i łączenie (mergowanie) kategorii. Podczas edycji atomu znajdującego się w folderze projektu, system wyświetli mu w oknie dialogowym właściwości zarówno wspólne standardy globalne (odziedziczone z góry drzewa VFS), jak i specyficzne standardy lokalne, zachowując pełną izolację danych między projektami.

2. Prezentacja Wielopoziomowa za pomocą Formatterów JSP

Formatter OpenCMS przypisany do standardowego typu article-m odpowiada za decyzję, które z wbudowanych pól (Preface, Paragraph 1, Paragraph 2) mają zostać wyświetlone na stronie kontenerowej w zależności od kontekstu dokumentu wyjściowego (Poziom 3).

2.1. Formatter L0 (Elevator Pitch / One-Pager)

Renderuje wyłącznie nagłówek i wstęp. Idealny do szybkich streszczeń menedżerskich i prezentacji rynkowych.

  • Wizualizuje: Title + Preface (Warstwa L0).

2.2. Formatter L1/L2 (Streszczenie i Parametry)

Używany do generowania fiszek projektowych, rejestrów ryzyk i tabelarycznych zestawień celów.

  • Wizualizuje: Title + Preface + Paragraph 1 (Warstwa L1/L2).

2.3. Formatter L3 (Pełna Specyfikacja)

Używany do generowania ostatecznych, wielostronicowych rozdziałów wniosków aplikacyjnych i audytów due diligence.

  • Wizualizuje: Cały dokument: Title + Preface (L0) + Paragraph 1 (L1/L2) + Paragraph 2 (L3).

3. Dynamiczne Agregowanie Listami za pomocą standardowych pól

Mechanizm Kolektorów Treści (Content Collectors) oraz List (Lists / m-list) pozwala na automatyczne generowanie dokumentu końcowego (np. wniosku SMART) poprzez pobranie wszystkich zasobów typu article-m należących do danej kategorii i wyrenderowanie ich w formacie L3.

3.1. Przykładowy szablon JSP pobierający standardowe pola

Szablon JSP automatycznie agreguje rozproszone pliki article-m z bazy VFS, pobierając ich właściwości za pomocą standardowych zmiennych EL (Preface, Paragraph):

<%-- Plik: /system/modules/org.ingenium.aip/templates/document-generator-standard.jsp --%>
<%@ taglib prefix="cms" uri="[http://www.opencms.org/taglib/cms](http://www.opencms.org/taglib/cms)" %>
<%@ taglib prefix="c" uri="[http://java.sun.com/jsp/jstl/core](http://java.sun.com/jsp/jstl/core)" %>
<%@ taglib prefix="fn" uri="[http://java.sun.com/jsp/jstl/functions](http://java.sun.com/jsp/jstl/functions)" %>

<div class="document-mozaika-wrapper">
    <!-- Pobranie wszystkich zasobów typu "article-m" z folderu /shared/atoms/ należących do kategorii "feng-smart" -->
    <cms:contentload collector="allInSubFolder" param="/shared/atoms/|article-m|standards/feng-smart|title-asc">
        
        <cms:contentaccess var="atom" />
        
        <%-- Unikalny identyfikator atomu pobierany z nazwy pliku w OpenCMS (VFS Name) --%>
        <c:set var="atomId" value="${fn:replace(atom.filename, '/shared/atoms/', '')}" />
        <c:set var="atomId" value="${fn:replace(atomId, '.xml', '')}" />

        <section class="atom-section" id="${atomId}">
            <h2>${atom.value.Title}</h2>
            <div class="atom-meta-id">Kod AIP: <strong>${atomId}</strong></div>
            
            <!-- Dynamiczne sterowanie poziomem szczegółowości L0, L1/L2 lub L3 na podstawie parametru żądania HTTP -->
            <c:choose>
                <%-- Wyrenderowanie tylko Wstępu (L0) --%>
                <c:when test="${param.level == 'L0'}">
                    <div class="atom-intro-l0">
                        ${atom.value.Preface}
                    </div>
                </c:when>
                
                <%-- Wyrenderowanie Wstępu i Streszczenia (L1/L2) --%>
                <c:when test="${param.level == 'L1_L2'}">
                    <div class="atom-intro-l0">
                        ${atom.value.Preface}
                    </div>
                    <div class="atom-summary-l1-l2">
                        <%-- Pierwszy akapit (Paragraph[0]) mapuje L1/L2 --%>
                        ${atom.value.Paragraph[0].Text}
                    </div>
                </c:when>
                
                <%-- Pełny wydruk (L3) - Spojenie wszystkich warstw --%>
                <c:otherwise>
                    <div class="atom-intro-l0 italic text-gray-600 mb-4">
                        ${atom.value.Preface}
                    </div>
                    <div class="atom-summary-l1-l2-box bg-gray-50 p-4 border-l-4 border-blue-500 mb-4">
                        <div class="text-xs font-bold uppercase tracking-wider text-blue-500 mb-2">Metryki i parametry kluczowe:</div>
                        ${atom.value.Paragraph[0].Text}
                    </div>
                    <div class="atom-detail-l3-body prose max-w-none">
                        <%-- Drugi akapit (Paragraph[1]) mapuje L3 --%>
                        ${atom.value.Paragraph[1].Text}
                    </div>
                </c:otherwise>
            </c:choose>
        </section>
        
    </cms:contentload>
</div>


4. Integracja z NotebookLM: Eksport do Standardowego formatu

Dwuetapowy proces generowania i importu danych (Gemini -> NotebookLM -> OpenCMS) staje się jeszcze prostszy, ponieważ struktura docelowa odpowiada dokładnie standardowym polom bazy danych OpenCMS.

4.1. Schemat mapowania eksportu

Skrypt automatycznie pobierający wyjściowy tekst z NotebookLM (wygenerowany na podstawie instrukcji z pliku prompty_notebooklm_aip.md i uziemiony w profilu 00_PROFIL_OSOBOWOSCI_AI_1.pdf) konwertuje tekst na standardową strukturę pliku XML dla article-m:

  1. Nazwa wyjściowa pliku (np. AIP-05-PATENT.xml) jest zapisywana bezpośrednio jako VFS Name.

  2. Wartość z linii nagłówka prompu (np. Title) jest mapowana na tag <Title>.

  3. Tekst wyodrębniony pod szyldem Warstwa L0 (Wstęp) jest zapisywany w tagu <Preface>.

  4. Tekst wyodrębniony pod szyldem Warstwa L1/L2 (Streszczenie) jest mapowany na pierwszy akapit: <Paragraph><Text>[Content]</Text></Paragraph>.

  5. Tekst wyodrębniony pod szyldem Warstwa L3 (Tekst Główny) jest mapowany na drugi akapit: <Paragraph><Text>[Content]</Text></Paragraph>.

4.2. Historia i wersjonowanie

Ponieważ pliki XML są zapisywane w standardowej lokalizacji VFS w OpenCMS pod unikalną nazwą (np. /shared/atoms/AIP-51-PROJECT-OBJECTIVES.xml), każdy ponowny import zaktualizowanych danych z NotebookLM automatycznie tworzy nową wersję dokumentu w historii OpenCMS. Edytor ma możliwość natychmiastowego podejrzenia różnic (diff) oraz wycofania błędnej generacji AI bezpośrednio z poziomu standardowego panelu administracyjnego CMS.