Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich versuchen gerade eine UrlFactory zu erstellen, um Inhalte (Seiten) als JSON unserer Such-Anwendung zur Verfügung zu stellen.
Gewünscht ist es die JSON-Dateien "flach" in einen Ordner zu legen und als Dateinamen die UID der jeweiligen Inhalts-Seite zu verwenden.
Im Forum konnte ich dazu folgenden Thread mit sehr ähnlichen Anforderungen finden https://community.e-spirit.com/message/13519, leider ohne Lösung.
Aktuell verwenden wir die FirstSpirit Version 5.0.424.
Ich habe testweise versucht die Demo UrlFactory aus der Dokumentation in ein bestehendes Modul einzubinden, leider ohne Erfolg.
Bei der Generierung kann die Factory zwar für die Pfaderzeugung ausgewählt werden, sie hat aber keinen Einfluss auf die Erzeugten Dateien.
Ich hatte erwartet, das mit der Factory jede Datei den Namen "23032.json" bekommt.
Habe ich vielleicht einen Fehler beim Einbinden oder beim bauen des Moduls gemacht?
Vielleicht hat jemand einen Tipp für mich, komme irgendwie nicht weiter.
module.xml
<!DOCTYPE module SYSTEM "lib/module.dtd">
<module>
<name>FirstSpirit Test-Module</name>
<version>5.0.210.55494_87</version>
<description>FS5 Module</description>
<vendor>Test</vendor>
<components>
<library>
<name>XML Meta-Data Creator</name>
<description>Creates an XML structure with meta data.</description>
<resources>
<resource>lib/test-firstspirit.jar</resource>
<resource>lib/stax-api-1.0.1.jar</resource>
</resources>
</library>
<public>
<name>Search URLs Creator</name>
<class>de.espirit.firstspirit.generate.UrlCreatorSpecification</class>
<configuration>
<UrlFactory>de.test.firstspirit.search.SearchUrlFactory</UrlFactory>
</configuration>
</public>
</components>
</module>
SearchUrlFactory.java (Code aus der Demo-UrlFactory mit abgeänderten Werten bei "getUrl" für die Variablen "name" und "extension")
/** * Search engine-optimized path factory. */
public class SearchUrlFactory implements UrlFactory {
private PathLookup _pathLookup;
private boolean _useWelcomeFilenames;
/**
* Initialize fields based on various settings and a {@link PathLookup} object.
* @param settings Settings provided in module.xml file in section {@code ..}.
* The key is the tag name (converted to lower case), value is the text child node. E.g. {@code value}.
* @param pathLookup Path lookup for user defined paths.
*/
@Override
public void init(final Map settings, final PathLookup pathLookup) {
_pathLookup = pathLookup;
final String useWelcomeFilenames = settings.get("usewelcomefilenames");
_useWelcomeFilenames = useWelcomeFilenames == null || "yes".equalsIgnoreCase(useWelcomeFilenames) || "true".equalsIgnoreCase(useWelcomeFilenames);
}
/**
* Build the URL for a content-producing store element.
* @param contentProducer A store element.
* @param templateSet The target template set.
* @param language The target language.
* @param pageParams Page parameters, used for content projection, etc.
* @return The URL for the {@code contentProducer}, based on target template, target language and optional page parameters.
*/
@Override
public String getUrl(final ContentProducer contentProducer, final TemplateSet templateSet, final Language language, final PageParams pageParams) {
final String name = "23032"; // testValue getName(contentProducer, templateSet, language, pageParams);
final String extension = "json"; // testValue contentProducer.getExtension(templateSet);
int len = name.length();
if (!extension.isEmpty()) {
len += extension.length();
len ++; // for dot
[...]
Viele Grüße
Alex
Ergänze mal im Abschnitt "<configuration>" dieses Fragment: <UseRegistry>no</UseRegistry>
Ergänze mal im Abschnitt "<configuration>" dieses Fragment: <UseRegistry>no</UseRegistry>
Super, jetzt funktionierts. Danke!
Könntest du mir noch sagen was "UseRegistry" bewirkt, bzw. wo ich eine Beschreibung dazu finden kann - konnte nichts dazu in der Doku finden?
Viele Grüße
Alex
Über den Schalter wird die Persistenz der URLs gesteuert. Steht der Schalter auf "yes" (was der Standard-Wert ist), wird zuerst in der Persistenz ("registry") nachgeschlagen, ob für die Seite bereits eine URL hinterlegt ist. Erst wenn das nicht der Fall ist, wird die UrlFactory-Implementierung gefragt und dann der gelieferte Wert gespeichert. Der Wert in der Persistenz kann aber auch über den Client oder über eine API gesetzt werden.
Den Hinweis bezüglich der Doku leite ich weiter.
Schaltet man die Registry aus, so wird leider die init Methode der Factory nicht mehr aufgerufen und das PathLookup Objekt ist null. Getestet habe ich das mit Version 5.0.425.6
Das ist ein Fehler, interne ID #147797.
Getestet habe ich das mit Version 5.0.425.6
Mit 5.0.427 behoben.