protected void setupModifiedTracking() { DataContext dataContext = getScreenData().getDataContext(); if (dataContext != null) { dataContext.addChangeListener(this::editedEntityModified); dataContext.addPostCommitListener(this::editedEntityCommitted); } }
protected <E extends Entity> E getCommittedEntity(EditorScreen<E> editorScreen, @Nullable DataContext parentDataContext) { E editedEntity = editorScreen.getEditedEntity(); if (parentDataContext != null) { E trackedEntity = parentDataContext.find(editedEntity); if (trackedEntity != null) // makes sense for NoopDataContext return trackedEntity; } return editedEntity; }
protected boolean isEntityModifiedInParentContext() { boolean result = false; DataContext parentDc = getScreenData().getDataContext().getParent(); while (!result && parentDc != null) { result = isEntityModifiedRecursive(entityToEdit, parentDc, new HashSet<>()); parentDc = parentDc.getParent(); } return result; }
@Override public void load() { if (container == null) throw new IllegalStateException("container is null"); if (query == null && delegate == null) throw new IllegalStateException("both query and delegate are null"); LoadContext<E> loadContext = createLoadContext(); List<E> list; if (delegate == null) { list = getDataManager().loadList(loadContext); } else { list = delegate.apply(loadContext); } if (dataContext != null) { List<E> mergedList = new ArrayList<>(list.size()); for (E entity : list) { mergedList.add(dataContext.merge(entity)); } container.setItems(mergedList); } else { container.setItems(list); } }
protected boolean isEntityModifiedRecursive(Entity entity, DataContext dataContext, HashSet<Object> visited) { if (visited.contains(entity)) { return false; } visited.add(entity); if (dataContext.isModified(entity) || dataContext.isRemoved(entity)) return true; for (MetaProperty property : entity.getMetaClass().getProperties()) { if (property.getRange().isClass()) { if (getEntityStates().isLoaded(entity, property.getName())) { Object value = entity.getValue(property.getName()); if (value != null) { if (value instanceof Collection) { for (Object item : ((Collection) value)) { if (isEntityModifiedRecursive((Entity) item, dataContext, visited)) { return true; } } } else { if (isEntityModifiedRecursive((Entity) value, dataContext, visited)) { return true; } } } } } } return false; }
protected void commitIfNeeded(Collection<? extends Entity> entitiesToRemove, CollectionContainer container, ScreenData screenData) { boolean needCommit = true; if (container instanceof Nested) { InstanceContainer masterContainer = ((Nested) container).getMaster(); String property = ((Nested) container).getProperty(); MetaClass masterMetaClass = masterContainer.getEntityMetaClass(); MetaProperty metaProperty = masterMetaClass.getPropertyNN(property); needCommit = metaProperty.getType() != MetaProperty.Type.COMPOSITION; } if (needCommit) { CommitContext commitContext = new CommitContext(); for (Entity entity : entitiesToRemove) { commitContext.addInstanceToRemove(entity); } dataManager.commit(commitContext); for (Entity entity : entitiesToRemove) { screenData.getDataContext().evict(entity); } } else { for (Entity entity : entitiesToRemove) { screenData.getDataContext().remove(entity); } } }
/** * Validates screen and commits data context. * * @return operation result */ protected OperationResult commitChanges() { ValidationErrors validationErrors = validateScreen(); if (!validationErrors.isEmpty()) { ScreenValidation screenValidation = getBeanLocator().get(ScreenValidation.class); screenValidation.showValidationErrors(this, validationErrors); return OperationResult.fail(); } getScreenData().getDataContext().commit(); return OperationResult.success(); }
@Override public boolean hasUnsavedChanges() { if (isReadOnly()) { return false; } return isEntityModified() && getScreenData().getDataContext().hasChanges(); }
/** * Method invoked when clicking the Cancel button, discards changes and disables controls for editing. */ public void discardChanges() { releaseLock(); getScreenData().getDataContext().evict(getEditContainer().getItem()); getEditContainer().setItem(null); T selectedItem = getBrowseContainer().getItemOrNull(); if (selectedItem != null) { View view = getEditContainer().getView(); boolean loadDynamicAttributes = getEditLoader().isLoadDynamicAttributes(); T reloadedItem = getBeanLocator().get(DataManager.class) .reload(selectedItem, view, null, loadDynamicAttributes); getBrowseContainer().setItem(reloadedItem); } disableEditControls(); }
@Override public void load() { if (container == null) throw new IllegalStateException("container is null"); if (query == null) throw new IllegalStateException("query is null"); ValueLoadContext loadContext = createLoadContext(); Collection<KeyValueEntity> list; if (delegate == null) { list = getDataManager().loadValues(loadContext); } else { list = delegate.apply(loadContext); } // TODO merge KeyValueEntity ??? if (dataContext != null) { for (KeyValueEntity entity : list) { dataContext.merge(entity); } } container.setItems(list); }
/** * Method invoked when clicking on the Ok button after editing an existing or creating a new record. */ public void saveChanges() { if (!editing) return; ValidationErrors validationErrors = validateEditorForm(); if (!validationErrors.isEmpty()) { ScreenValidation screenValidation = getBeanLocator().get(ScreenValidation.class); screenValidation.showValidationErrors(this, validationErrors); return; } getScreenData().getDataContext().commit(); T editedItem = getEditContainer().getItem(); if (creating) { getBrowseContainer().getMutableItems().add(0, editedItem); } else { getBrowseContainer().replaceItem(editedItem); } getTable().setSelected(editedItem); releaseLock(); disableEditControls(); }
if (CollectionUtils.isEmpty(oldValue) || !oldValue.contains(v)) { Entity entity = (Entity) v; dataContext.merge(entity) .setValue(inverseProperty.getName(), getItem()); if (CollectionUtils.isEmpty(newValue) || !newValue.contains(v)) { Entity entity = (Entity) v; dataContext.merge(entity) .setValue(inverseProperty.getName(), null);
@Override public void load() { if (container == null) throw new IllegalStateException("container is null"); E entity; if (delegate == null) { if (!needLoad()) return; LoadContext<E> loadContext = createLoadContext(); entity = getDataManager().load(loadContext); if (entity == null) { throw new EntityAccessException(container.getEntityMetaClass(), entityId); } } else { entity = delegate.apply(createLoadContext()); } if (dataContext != null) { entity = dataContext.merge(entity); } container.setItem(entity); }
if (!collectionDc.containsItem(item.getId())) { E mergedItem = dataContext.merge(item); if (initializeMasterReference) {
T mergedEntity = getScreenData().getDataContext().merge(entityToEdit);
createAction.withHandler(actionPerformedEvent -> { T entity = getBeanLocator().get(Metadata.class).create(getEntityClass()); T trackedEntity = getScreenData().getDataContext().merge(entity);