diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 17588ef..c9dc384 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -5,6 +5,7 @@
- Finalisierung Business Partner Interface
|- Neue Plugin Logik (Aktualisierung der BP Nummer und Aktivierung von BP Objekten falls diese archiviert waren)
- Zoho Schnittstelle
+- Neues DataView und DataGroups Konzept implementiert
### Migration
diff --git a/docker-compose.yml b/docker-compose.yml
index 932edcc..1680df3 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -57,11 +57,11 @@ services:
# Tika OCR Service
###############################################
tika:
- image: apache/tika:3.2.0.0-full
- environment:
- TZ: "Europe/Berlin"
- ports:
- - "9998:9998"
+ image: apache/tika:3.2.0.0-full
+ environment:
+ TZ: "Europe/Berlin"
+ ports:
+ - "9998:9998"
##################
# Exporter Service
@@ -88,10 +88,10 @@ services:
###############################################
# Imixs-Admin
###############################################
- imixsadmin:
- image: imixs/imixs-admin
- ports:
- - "8888:8080"
+ # imixsadmin:
+ # image: imixs/imixs-admin
+ # ports:
+ # - "8888:8080"
###############################################
# Mailgateway
diff --git a/office-alexander-logistics-app/pom.xml b/office-alexander-logistics-app/pom.xml
index 1684ef3..8f1f71b 100644
--- a/office-alexander-logistics-app/pom.xml
+++ b/office-alexander-logistics-app/pom.xml
@@ -282,6 +282,10 @@
org.imixs.workflowimixs-data-groups
+
+ org.imixs.workflow
+ imixs-data-views
+
diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/dataview/AGLDataViewDebitorAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/dataview/AGLDataViewDebitorAdapter.java
index e484391..439b87f 100644
--- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/dataview/AGLDataViewDebitorAdapter.java
+++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/dataview/AGLDataViewDebitorAdapter.java
@@ -12,12 +12,12 @@ import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.imixs.workflow.ItemCollection;
+import org.imixs.workflow.dataview.DataViewExportEvent;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.config.ConfigService;
-import org.imixs.workflow.office.dataview.DataViewExportEvent;
import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.poi.POIUtil;
diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewCache.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewCache.java
deleted file mode 100644
index e267e7b..0000000
--- a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewCache.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Imixs Workflow Technology
- * Copyright (C) 2003, 2008 Imixs Software Solutions GmbH,
- * http://www.imixs.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You can receive a copy of the GNU General Public
- * License at http://www.gnu.org/licenses/gpl.html
- *
- * Contributors:
- * Imixs Software Solutions GmbH - initial API and implementation
- * Ralph Soika
- *
- *******************************************************************************/
-package org.imixs.workflow.office.dataview;
-
-import java.io.Serializable;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.imixs.workflow.ItemCollection;
-
-import jakarta.enterprise.context.SessionScoped;
-import jakarta.inject.Named;
-
-/**
- * The DataViewCache implements a sessionScoped cache for the dataView filter.
- * The cache uses the cacheId provided in the URL - see DataViewController
- * onLoad
- *
- * @author rsoika
- * @version 1.0
- */
-@Named
-@SessionScoped
-public class DataViewCache implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- private Map dataViewStates = new ConcurrentHashMap<>();
-
- public void put(String key, ItemCollection data) {
- dataViewStates.put(key, data);
- }
-
- public ItemCollection get(String key) {
- ItemCollection result = dataViewStates.get(key);
- if (result == null) {
- // init new empty cache object!
- result = new ItemCollection();
- dataViewStates.put(key, result);
- }
- return result;
- }
-}
diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewController.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewController.java
deleted file mode 100644
index 8d1d126..0000000
--- a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewController.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*******************************************************************************
- * Imixs Workflow Technology
- * Copyright (C) 2003, 2008 Imixs Software Solutions GmbH,
- * http://www.imixs.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You can receive a copy of the GNU General Public
- * License at http://www.gnu.org/licenses/gpl.html
- *
- * Contributors:
- * Imixs Software Solutions GmbH - initial API and implementation
- * Ralph Soika
- *
- *******************************************************************************/
-package org.imixs.workflow.office.dataview;
-
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.regex.Pattern;
-
-import org.imixs.archive.core.SnapshotService;
-import org.imixs.workflow.FileData;
-import org.imixs.workflow.ItemCollection;
-import org.imixs.workflow.engine.DocumentService;
-import org.imixs.workflow.engine.WorkflowService;
-import org.imixs.workflow.exceptions.ModelException;
-import org.imixs.workflow.exceptions.PluginException;
-import org.imixs.workflow.exceptions.QueryException;
-import org.imixs.workflow.faces.data.ViewController;
-import org.imixs.workflow.faces.data.ViewHandler;
-import org.imixs.workflow.faces.data.WorkflowController;
-import org.imixs.workflow.office.forms.CustomFormController;
-import org.imixs.workflow.office.forms.CustomFormSection;
-
-import com.alexanderlogistics.mahnlauf.InkassoExportAdapter;
-
-import jakarta.annotation.PostConstruct;
-import jakarta.enterprise.context.Conversation;
-import jakarta.enterprise.context.ConversationScoped;
-import jakarta.faces.context.FacesContext;
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
-import jakarta.servlet.http.HttpServletRequest;
-
-/**
- * The DataViewController is used to display a data view
- *
- * The controller uses the uniqueId from the URL to load the definition.
- * The bean reads optional cached query data form
- * a session scoped cache EJB and reloads the last state. This is useful for
- * situations where the user navigates to a new page (e.g. open a workitem) and
- * late uses browser history back.
- *
- * Note: This bean is ConversationScoped, because it uses the
- * CustomFormController which expects conversion scope!
- *
- *
- * @author rsoika
- * @version 1.0
- */
-@Named
-@ConversationScoped
-public class DataViewController extends ViewController {
-
- private static final long serialVersionUID = 1L;
-
- public static final String ERROR_CONFIG = "CONFIG_ERROR";
- public static final int MAX_ROWS = 9999;
-
- private List sections = null;
- private List viewItemDefinitions = null;
- protected ItemCollection dataViewDefinition = null;
- private ItemCollection filter;
- private String query;
- private String errorMessage;
-
- @Inject
- DataViewCache dataViewCache;
-
- @Inject
- private Conversation conversation;
-
- @Inject
- private DocumentService documentService;
-
- @Inject
- private WorkflowService workflowService;
-
- @Inject
- SnapshotService snapshotService;
-
- @Inject
- CustomFormController customFormController;
-
- @Inject
- WorkflowController workflowController;
-
- @Inject
- DataViewDefaultExporter dataViewDefaultExporter;
-
- @Inject
- ViewHandler viewHandler;
-
- @Inject
- DataViewDefinitionController dataViewDefinitionController;
-
- private static Logger logger = Logger.getLogger(DataViewController.class.getName());
-
- @Override
- @PostConstruct
- public void init() {
- super.init();
- // this.setQuery(dataViewController.getQuery());
- this.setSortBy("$modified");
- this.setSortReverse(false);
- this.setPageSize(100);
- this.setLoadStubs(false);
- }
-
- /**
- * This method loads the custom form sections
- */
- public void onLoad() {
- String uniqueid = null;
-
- // Important: start a new conversation beause of the usage of the
- // CustomFormController!
- startConversation();
-
- FacesContext facesContext = FacesContext.getCurrentInstance();
- if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
- // ...
- FacesContext fc = FacesContext.getCurrentInstance();
- Map paramMap = fc.getExternalContext().getRequestParameterMap();
- // try to extract the uniqueid form the query string...
- uniqueid = paramMap.get("id");
- if (uniqueid == null || uniqueid.isEmpty()) {
- // alternative 'workitem=...'
- uniqueid = paramMap.get("workitem");
- }
- dataViewDefinition = documentService.load(uniqueid);
- }
-
- if (uniqueid != null && !uniqueid.isEmpty()) {
- filter = dataViewCache.get(uniqueid);
- } else {
- filter = new ItemCollection();
- }
-
- try {
- // Init new Filter....
- if (dataViewDefinition != null) {
- filter.setItemValue("txtWorkflowEditorCustomForm", dataViewDefinition.getItemValue("form"));
- filter.setItemValue("name", dataViewDefinition.getItemValueString("name"));
- filter.setItemValue("description", dataViewDefinition.getItemValueString("description"));
- viewItemDefinitions = DataViewDefinitionController
- .computeDataViewItemDefinitions(dataViewDefinition);
-
- customFormController.computeFieldDefinition(filter);
- sections = customFormController.getSections();
-
- // Update View Handler settings
- String sortBy = dataViewDefinition.getItemValueString("sort.by");
- if (sortBy.isEmpty()) {
- sortBy = "$modified";
- }
- this.setSortBy(sortBy);
- this.setSortReverse(dataViewDefinition.getItemValueBoolean("sort.reverse"));
- this.setPageIndex(filter.getItemValueInteger("pageIndex"));
- if (!filter.getItemValueString("query").isEmpty()) {
- query = filter.getItemValueString("query");
- // Prefetch data to update total count and page count
- viewHandler.getData(this);
- }
- }
- } catch (ModelException | QueryException e) {
- logger.warning("Failed to load dataview definition: " + e.getMessage());
- }
-
- }
-
- @Override
- public List loadData() throws QueryException {
-
- try {
-
- return super.loadData();
-
- } catch (Exception e) {
- logger.severe("Failed to load view: " + e.getMessage());
- return new ArrayList<>();
- }
-
- }
-
- public ItemCollection getDataViewDefinition() {
- return dataViewDefinition;
- }
-
- public List getSections() {
- return sections;
- }
-
- public List getViewItemDefinitions() {
- return viewItemDefinitions;
- }
-
- public ItemCollection getFilter() {
- return filter;
- }
-
- public void setFilter(ItemCollection filter) {
- this.filter = filter;
- }
-
- public String getErrorMessage() {
- return errorMessage;
- }
-
- public void setErrorMessage(String errorMessage) {
- this.errorMessage = errorMessage;
- }
-
- /**
- * This helper method builds a query from the query definition and the current
- * filter criteria.
- *
- * The method loads the query form the definition and replaces all {}
- * elements with the values from the filter
- *
- *
- * @throws QueryException
- */
- public void run() throws PluginException, QueryException {
-
- reset();
-
- // build new query from template
- query = dataViewDefinition.getItemValueString("query");
-
- query = parseQuery(query, filter);
- query = parseQuery(query, workflowController.getWorkitem());
-
- logger.info("query=" + query);
- filter.setItemValue("query", query);
-
- // Prefetch data to update total count and page count
- viewHandler.getData(this);
- // cache filter
- dataViewCache.put(dataViewDefinition.getUniqueID(), filter);
-
- }
-
- private String parseQuery(String query, ItemCollection filter) {
- List filterItems = filter.getItemNames();
- for (String itemName : filterItems) {
- String itemValue = filter.getItemValueString(itemName);
-
- // is date?
- if (filter.getItemValueDate(itemName) != null) {
- String sDateFrom = "191401070000"; // because * did not work here
- String sDateTo = "211401070000";
- SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMddHHmm");
-
- itemValue = dateformat.format(filter.getItemValueDate(itemName));
-
- }
-
- // Create regex pattern to match {itemName} (case-sensitive)
- // The Pattern.quote is used to escape any special regex characters in the
- // itemName
- // Replace all occurrences in the query case-insensitive.
- query = query.replaceAll("(?i)\\{" + Pattern.quote(itemName) + "\\}", itemValue);
- }
- return query;
- }
-
- /**
- * Returns the current query
- *
- * @return
- */
- public String getQuery() {
- return query;
- }
-
- /**
- * This method navigates back in the page index and caches the current page
- * index
- */
- public void back() {
- viewHandler.back(this);
- filter.setItemValue("pageIndex", this.getPageIndex());
- }
-
- /**
- * This method navigates forward in the page index and caches the current page
- * index
- */
- public void forward() {
- viewHandler.forward(this);
- filter.setItemValue("pageIndex", this.getPageIndex());
- }
-
- /**
- * Starts a new conversation
- */
- protected void startConversation() {
- if (conversation.isTransient()) {
- conversation.setTimeout(
- ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest())
- .getSession().getMaxInactiveInterval() * 1000);
- conversation.begin();
- logger.log(Level.FINEST, "......start new conversation, id={0}",
- conversation.getId());
-
- }
- }
-
- /**
- * Exports data into a excel template processed by apache-poi.
- * The method sends a DataViewExport event to allow clients to adapt the export
- * process.
- *
- * @see DataViewExportEvent
- *
- * @throws PluginException
- * @throws QueryException
- */
- public String export() throws PluginException, QueryException {
-
- // build query and prepare dataset
- run();
-
- SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMddHHmm");
- String targetFileName = dataViewDefinition.getItemValueString("poi.targetFilename");
- if (targetFileName.isEmpty()) {
- throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
- "Missing Excel Export definition - check configuration!");
- }
- logger.info("start export : " + targetFileName + "...");
- logger.fine(query);
-
- // load template
- FileData fileData = loadTemplate();
-
- if (fileData == null) {
- // we did not found the template!
- throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
- "Missing Excel Export Template - check DataView definition!");
- }
- targetFileName = targetFileName + "_" + dateformat.format(new Date()) + ".xlsx";
- try {
- // test if query exceeds max count
- int totalCount = documentService.count(query);
- if (totalCount > MAX_ROWS) {
- throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
- "Data can not be exported into Excel because dataset exceeds " + MAX_ROWS + " rows!");
- }
- String sortBy = dataViewDefinition.getItemValueString("sort.by");
- if (sortBy.isEmpty()) {
- sortBy = "$modified"; // default
- }
- List invoices = documentService.find(query, MAX_ROWS, 0, sortBy,
- dataViewDefinition.getItemValueBoolean("sort.reverse"));
- if (invoices.size() > 0) {
- dataViewDefaultExporter.insertDataRows(invoices, dataViewDefinition, viewItemDefinitions, fileData);
- }
-
- // create a temp event
- ItemCollection event = new ItemCollection().setItemValue("txtActivityResult",
- dataViewDefinition.getItemValue("poi.update"));
- ItemCollection poiConfig = workflowService.evalWorkflowResult(event, "poi-update", dataViewDefinition,
- false);
-
- // merge workitem fields (Workaround because custom forms did hard coded map to
- // workflowController instead of workitem
- filter.copy(workflowController.getWorkitem());
- DataViewPOIHelper.poiUpdate(filter, fileData, poiConfig, workflowService);
-
- fileData.setName(targetFileName);
-
- // See:
- // https://stackoverflow.com/questions/9391838/how-to-provide-a-file-download-from-a-jsf-backing-bean
- DataViewPOIHelper.downloadExcelFile(fileData);
- } catch (IOException | QueryException e) {
- throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG,
- "Failed to generate Excel Export: " + e.getMessage());
- }
-
- // return "/pages/admin/excel_export_rechnungsausgang.jsf?faces-redirect=true";
- return "";
- }
-
- /**
- * This method returns the first excel poi template from the Data Definition
- *
- * @param name in attribute txtname
- *
- *
- */
- private FileData loadTemplate() {
-
- // first filename
- List fileDataList = dataViewDefinition.getFileData();
- if (fileDataList != null && fileDataList.size() > 0) {
- String fileName = fileDataList.get(0).getName();
- return snapshotService.getWorkItemFile(dataViewDefinition.getUniqueID(), fileName);
- }
- // no file data available!
- return null;
- }
-
-}
diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefaultExporter.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefaultExporter.java
deleted file mode 100644
index 00ebc11..0000000
--- a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefaultExporter.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.imixs.workflow.office.dataview;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.util.List;
-import java.util.logging.Logger;
-
-import org.apache.poi.ss.usermodel.CellCopyPolicy;
-import org.apache.poi.ss.util.CellReference;
-import org.apache.poi.xssf.usermodel.XSSFRow;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.imixs.workflow.FileData;
-import org.imixs.workflow.ItemCollection;
-import org.imixs.workflow.exceptions.PluginException;
-import org.imixs.workflow.office.forms.AnalyticController;
-
-import jakarta.enterprise.context.ConversationScoped;
-import jakarta.enterprise.event.Event;
-import jakarta.inject.Inject;
-import jakarta.inject.Named;
-
-/**
- * The DataViewDefaultExporter exports a dataset into a excel template. The
- * exporter sends a DataViewExportEvent. An observer CID bean can implement
- * alternative exporters.
- * With the event property 'completed' a client can signal that the export
- * process is completed. Otherwise the default behavior will be adapted.
- *
- * @author rsoika
- *
- */
-@Named
-@ConversationScoped
-public class DataViewDefaultExporter implements Serializable {
- public static final String ERROR_CONFIG = "CONFIG_ERROR";
-
- private static final long serialVersionUID = 1L;
- private static Logger logger = Logger.getLogger(AnalyticController.class.getName());
-
- @Inject
- protected Event dataViewExportEvents;
-
- /**
- * This helper method inserts a row for each invoice
- *
- * @throws PluginException
- */
- public void insertDataRows(List dataset, ItemCollection dataViewDefinition,
- List viewItemDefinitions,
- FileData fileData) throws PluginException {
- // load XSSFWorkbook
- try (InputStream imputStream = new ByteArrayInputStream(fileData.getContent())) {
- XSSFWorkbook doc = new XSSFWorkbook(imputStream);
-
- // send DataViewExportEvent....
- if (dataViewExportEvents != null) {
- DataViewExportEvent event = new DataViewExportEvent(dataset, dataViewDefinition, viewItemDefinitions,
- doc);
- dataViewExportEvents.fire(event); // found FileData?
- if (!event.isCompleted()) {
- // Default behavior
- defaultExport(dataset, dataViewDefinition, viewItemDefinitions, doc);
- }
- }
-
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- // write back the file
- doc.write(byteArrayOutputStream);
- doc.close();
- byte[] newContent = byteArrayOutputStream.toByteArray();
- fileData.setContent(newContent);
-
- } catch (IOException e) {
- throw new PluginException(DataViewPOIHelper.class.getSimpleName(), ERROR_CONFIG,
- "failed to update excel export: " + e.getMessage());
- }
- }
-
- /**
- * This is the default implementation to insert a dataset into a XSSFSheet
- *
- * @param dataset
- * @param referenceCell
- * @param viewItemDefinitions
- * @param doc
- */
- private void defaultExport(List dataset, ItemCollection dataViewDefinition,
- List viewItemDefinitions, XSSFWorkbook doc) {
- String referenceCell = dataViewDefinition.getItemValueString("poi.referenceCell");
-
- // NOTE: we only take the first sheet !
- XSSFSheet sheet = doc.getSheetAt(0);
-
- CellReference cr = new CellReference(referenceCell);
- XSSFRow referenceRow = sheet.getRow(cr.getRow());
- int referenceRowPos = referenceRow.getRowNum() + 1;
- int rowPos = referenceRowPos;
- // int lastRow = sheet.getLastRowNum();
- int lastRow = 999;
- logger.finest("Last rownum=" + lastRow);
- sheet.shiftRows(rowPos, lastRow, dataset.size(), true, true);
-
- for (ItemCollection workitem : dataset) {
- logger.finest("......copy row...");
-
- // now create a new line..
- XSSFRow row = sheet.createRow(rowPos);
- row.copyRowFrom(referenceRow, new CellCopyPolicy());
- // insert values
- int cellNum = 0;
- for (ItemCollection itemDef : viewItemDefinitions) {
- String type = itemDef.getItemValueString("item.type");
- String name = itemDef.getItemValueString("item.name");
- switch (type) {
- case "xs:double":
- row.getCell(cellNum).setCellValue(workitem.getItemValueDouble(name));
- break;
- case "xs:float":
- row.getCell(cellNum).setCellValue(workitem.getItemValueFloat(name));
- break;
- case "xs:int":
- row.getCell(cellNum).setCellValue(workitem.getItemValueInteger(name));
- break;
- case "xs:date":
- row.getCell(cellNum).setCellValue(workitem.getItemValueDate(name));
- break;
-
- default:
- row.getCell(cellNum).setCellValue(workitem.getItemValueString(name));
- }
- cellNum++;
- }
-
- rowPos++;
- }
- // delete reference row
- sheet.shiftRows(referenceRowPos, lastRow + dataset.size(), -1, true, true);
-
- }
-
-}
diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefinitionController.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefinitionController.java
deleted file mode 100644
index 75e93f9..0000000
--- a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefinitionController.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Imixs Workflow Technology
- * Copyright (C) 2003, 2008 Imixs Software Solutions GmbH,
- * http://www.imixs.com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You can receive a copy of the GNU General Public
- * License at http://www.gnu.org/licenses/gpl.html
- *
- * Contributors:
- * Imixs Software Solutions GmbH - initial API and implementation
- * Ralph Soika
- *
- *******************************************************************************/
-package org.imixs.workflow.office.dataview;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.imixs.workflow.ItemCollection;
-import org.imixs.workflow.exceptions.AccessDeniedException;
-import org.imixs.workflow.exceptions.QueryException;
-import org.imixs.workflow.faces.data.AbstractDataController;
-import org.imixs.workflow.faces.data.DocumentController;
-
-import com.oracle.svm.core.annotate.Inject;
-
-import jakarta.annotation.PostConstruct;
-import jakarta.enterprise.context.SessionScoped;
-import jakarta.faces.context.ExternalContext;
-import jakarta.faces.context.FacesContext;
-import jakarta.inject.Named;
-
-/**
- * The DataViewDefinitionController is used to configure a dataview definition
- *
- * @author rsoika
- * @version 1.0
- */
-@Named
-@SessionScoped
-public class DataViewDefinitionController extends AbstractDataController {
-
- private static final long serialVersionUID = 1L;
-
- protected List attributeList = null;
-
- @Inject
- DocumentController documentController;
-
- protected List dataViewDefinitions = null;
-
- private static Logger logger = Logger.getLogger(DataViewDefinitionController.class.getName());
-
- /**
- *
- *
- */
- @PostConstruct
- public void init() {
-
- }
-
- public List getDefinitions() {
- if (dataViewDefinitions == null) {
- // lazy loading
- String quuery = "(type:\"dataview\")";
- try {
- dataViewDefinitions = this.getDocumentService().find(quuery, 999, 0, "name", false);
- } catch (QueryException e) {
- logger.severe("Failed to load DataView definition list: " + e.getMessage());
- }
-
- }
-
- return dataViewDefinitions;
-
- }
-
- /**
- * Finds all dataview definitions assigned to a process by its name
- *
- * @param name
- * @return
- */
- public List findDefinitionByProcessRef(String id) {
- List result = new ArrayList<>();
- if (id == null) {
- return result;
- }
-
- getDefinitions();
- for (ItemCollection def : dataViewDefinitions) {
- if (id.equals(def.getItemValueString("process.ref"))) {
- result.add(def);
- }
- }
- return result;
- }
-
- /**
- * Returns the current workItem. If no workitem is defined the method
- * Instantiates a empty ItemCollection.
- *
- * @return - current workItem or null if not set
- */
- public ItemCollection getData() {
- // do initialize an empty workItem here if null
- if (data == null) {
- reset();
- }
- return data;
- }
-
- /**
- * This method returns a unique view URI to be used zu display the View Data.
- * The uri contains a unique random ID to support caching over different browser
- * tabs
- *
- * @return
- */
- public String getViewURI(ItemCollection dataDef) {
- return "/pages/dataviews/data.xhtml?id=" + dataDef.getUniqueID() + "&faces-redirect=true";
- }
-
- @Override
- public void load(String uniqueid) {
-
- super.load(uniqueid);
- attributeList = computeDataViewItemDefinitions(this.data);
- }
-
- /**
- * Returns a List of ItemCollection instances representing the view column
- * description.
- * Each column has the items:
- *
- * name,label,format,convert
- *
- * @param dataViewDefinition
- * @return
- *
- */
- @SuppressWarnings("unchecked")
- public static List computeDataViewItemDefinitions(ItemCollection dataViewDefinition) {
-
- ArrayList result = new ArrayList();
- List