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.