Skip to content

Commit

Permalink
Virtual column not updated anymore
Browse files Browse the repository at this point in the history
  • Loading branch information
teosarca committed Apr 3, 2020
1 parent b8cf860 commit fe5a7a3
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 91 deletions.
Expand Up @@ -4,6 +4,8 @@
import java.util.Set;
import java.util.function.Predicate;

import javax.annotation.Nullable;

import org.adempiere.ad.table.api.IADTableDAO;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.lang.impl.TableRecordReference;
Expand Down Expand Up @@ -204,19 +206,25 @@ public ResponseEntity<JSONDocumentLayout> getLayout(
}

@GetMapping("/{windowId}/{documentId}")
public List<JSONDocument> getData(
public List<JSONDocument> getRootDocuments(
@PathVariable("windowId") final String windowIdStr,
@PathVariable("documentId") final String documentIdStr,
@RequestParam(name = PARAM_FieldsList, required = false) @ApiParam("comma separated field names") final String fieldsListStr,
@RequestParam(name = PARAM_Advanced, required = false, defaultValue = PARAM_Advanced_DefaultValue) final boolean advanced)
@RequestParam(name = PARAM_Advanced, required = false, defaultValue = PARAM_Advanced_DefaultValue) final boolean advanced,
@RequestParam(name = "noTabs", required = false, defaultValue = "false") final boolean noTabs)
{
final WindowId windowId = WindowId.fromJson(windowIdStr);
final DocumentPath documentPath = DocumentPath.rootDocumentPath(windowId, documentIdStr);
return getData(documentPath, fieldsListStr, advanced, DocumentQueryOrderByList.EMPTY);
final JSONDocumentOptions jsonOpts = newJSONDocumentOptions()
.showOnlyFieldsListStr(fieldsListStr)
.showAdvancedFields(advanced)
.doNotFetchIncludedTabs(noTabs)
.build();
return getData(documentPath, DocumentQueryOrderByList.EMPTY, jsonOpts);
}

