Verbesserung
Top-Thema
Detail
Wichtig
Detail
Detail
#26175
Fehler beim Startup: I18NStructuredText kann von Lucene nicht indiziert werden
Zwischen Lucene und dem tl:BookmarkService existiert keine Abhängigkeit. Dadurch werden die Module ggf. in der falschen Reihenfolge gestartet. Beim Indizieren durch Lucene wird der Text der Seite abgefragt. Dadurch wird wiederum eine Routine ausgelöst, bei der TLObjectLinks in dem tl:I18NStructuredText ggf. aktualisiert werden, falls deren Name sich geändert hat. Wenn der tl:BookmarkService erst nach Lucene gestartet wird führt das zu Fehlern.
java.lang.IllegalStateException: com.top_logic.tool.boundsec.commandhandlers.BookmarkService module not started. at com.top_logic.basic.module.ModuleUtil.invalidStateNotStarted(ModuleUtil.java:1014) at com.top_logic.basic.module.BasicRuntimeModule.getImplementationInstance(BasicRuntimeModule.java:86) at com.top_logic.tool.boundsec.commandhandlers.BookmarkService.getInstance(BookmarkService.java:181) at com.top_logic.tool.boundsec.commandhandlers.DefaultBookmarkHandler.getObject(DefaultBookmarkHandler.java:64) at com.top_logic.tool.boundsec.commandhandlers.DefaultBookmarkHandler.getBookmarkObject(DefaultBookmarkHandler.java:59) at com.top_logic.layout.wysiwyg.ui.TLObjectLinkUtil.getObject(TLObjectLinkUtil.java:71) at com.top_logic.model.wysiwyg.i18n.I18NStructuredTextAttributeStorage.resolveLinkTaget(I18NStructuredTextAttributeStorage.java:210) at com.top_logic.model.wysiwyg.i18n.I18NStructuredTextAttributeStorage.updateLinks(I18NStructuredTextAttributeStorage.java:235) at com.top_logic.model.wysiwyg.i18n.I18NStructuredTextAttributeStorage.addSourceCodes(I18NStructuredTextAttributeStorage.java:100) at com.top_logic.model.wysiwyg.i18n.I18NStructuredTextAttributeStorage.getAttributeValue(I18NStructuredTextAttributeStorage.java:91) at com.top_logic.element.meta.AttributeOperations.getAttributeValue(AttributeOperations.java:215) at com.top_logic.element.meta.kbbased.PersistentObjectImpl.getValue(PersistentObjectImpl.java:154) at com.top_logic.element.meta.kbbased.PersistentObjectImpl.generateFullText(PersistentObjectImpl.java:286) at com.top_logic.element.structured.wrap.AttributedStructuredElementWrapper.generateFullText(AttributedStructuredElementWrapper.java:119) at com.top_logic.knowledge.indexing.DefaultIndexingService$WrapperContentObject.getContent(DefaultIndexingService.java:451) at com.top_logic.knowledge.indexing.lucene.LuceneThread.getContent(LuceneThread.java:491)
Außerdem erstellt Lucene beim Starten der Anwendung nicht richtig die Indizes. Zwar erkennt Lucene, falls keine vorhanden sind und sie neu erstellt werden müssen, aber erstellt dabei nur sozusagen leere Indizes. Die eigentlich zu indizierenden Objekte werden nicht beachtet.
Ein weiteres Problem ist, dass man aktuell zwar Tabellen über die Konfiguration entfernen kann: {{{#!xml <declaration resource="webinf://kbase/GovernedObjectMeta.xml" config:operation="remove" /> }}} Bei konfigurierten Indizes geht das noch nicht, da es sich um ein ListBinding handelt, welches solche Operationen noch nicht unterstützt.
Verbesserung
Da eine Abhängigkeit zwischen den Modulen wenig sinnvoll ist, wird jetzt beim Aktualisieren der Links erst überprüft, ob der tl:BookmarkService überhaupt schon gestartet ist. Falls nicht müssen keine Links aktualisiert werden. Das wird dann spätestens gemacht, wenn die Seite mit den Links geöffnet wird und der tl:BookmarkService sowieso schon gestartet ist.
Außerdem gibt es nun ein Flag im tl:LuceneIndex das speichert, ob ein neuer Lucene Index erstellt werden musste. Der tl:LuceneIndexingService nutzt dieses dann um ein Rebuild aller Indizes zu starten.
Um auch das Entfernen von Indizes zu ermöglichen, wurden das tl:AbstractListBining und tl:MapAttributeBinding so erweitert, dass Operationen in der Konfiguration ähnlich wie beim tl:ConfigurationReader. Welche Operationen möglich sind, kann hier nachvollzogen werden: doc:StackedConfiguration
Anwendung der Konfigurationsoperationen
Ein Beispiel, wie man einen Index wieder entfernen kann: {{{#!xml <config service-class="com.top_logic.knowledge.indexing.DefaultIndexingService" >
<instance>
<meta-objects>
<meta-object value="DecisionMemo" config:operation="remove"/>
</meta-objects>
</instance>
</config> }}}
Test
- Eine tl-doc Anwendung starten und Seiten in der Dokumentation erstellen.
- Die Anwendung stoppen und anschließend in /com.top_logic.doc.app/tmp/app-data/var den Ordner lucene_index löschen.
- Die Anwendung neu starten
- Eine valide Suche in der Searchbar eingeben. Es müssen entsprechende Ergebnisse erscheinen.
Außerdem weitere Tests für die Operationen in List- und MapBindings:
- TestMapAttributeBinding.java
- TestListBinding.java