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.