<
Multisite Management, 2026.6
Dokumentation

MSM API Guide

Die Multisite-Management API in FirstSpirit erweitert die Funktionen des FirstSpirit Multisite Managements (MSM) um eine programmgesteuerte Schnittstelle zur Verwaltung von Bundles und deren Verteilung über mehrere Projekte hinweg. Während Redakteure und Administratoren Multisite-Prozesse bereits über die Benutzeroberflächen von FirstSpirit konfigurieren und steuern können, ermöglicht die API Entwicklern eine strukturierte Integration und Automatisierung dieser Funktionen in individuelle Anwendungen und Arbeitsabläufe.

Mithilfe der API lassen sich Bundles verwalten, Projektzuordnungen steuern und die enthaltenen Elemente eines Bundles gezielt bearbeiten. Dadurch können zentrale Inhalte kontrolliert über verschiedene Projekte hinweg verteilt und bestehende Multisite-Prozesse in automatisierte Deployment- und Integrationsszenarien eingebunden werden.

Die Multisite-Management-API unterstützt die folgenden Kernfunktionen:

  • Auflisten, Anlegen, Modifizieren und Löschen von Bundles
  • Verwalten von Bundle-Metadaten wie Name, Beschreibung und Einstellungen
  • Verwalten von Bundle-Subscriptions einschließlich Hinzufügen und Entfernen von Projekten
  • Ausschließen einzelner Projekte aus bestehenden Subscriptions
  • Auflisten der expliziten Elemente eines Bundles
  • Hinzufügen und Entfernen von Elementen innerhalb eines Bundles
  • Erstellen von Change Requests für den Rücktransport geänderter Inhalte


Beispiel-Anwendungsfälle

Die folgenden Beispiel-Skripte basieren auf der Multisite Management API ( ) .

Change-Request für Rücktransport

Das folgende Skript prüft, ob das aktuell ausgewählte Inhaltselement im FirstSpirit Ziel-Projekt im Vergleich zum entsprechenden Element im Master-Projekt geändert wurde. Werden Änderungen erkannt, erstellt es automatisch einen Change-Request. Handelt es sich bei dem ausgewählten Element um eine Seite, werden zusätzlich alle enthaltenen Sections überprüft und bei Bedarf ebenfalls transportiert. Abschließend protokolliert das Skript die Ergebnisse und zeigt eine Zusammenfassung der durchgeführten Aktionen an.

import java.util.*;
import de.espirit.firstspirit.agency.*;
import de.espirit.firstspirit.ui.operations.*;
import de.espirit.firstspirit.access.store.pagestore.*;
import de.espirit.firstspirit.modules.multisite.agency.MultisiteAgents;
import de.espirit.firstspirit.modules.multisite.agency.operation.*;

// Helper method that checks if an element has been modified and creates a new TransportRequest for it in that case.
createRequestIfModified(sourceProject, targetProject, language, element) {
    transportable = itemAgent.isTransportable(element, targetProject, language);
    if (!transportable) {    
        return TransportOperation.State.INVALID;
    } 
    modified = itemAgent.isModified(element, targetProject, language);
    if (!modified) {    
        return TransportOperation.State.UNCHANGED;
    }  
    // call operation
    transportOperation = itemAgent.getTransportOperation(element);
    transportOperation.source(language, element.getRevision()).target(targetProject);
    return transportOperation.perform().state();
}

// Helper method for result handling
addToResult(map, element, operationResult) {
    list = map.get(operationResult);
    list.add(element);
}

resultsToString(map) {
  text = "";
  for (entry : map.entrySet()) {
      text += entry.getKey() + " : ";
      for (idProvider : entry.getValue()) {
          text += idProvider.getName() + ", ";
      }
      text += "\n";
  }
  return text;
}

// initialize variables
operationAgent = context.requireSpecialist(OperationAgent.TYPE);
requestOperation = operationAgent.getOperation(RequestOperation.TYPE);
element = context.getElement();
sourceProject = element.getProject();

// get target project
targetProjectName = "Master";
targetProject = context.getConnection().getProjectByName(targetProjectName);
if (targetProject == null) {
    requestOperation.setKind(RequestOperation.Kind.ERROR);
    requestOperation.perform("Project '" + targetProjectName + "' not found.");
    context.logError("Project '" + targetProjectName + "' not found.");
}

// get language to transport
languageAbbreviation = "EN";
language = sourceProject.getLanguage(languageAbbreviation);
if (language == null) {
   requestOperation.setKind(RequestOperation.Kind.ERROR);
   requestOperation.perform("Language '" + languageAbbreviation + "' not found.");
   context.logError("Language '" + languageAbbreviation + "' not found.");
   return;
}

// prepare result map
results = new HashMap();
for (value : TransportOperation.State.values()) {
    results.put(value, new ArrayList());
}

// get ItemAgent
itemAgent = MultisiteAgents.create(context).getItemAgent();

// create request for the current element
addToResult(results, element, createRequestIfModified(sourceProject, targetProject, language, element));

// special handling for pages: iterate over sections and create a request for each modified section
if (element instanceof Page) {
    page = element;  
    for (section: page.getChildren(Section.class, true).toList()) {
        addToResult(results, section, createRequestIfModified(sourceProject, targetProject, language, section)); 
    }
}

// log info
context.logInfo("Script executed without any errors.\n\n" + resultsToString(results));
requestOperation.perform("Script executed without any errors.\n\n" + results

Bundle erstellen und Ziel-Projekt abonnieren

Das folgende Skript zeigt, wie über die MSM API programmatisch mit Bundles interagiert werden kann: Es ruft den BundleAgent aus dem Master-Projekt ab, erstellt ein neues Bundle, konfiguriert dessen Namen und Release-Modus und abonniert ein Ziel-Projekt, sodass dieses die Bundle-Inhalte empfangen kann. Abschließend werden alle Änderungen gespeichert.

import de.espirit.firstspirit.modules.multisite.agency.*;
import de.espirit.firstspirit.access.project.Project;
import de.espirit.firstspirit.modules.multisite.dto.BundleSettings;
import de.espirit.firstspirit.modules.multisite.dto.BundleSettings.ReleaseMode;

Project masterProject = context.getElement().getProject();
long targetProjectId = 4211;

// Retrieve Agents
MultisiteAgents agents = MultisiteAgents.create(context, masterProject);
BundleAgent bundleAgent = agents.getBundleAgent();

// Create a new Bundle
Bundle bundle = bundleAgent.createBundle("My Bundle", "Description");
 
// Modify Bundle
bundle.setName("Updated Name");
bundle.getSettings().setReleaseMode(BundleSettings.ReleaseMode.RELEASE);

// Manage subscriptions
bundle.getSubscriptions().subscribe(targetProjectId);

// MANDATORY: save changes
bundle.save();