@GetMapping("/{windowId}/{documentId}/{tabId}")
public List<JSONDocument> getData(
public List<JSONDocument> getIncludedTabRows(
@PathVariable("windowId") final String windowIdStr,
@PathVariable("documentId") final String documentIdStr,
@PathVariable("tabId") final String tabIdStr,
Expand All @@ -241,11 +249,17 @@ public List<JSONDocument> getData(
}

final DocumentQueryOrderByList orderBys = DocumentQueryOrderByList.parse(orderBysListStr);
return getData(documentPath, fieldsListStr, advanced, orderBys);

final JSONDocumentOptions jsonOpts = newJSONDocumentOptions()
.showOnlyFieldsListStr(fieldsListStr)
.showAdvancedFields(advanced)
.build();

return getData(documentPath, orderBys, jsonOpts);
}

@GetMapping("/{windowId}/{documentId}/{tabId}/{rowId}")
public List<JSONDocument> getData(
public List<JSONDocument> getIncludedTabRow(
@PathVariable("windowId") final String windowIdStr //
, @PathVariable("documentId") final String documentIdStr //
, @PathVariable("tabId") final String tabIdStr //
Expand All @@ -256,18 +270,21 @@ public List<JSONDocument> getData(
{
final WindowId windowId = WindowId.fromJson(windowIdStr);
final DocumentPath documentPath = DocumentPath.includedDocumentPath(windowId, documentIdStr, tabIdStr, rowIdStr);
return getData(documentPath, fieldsListStr, advanced, DocumentQueryOrderByList.EMPTY);
final JSONDocumentOptions jsonOpts = newJSONDocumentOptions()
.showOnlyFieldsListStr(fieldsListStr)
.showAdvancedFields(advanced)
.build();

return getData(documentPath, DocumentQueryOrderByList.EMPTY, jsonOpts);
}

private List<JSONDocument> getData(final DocumentPath documentPath, final String fieldsListStr, final boolean advanced, final DocumentQueryOrderByList orderBys)
private List<JSONDocument> getData(
@NonNull final DocumentPath documentPath,
@Nullable final DocumentQueryOrderByList orderBys,
@NonNull final JSONDocumentOptions jsonOpts)
{
userSession.assertLoggedIn();

final JSONDocumentOptions jsonOpts = newJSONDocumentOptions()
.showAdvancedFields(advanced)
.dataFieldsListStr(fieldsListStr)
.build();

return documentCollection.forRootDocumentReadonly(documentPath, rootDocument -> {
List<Document> documents;
if (documentPath.isRootDocument())
Expand Down
Expand Up @@ -29,6 +29,7 @@
import de.metas.ui.web.window.model.DocumentValidStatus;
import de.metas.ui.web.window.model.IDocumentChangesCollector;
import de.metas.ui.web.window.model.IIncludedDocumentsCollection;
import lombok.NonNull;
import lombok.ToString;

/*
Expand Down Expand Up @@ -65,7 +66,7 @@
@ToString(callSuper = true)
public final class JSONDocument extends JSONDocumentBase
{
public static JSONDocument ofDocument(final Document document, final JSONDocumentOptions options)
public static JSONDocument ofDocument(@NonNull final Document document, @NonNull final JSONDocumentOptions options)
{
final JSONDocument jsonDocument = new JSONDocument(document.getDocumentPath());

Expand Down Expand Up @@ -106,11 +107,14 @@ public static JSONDocument ofDocument(final Document document, final JSONDocumen

//
// Included tabs info
document.getIncludedDocumentsCollections()
.stream()
.map(JSONDocument::createIncludedTabInfo)
.peek(jsonIncludedTabInfo -> options.getDocumentPermissions().apply(document, jsonIncludedTabInfo))
.forEach(jsonDocument::addIncludedTabInfo);
if (!options.isDoNotFetchIncludedTabs())
{
document.getIncludedDocumentsCollections()
.stream()
.map(JSONDocument::createIncludedTabInfo)
.peek(jsonIncludedTabInfo -> options.getDocumentPermissions().apply(document, jsonIncludedTabInfo))
.forEach(jsonDocument::addIncludedTabInfo);
}

//
// Available standard actions
Expand All @@ -133,7 +137,7 @@ private static JSONIncludedTabInfo createIncludedTabInfo(final IIncludedDocument
final JSONIncludedTabInfo tabInfo = JSONIncludedTabInfo.newInstance(includedDocumentsCollection.getDetailId());
if (includedDocumentsCollection.isStale())
{
tabInfo.setStale();
tabInfo.markAllRowsStaled();
}

final LogicExpressionResult allowCreateNew = includedDocumentsCollection.getAllowCreateNewDocument();
Expand Down Expand Up @@ -257,7 +261,7 @@ private static JSONIncludedTabInfo createIncludedTabInfo(final DocumentChanges.I
final JSONIncludedTabInfo tabInfo = JSONIncludedTabInfo.newInstance(includedDetailInfo.getDetailId());
if (includedDetailInfo.isStale())
{
tabInfo.setStale();
tabInfo.markAllRowsStaled();
}

final LogicExpressionResult allowCreateNew = includedDetailInfo.getAllowNew();
Expand Down
Expand Up @@ -51,26 +51,32 @@ public static JSONDocumentOptions of(@NonNull final UserSession userSession)

@Getter
private final JSONOptions jsonOpts;
private final boolean showAdvancedFields;
private final String dataFieldsListStr;
private final Supplier<JSONDocumentPermissions> documentPermissionsSupplier;

private final String showOnlyFieldsListStr;
private Predicate<IDocumentFieldView> _documentFieldFilter; // lazy
private Predicate<DocumentFieldChange> _documentFieldChangeFilter; // lazy

@Getter
private final boolean doNotFetchIncludedTabs;
private final boolean showAdvancedFields;

private final Supplier<JSONDocumentPermissions> documentPermissionsSupplier;

private static final transient Splitter FIELDS_LIST_SPLITTER = Splitter.on(",")
.trimResults()
.omitEmptyStrings();

@Builder
private JSONDocumentOptions(
@NonNull final UserSession userSession,
@Nullable final String showOnlyFieldsListStr,
final boolean showAdvancedFields,
@Nullable final String dataFieldsListStr)
final boolean doNotFetchIncludedTabs)
{
this.jsonOpts = JSONOptions.of(userSession);
this.showOnlyFieldsListStr = showOnlyFieldsListStr;
this.showAdvancedFields = showAdvancedFields;
this.dataFieldsListStr = dataFieldsListStr;
this.doNotFetchIncludedTabs = doNotFetchIncludedTabs;
this.documentPermissionsSupplier = createPermissionsSupplier(userSession);
}

Expand Down Expand Up @@ -105,7 +111,7 @@ private Predicate<IDocumentFieldView> createDocumentFieldFilter()
{
final Predicate<IDocumentFieldView> filter = showAdvancedFields ? FILTER_DocumentFieldView_ALL_PUBLIC_FIELDS : FILTER_DocumentFieldView_BASIC_PUBLIC_FIELDS;

final Set<String> dataFieldNamesSet = Check.isEmpty(dataFieldsListStr, true) ? ImmutableSet.of() : ImmutableSet.copyOf(FIELDS_LIST_SPLITTER.splitToList(dataFieldsListStr));
final Set<String> dataFieldNamesSet = Check.isEmpty(showOnlyFieldsListStr, true) ? ImmutableSet.of() : ImmutableSet.copyOf(FIELDS_LIST_SPLITTER.splitToList(showOnlyFieldsListStr));
if (dataFieldNamesSet.isEmpty() || dataFieldNamesSet.contains("*"))
{
return filter;
Expand All @@ -128,7 +134,7 @@ private Predicate<DocumentFieldChange> createDocumentFieldChangeFilter()
{
final Predicate<DocumentFieldChange> filter = showAdvancedFields ? FILTER_DocumentFieldChange_ALL_PUBLIC_FIELDS : FILTER_DocumentFieldChange_BASIC_PUBLIC_FIELDS;

final Set<String> dataFieldNamesSet = Check.isEmpty(dataFieldsListStr, true) ? ImmutableSet.of() : ImmutableSet.copyOf(FIELDS_LIST_SPLITTER.splitToList(dataFieldsListStr));
final Set<String> dataFieldNamesSet = Check.isEmpty(showOnlyFieldsListStr, true) ? ImmutableSet.of() : ImmutableSet.copyOf(FIELDS_LIST_SPLITTER.splitToList(showOnlyFieldsListStr));
if (dataFieldNamesSet.isEmpty() || dataFieldNamesSet.contains("*"))
{
return filter;
Expand Down
Expand Up @@ -53,7 +53,7 @@ public static JSONIncludedTabInfo newInstance(final DetailId tabId)
return new JSONIncludedTabInfo(tabId);
}

@JsonProperty("tabid")
@JsonProperty("tabId")
private final String tabIdJson;
@JsonIgnore
private final DetailId tabId;
Expand Down Expand Up @@ -121,16 +121,11 @@ public void setAllowDelete(final boolean allowDelete, final String reason)
allowDeleteReason = reason;
}

public void setStale()
public void markAllRowsStaled()
{
stale = Boolean.TRUE;
}

public boolean isStale()
{
return stale != null && stale.booleanValue();
}

public void staleRows(@NonNull final DocumentIdsSelection rowIds)
{
if (rowIds.isEmpty())
Expand All @@ -140,14 +135,11 @@ public void staleRows(@NonNull final DocumentIdsSelection rowIds)
}
else if (rowIds.isAll())
{
setStale();
markAllRowsStaled();
}
else
{
staleRowIds.addAll(rowIds.toSet());

// FIXME: atm staling included rows is not supported on frontend, so we are invalidating the whole tab.
setStale();
}
}

Expand Down
Expand Up @@ -115,11 +115,6 @@ public void staleRootDocument(final WindowId windowId, final DocumentId document
forCollector(collector -> collector.staleRootDocument(windowId, documentId));
}

public void staleTab(final WindowId windowId, final DocumentId documentId, final DetailId tabId)
{
forCollector(collector -> collector.staleTab(windowId, documentId, tabId));
}

public void staleTabs(final WindowId windowId, final DocumentId documentId, final Set<DetailId> tabIds)
{
forCollector(collector -> collector.staleTabs(windowId, documentId, tabIds));
Expand Down
Expand Up @@ -5,8 +5,6 @@
import java.util.Map;
import java.util.Objects;

import javax.annotation.Nullable;

import org.adempiere.exceptions.AdempiereException;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
Expand Down Expand Up @@ -59,35 +57,20 @@
*
*/
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
@ToString
@EqualsAndHashCode
@ToString
final class JSONDocumentChangedWebSocketEvent implements WebsocketEndpointAware
{
public static JSONDocumentChangedWebSocketEvent rootDocument(final WindowId windowId, final DocumentId documentId)
{
final String tabId = null;
final DocumentId rowId = null;
return new JSONDocumentChangedWebSocketEvent(windowId, documentId, tabId, rowId);
return new JSONDocumentChangedWebSocketEvent(windowId, documentId);
}

@JsonProperty("windowId")
private final WindowId windowId;

@JsonProperty("id")
private final DocumentId documentId;

@JsonProperty("tabId")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private final String tabId;
//
@JsonProperty("tabid")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Deprecated
private final String tabid;

@JsonProperty("rowId")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private final DocumentId rowId;
private final DocumentId id;

/** Event's timestamp. */
@JsonProperty("timestamp")
Expand All @@ -101,31 +84,22 @@ public static JSONDocumentChangedWebSocketEvent rootDocument(final WindowId wind
/** {@link JSONIncludedTabInfo}s indexed by tabId */
@JsonProperty("includedTabsInfo")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
// @JsonSerialize(using = JsonMapAsValuesListSerializer.class) // serialize as Map (see #288)
private Map<String, JSONIncludedTabInfo> includedTabsInfoByTabId;

private JSONDocumentChangedWebSocketEvent(
@NonNull final WindowId windowId,
@NonNull final DocumentId id,
@Nullable final String tabId,
@Nullable final DocumentId rowId)
@NonNull final DocumentId id)
{
this.windowId = windowId;
this.documentId = id;
this.tabId = tabId;
tabid = tabId;
this.rowId = rowId;
this.id = id;

timestamp = DateTimeConverters.toJson(SystemTime.asInstant(), SystemTime.zoneId());
}

private JSONDocumentChangedWebSocketEvent(JSONDocumentChangedWebSocketEvent from)
private JSONDocumentChangedWebSocketEvent(@NonNull final JSONDocumentChangedWebSocketEvent from)
{
windowId = from.windowId;
documentId = from.documentId;
tabId = from.tabId;
tabid = from.tabid;
rowId = from.rowId;
id = from.id;
timestamp = from.timestamp;

stale = from.stale;
Expand All @@ -142,7 +116,7 @@ public JSONDocumentChangedWebSocketEvent copy()
return new JSONDocumentChangedWebSocketEvent(this);
}

void setStale()
void markRootDocumentAsStaled()
{
stale = Boolean.TRUE;
}
Expand Down Expand Up @@ -180,17 +154,12 @@ void addIncludedTabInfo(@NonNull final JSONIncludedTabInfo tabInfo)
@JsonIgnore
public String getWebsocketEndpoint()
{
return WebSocketConfig.buildDocumentTopicName(windowId, documentId);
}

public void staleTab(@NonNull final DetailId tabId)
{
getIncludedTabInfo(tabId).setStale();
return WebSocketConfig.buildDocumentTopicName(windowId, id);
}

public void staleTabs(@NonNull final Collection<DetailId> tabIds)
{
tabIds.stream().map(this::getIncludedTabInfo).forEach(JSONIncludedTabInfo::setStale);
tabIds.stream().map(this::getIncludedTabInfo).forEach(JSONIncludedTabInfo::markAllRowsStaled);
}

public void staleIncludedRows(@NonNull final DetailId tabId, @NonNull final DocumentIdsSelection rowIds)
Expand All @@ -201,9 +170,7 @@ public void staleIncludedRows(@NonNull final DetailId tabId, @NonNull final Docu
void mergeFrom(@NonNull final JSONDocumentChangedWebSocketEvent from)
{
if (!Objects.equals(windowId, from.windowId)
|| !Objects.equals(documentId, from.documentId)
|| !Objects.equals(tabId, from.tabId)
|| !Objects.equals(rowId, from.rowId))
|| !Objects.equals(id, from.id))
{
throw new AdempiereException("Cannot merge events because they are not matching")
.setParameter("from", from)
Expand Down
Expand Up @@ -83,7 +83,7 @@ private JSONDocumentChangedWebSocketEvent createEvent(final EventKey key)
public void staleRootDocument(final WindowId windowId, final DocumentId documentId)
{
final JSONDocumentChangedWebSocketEvent event = getCreateEvent(windowId, documentId);
event.setStale();
event.markRootDocumentAsStaled();
}

public void staleTab(final WindowId windowId, final DocumentId documentId, final DetailId tabId)
Expand Down

0 comments on commit fe5a7a3

Please sign in to comment.