Eigene Erweiterungen
TL-Script kann ganz leicht mit eigenen Funktionen über einen Plug-In-Mechanismus erweitert werden. Hierfür muss eine Java-Implementierung der TL-Script-Funktion erstellt und diese in der Anwendungskonfiguration registriert werden.
Implementierung
Die TL-Script-Funktion wird in einer Ableitung von com.top_logic.model.search.expr.GenericMethod
implementiert. Die eigentliche Funktion wird in der überschriebenen Methode com.top_logic.model.search.expr.Info.eval(Object, Object[], EvalContext)
implementiert. Die Methode erhält das Self-Argument als ersten Parameter und alle weiteren Argumente in dem Arguments-Array. Als Ergebnis muss die Methode das Funktionsergebnis der TL-Script-Funktion liefern.
Zusätzlich muss ein Builder für die Funktionsklasse erstellt werden. Dieser wird als Ableitung von com.top_logic.model.search.expr.config.operations.AbstractSimpleMethodBuilder<I>
erstellt. Dieser Builder erzeugt eine Instanz der Funktionsimplementierung von oben. Die Builder-Implementierung wird in der Anwendungskonfiguration registriert.
Eine minimale Implementierung einer TL-Script-Funktion, welche eine Zahl abrundet, könnte folgendermaßen aussehen:
public class Floor extends SimpleGenericMethod {
protected Floor(String name, SearchExpression self, SearchExpression[] arguments) {
super(name, self, arguments);
}
@Override
public GenericMethod copy(SearchExpression self, SearchExpression[] arguments) {
return new Floor(getName(), self, arguments);
}
@Override
public TLType getType(TLType selfType, List<TLType> argumentTypes) {
return selfType;
}
@Override
public Object eval(Object self, Object[] arguments) {
return Math.floor(asDouble(self));
}
public static final class Builder extends AbstractSimpleMethodBuilder<Floor> {
public Builder(InstantiationContext context, Config<?> config) {
super(context, config);
}
@Override
public Floor build(Expr expr, SearchExpression self, SearchExpression[] args)
throws ConfigurationException {
checkNoArguments(expr, self, args);
return new Floor(getConfig().getName(), self, args);
}
}
}
Konfiguration
Der Builder für die Funktionsimplementierung wird in der Anwendungskonfiguration im Abschnitt com.top_logic.model.search.expr.config.SearchBuilder
registriert. Die obige Funktion könnte wie folgt unter dem Namen my_floor
registriert werden:
<config service-class="com.top_logic.model.search.expr.config.SearchBuilder">
<instance>
<methods>
<method name="my_floor" class="my.package.Floor$Builder"/>
</methods>
</instance>
</config>
Nutzung
Eigene Funktionen können wie Built-In-Funktionen über den in der Konfiguration vergebenen Namen aufgerufen werden. Um Namenskonflikte mit zukünftigen Updates zu verhindern, empfiehlt es sich, einen Namenspräfix wie my_
in obigem Konfigurationsbeispiel zu verwenden.
Die oben registrierte Funktion kann dann wie folgt aufgerufen werden:
my_floor(4.2)
Das erwartete Ergebnis wäre dann 4
.