Regeln des Typs "DatasourceRule" dienen zur Bereitstellung von Daten für eine Datenquelle vom Typ "Dynamische Taskliste" oder "Report & Formular" durch die Implementierung des Interfaces org.nuclos.api.rule.DatasourceRule
.
Innerhalb des Baums mit der Regelbibliothek werden sie dem Knoten "DatasourceRule" zugeschrieben.
package example.rest; import org.nuclos.api.rule.DatasourceRule; import org.nuclos.api.UID; import org.nuclos.api.datasource.DatasourceColumn; import org.nuclos.api.datasource.DatasourceResult; import org.nuclos.api.provider.DatasourceProvider; import org.nuclos.api.provider.QueryProvider; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Map; public class DynamicArticleTasklistDatasourceRule implements DatasourceRule { /** * Diese Methode liefert die Daten für die Datenquelle in Form eines Objekts vom Type "DatasourceResult" zurück * und muss als einzige des Interfaces implementiert werden. * Zur Einschränkung der Ergebnisse können die Parameter ausgewertet werden, die wie üblich in Form einer "Map<String, Object>" übergeben werden. * Das zurückgegebene Objekt beinhaltet die Spaltendefinitionen als "List<DatasourceColumn>" und die Menge der Zeilen als "List<Object[]>". * Objekte vom Typ "DatasourceColumn" beinhalten die Information über den Namen der Spalte und den Datentyp und * können über den Aufruf von "DatasourceProvider.createResultColumn(name, type)" erzeugt werden. * **/ @Override public DatasourceResult getData(Map<String, Object> params) { List<DatasourceColumn> columns = Arrays.asList( DatasourceProvider.createResultColumn("number", Integer.class), DatasourceProvider.createResultColumn("name", String.class), DatasourceProvider.createResultColumn("active", Boolean.class), DatasourceProvider.createResultColumn("intid", Long.class) ); List<Object[]> rows = new ArrayList<>(); List<Article> lstArticles = QueryProvider.execute(QueryProvider.create(Article.class).where(Article.Active.eq(true))); for (Article article : lstArticles) { rows.add(new Object[] {article.getArticleNumber(), article.getName(), article.getActive(), article.getId()}); } return DatasourceProvider.createResult(rows, columns); } /** * Die nachfolgenden Methoden können implementiert werden, haben allerdings eine Standardimplementierung im Interface. Diese ist in * dieser exemplarischen Implementierung der Klasse angegeben. **/ /** * Liefert die Anzahl der Datensätze aus der Datenquelle unter Berücksichtigung der Suchbedingung und der Parameter. **/ @Override public Long count(SearchExpression se, Map<String, Object> params) { return (long)this.getData(params).getRows().size(); } /** * Liefert alle Datensätze aus der Datenquelle unter Berücksichtigung der Suchbedingung und der Parameter. **/ @Override public DatasourceResult getAll(SearchExpression se, Map<String, Object> params) { return this.getData(params); } /** * Liefert die IDs aller Datensätze aus der Datenquelle unter Berücksichtigung der Suchbedingung und der Parameter. **/ @Override public List<Long> getAllIds(SearchExpression se, Map<String, Object> params) { DatasourceResult data = this.getData(params); int i; for(i = 0; i < data.getColumns().size(); ++i) { DatasourceColumn column = (DatasourceColumn)data.getColumns().get(i); if ("INTID".equals(column.getName())) { break; } } return (List)data.getRows().stream().map((row) -> { return (Long)row[i]; }).collect(Collectors.toList()); } /** * Liefert einen Datensatz mit einer bestimmten ID. Diese ID wird als Parameter "INTID" in der Map übergeben. **/ @Override public DatasourceResult getById(Map<String, Object> params) { DatasourceResult data = this.getData(params); int i; for(i = 0; i < data.getColumns().size(); ++i) { DatasourceColumn column = (DatasourceColumn)data.getColumns().get(i); if ("INTID".equals(column.getName().toUpperCase())) { break; } } return (DatasourceResult)data.getRows().stream().filter((row) -> { return row[i] != null && row[i].equals(params.get("INTID")); }).map((row) -> { List<Object[]> rows = new ArrayList(); rows.add(row); return DatasourceProvider.createResult(rows, data.getColumns()); }).findFirst().orElse(DatasourceProvider.createResult(new ArrayList(), data.getColumns())); } /** * Liefert eine Menge von Datensätzen mit bestimmten IDs. Diese IDs werden als "List<Long>" im Parameter "INTID" in der Map übergeben. **/ @Override public DatasourceResult getByIds(Map<String, Object> params) { DatasourceResult data = this.getData(params); int i; for(i = 0; i < data.getColumns().size(); ++i) { DatasourceColumn column = (DatasourceColumn)data.getColumns().get(i); if ("INTID".equals(column.getName().toUpperCase())) { break; } } return DatasourceProvider.createResult((List)data.getRows().stream().filter((row) -> { return ((List)params.get("INTID")).contains(row[i]); }).collect(Collectors.toList()), data.getColumns()); } } |