Source-Locator

Wenn man Topic-Maps aus vorhandenen XTM-Dateien lädt und als XTM speichert, ist es erwünscht, die Ids der XML-Elemente zu nutzen. Die Id der XML-Elemente wird innerhalb der Topic-Map gespeichert. Die ist unter dem Begriff Source-Locator abrufbar. Zur Verarbeitung stellt das Topic-Map-Object-Interface verschiedene Funktionen zur Verfügung.

Wichtig zu wissen ist hierbei, dass sich der Source-Locator aus dem Base-Locator der Topic-Map und einer eindeutigen Id zusammensetzt. Für das o.g. Beispiel sieht ein Source-Locator einer beliebigen Topic, deren Id „fitness“ sein soll, folgendermaßen aus:

www.ilmenau-guide.com#fitness

Wird beim Erzeugen bzw. speichern der Topic-Map zu einer XTM-Datei kein Source-Locator gefunden, wird die aktuelle Object-Id als Id des XML-Elements verwendet. Beim Laden werden diese Ids dann also Source-Locator genutzt.

Das folgende Beispiel zeigt, wie einem Topic-Map-Element, dass das Topic-Map-Object-Interface implementiert, ein Source-Locator zugeordnet werden kann.

Jeder Source-Locator darf dabei nur einmal innerhalb der Topic Map vorkommen. Dieser Umstand wird mit einer Behandlung des Fehlers DuplicateSourceLocatorException abgefangen.

// Versuche einen Source-Locator zu erzeugen
try {
  // Ermitteln des Base-Locators der Topic-Map
  String tmBaseLoc = tm.getBaseLocator().getReference();
  // Erstellen des Source-Locators
  Locator srcLocator = tm.createLocator(tmBaseLoc + "#fitness");
  // Source-Locator hinzufügen
  t.addSourceLocator(srcLocator);
}
// Fehlerbehandlung bei doppelten Source-Locators
catch (DuplicateSourceLocatorException dsle) {
  System.err.print("SourceLocator schon vorhanden");
}

Im Beispiel wird zunächst der Base-Locator der Topic-Map-Instanz ermitteln. Im Anschluss wird ein neuer Locator, bestehend aus Base-Locator und Id des Topics, bei der Topic Map registriert. Dieser Locator wird mit Hilfe der Funktion addSourceLocator dem Topic zugewiesen.

Das Löschen des Source-Locator läuft ähnlich ab. Für das folgende Beispiel wird angenommen, dass der Source-Locator bereits als srcLocator bekannt ist.

// entfernen eines Source-Locator
topic.removeSourceLocator(srcLocator);

Sollte der Source-Locator einmal nicht bekannt sein, kann man mit Hilfe der Funktion getSourceLocators alle Source-Locators des Topic-Map-Objects ermitteln. Das Ergebnis dieser Funktion ist eine Menge von Locators über die iteriert werden kann. Folgendes Beispiel illustriert dieses Vorgehen:

// Alle Source-Locator ermitteln
HashSet srcLocators = topic.getSourceLocators();

// Iterator ermitteln
Iterator srcLocIt = srcLocators.iterator();

// Iteriere über alle Source-Locators
while (srcLocIt.hasNext()) {
  // aktuelle Source-Locator ermitteln
  Locator currentLocator = (Locator) srcLocIt.next();
  // Ausgabe
  System.out.prinln("Lösche: " + currentLocator.getReference());
  // Locator löschen
  topic.removeSourceLocator(currentLocator);
}

Zunächst werden die Source-Locator des Topic ermittelt und im Anschluss ein Iterator dafür erzeugt. Innerhalb der while-Anweisung wird der aktuelle Locator ermittelt und dann seine Referenz ausgegeben. Zum Schluss wird der Source-Locator entfernt mit Hilfe der Funktion removeSourceLocator entfernt.

Leave a Reply