fr.ird.observe.client.form.spi.FormUIContext Maven / Gradle / Ivy
package fr.ird.observe.client.form.spi;
/*-
* #%L
* ObServe Toolkit :: Common Client
* %%
* Copyright (C) 2008 - 2017 IRD, Ultreia.io
* %%
* 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 3 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 should have received a copy of the GNU General Public
* License along with this program. If not, see
* .
* #L%
*/
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import fr.ird.observe.client.form.FormUIModel;
import fr.ird.observe.client.form.spi.update.BeanComboBoxUpdater;
import fr.ird.observe.client.form.spi.update.BeanListHeaderUpdater;
import fr.ird.observe.client.form.spi.update.FilterableDoubleListUpdater;
import fr.ird.observe.dto.IdDto;
import fr.ird.observe.dto.data.DataDto;
import fr.ird.observe.dto.form.FormDefinition;
import fr.ird.observe.dto.reference.DataDtoReference;
import fr.ird.observe.dto.reference.DataDtoReferenceSet;
import fr.ird.observe.dto.reference.DtoReferenceCollection;
import fr.ird.observe.dto.reference.DtoReferenceDefinition;
import fr.ird.observe.dto.reference.ReferentialDtoReference;
import fr.ird.observe.dto.reference.ReferentialDtoReferenceDefinition;
import fr.ird.observe.dto.reference.ReferentialDtoReferenceSet;
import fr.ird.observe.dto.referential.ReferentialDto;
import fr.ird.observe.services.service.referential.ReferentialDtoCacheManager;
import fr.ird.observe.spi.map.ImmutableDtoMap;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import javax.swing.AbstractButton;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.jaxx.runtime.swing.TabInfo;
import org.nuiton.jaxx.widgets.datetime.DateTimeEditor;
import org.nuiton.jaxx.widgets.gis.absolute.CoordinatesEditor;
import org.nuiton.jaxx.widgets.select.BeanComboBox;
import org.nuiton.jaxx.widgets.select.BeanListHeader;
import org.nuiton.jaxx.widgets.select.FilterableDoubleList;
/**
* Created by tchemit on 29/09/17.
*
* @author Tony Chemit - [email protected]
*/
public class FormUIContext {
/** Logger. */
private static final Log log = LogFactory.getLog(FormUIContext.class);
private final ImmutableMap beanComboBoxMap;
private final ImmutableMap beanListHeaderMap;
private final ImmutableMap filterableDoubleListMap;
private final ImmutableMap actionMap;
private final ImmutableMap dateTimeEditorMap;
private final ImmutableMap coordinatesEditorMap;
private final ImmutableSet tabModelSet;
private final Map referentialFilters;
private final BeanComboBoxUpdater beanComboBoxUpdater;
private final BeanListHeaderUpdater beanListHeaderUpdater;
private final FilterableDoubleListUpdater filterableDoubleListUpdater;
private ImmutableMap> referentialReferenceSetsByPropertyName = ImmutableMap.of();
private ImmutableMap> dataReferenceSetsByPropertyName = ImmutableMap.of();
FormUIContext(ImmutableMap beanComboBoxMap,
ImmutableMap beanListHeaderMap,
ImmutableMap filterableDoubleListMap,
ImmutableMap actionMap,
ImmutableMap dateTimeEditorMap,
ImmutableMap coordinatesEditorMap,
ImmutableSet tabModelSet,
ImmutableMap referentialFilters) {
this.beanComboBoxMap = beanComboBoxMap.isEmpty() ? null : beanComboBoxMap;
this.beanListHeaderMap = beanListHeaderMap.isEmpty() ? null : beanListHeaderMap;
this.filterableDoubleListMap = filterableDoubleListMap.isEmpty() ? null : filterableDoubleListMap;
this.actionMap = actionMap.isEmpty() ? null : actionMap;
this.dateTimeEditorMap = dateTimeEditorMap.isEmpty() ? null : dateTimeEditorMap;
this.coordinatesEditorMap = coordinatesEditorMap.isEmpty() ? null : coordinatesEditorMap;
this.tabModelSet = tabModelSet.isEmpty() ? null : tabModelSet;
this.beanComboBoxUpdater = new BeanComboBoxUpdater<>();
this.beanListHeaderUpdater = new BeanListHeaderUpdater<>();
this.filterableDoubleListUpdater = new FilterableDoubleListUpdater<>();
this.referentialFilters = referentialFilters;
}
public Optional> getBeanComboBoxMap() {
return Optional.ofNullable(beanComboBoxMap);
}
public Optional> getBeanListHeaderMap() {
return Optional.ofNullable(beanListHeaderMap);
}
public Optional> getFilterableDoubleListMap() {
return Optional.ofNullable(filterableDoubleListMap);
}
public Optional> getActionMap() {
return Optional.ofNullable(actionMap);
}
public Optional> getDateTimeEditorMap() {
return Optional.ofNullable(dateTimeEditorMap);
}
public Optional> getCoordinatesEditorMap() {
return Optional.ofNullable(coordinatesEditorMap);
}
public Optional> getTabModelSet() {
return Optional.ofNullable(tabModelSet);
}
public Map getReferentialFilters() {
return referentialFilters;
}
public BeanComboBoxUpdater getBeanComboBoxUpdater() {
return beanComboBoxUpdater;
}
public BeanListHeaderUpdater getBeanListHeaderUpdater() {
return beanListHeaderUpdater;
}
public FilterableDoubleListUpdater getFilterableDoubleListUpdater() {
return filterableDoubleListUpdater;
}
protected > ReferentialDtoReferenceSet filterReferentialReferenceSet(String propertyName, DtoReferenceDefinition propertyDefinition,
ReferentialDtoReferenceSet incomingReferentialReferenceSet) {
Class dtoType = propertyDefinition.getDtoType();
LinkedList incomingReferences = Lists.newLinkedList(incomingReferentialReferenceSet.toSet());
Iterable filteredReferentialReferences = filterReferentialReferences(dtoType, propertyName, incomingReferences);
ImmutableSet references1 = ImmutableSet.copyOf(filteredReferentialReferences);
return ReferentialDtoReferenceSet.of(incomingReferentialReferenceSet.getType(), references1, incomingReferentialReferenceSet.getLastUpdate());
}
private > Collection filterReferentialReferences(Class dtoType, String propertyName, LinkedList incomingReferences) {
log.debug(String.format("Filter referential references (type %s - property %s), original size: %d", dtoType.getSimpleName(), propertyName, incomingReferences.size()));
// by default always remove obsolete references
List referentialReferences = DtoReferenceCollection.filterEnabled(incomingReferences);
log.debug(String.format("Filter referential references (type %s - property %s), without diabled size: %d", dtoType.getSimpleName(), propertyName, incomingReferences.size()));
//noinspection unchecked
ReferentialReferencesFilter referentialReferencesFilter = referentialFilters.get(propertyName);
if (referentialReferencesFilter != null) {
return referentialReferencesFilter.filter(referentialReferences);
}
return referentialReferences;
}
public List getReferentialReferences(String name) {
ReferentialDtoReferenceSet referentialReferenceSet = getReferentialReferenceSet(name);
return new LinkedList<>(referentialReferenceSet.toSet());
}
public > List getDataReferences(String name) {
DataDtoReferenceSet referentialReferenceSet = getDataReferenceSet(name);
return new LinkedList<>(referentialReferenceSet.toSet());
}
public > Optional tryGetReferentialReferenceById(String name, String id) {
ReferentialDtoReferenceSet referenceSet = getReferentialReferenceSet(name);
return referenceSet.tryGetReferenceById(id);
}
public > Optional> tryToGetReferentialReferenceSet(String propertyName) {
ReferentialDtoReferenceSet referenceSet = getReferentialReferenceSet(propertyName);
Set references = null;
if (referenceSet != null) {
references = referenceSet.toSet();
}
return Optional.ofNullable(references);
}
@SuppressWarnings("unchecked")
private > ReferentialDtoReferenceSet getReferentialReferenceSet(String propertyName) {
ReferentialDtoReferenceSet referenceSet = referentialReferenceSetsByPropertyName.get(propertyName);
Objects.requireNonNull(referenceSet, "Could not find referentialRefenceSet named " + propertyName);
return referenceSet;
}
@SuppressWarnings("unchecked")
private > DataDtoReferenceSet getDataReferenceSet(String propertyName) {
DataDtoReferenceSet referenceSet = dataReferenceSetsByPropertyName.get(propertyName);
Objects.requireNonNull(referenceSet, "Could not find dataReferenceSet named " + propertyName);
return (DataDtoReferenceSet) referenceSet;
}
public static class Builder {
private final ImmutableMap.Builder beanComboBoxMapBuilder = ImmutableMap.builder();
private final ImmutableMap.Builder beanListHeaderMapBuilder = ImmutableMap.builder();
private final ImmutableMap.Builder filterableDoubleListMapBuilder = ImmutableMap.builder();
private final ImmutableMap.Builder actionMapBuilder = ImmutableMap.builder();
private final ImmutableMap.Builder dateTimeEditorMapBuilder = ImmutableMap.builder();
private final ImmutableMap.Builder coordinatesEditorMapBuilder = ImmutableMap.builder();
private final ImmutableSet.Builder tabModelSetBuilder = ImmutableSet.builder();
private final ImmutableMap.Builder referentialFiltersBuilder = ImmutableMap.builder();
public Builder register(BeanComboBox component) {
beanComboBoxMapBuilder.put(component.getName(), component);
return this;
}
public Builder register(BeanListHeader component) {
beanListHeaderMapBuilder.put(component.getName(), component);
return this;
}
public Builder register(FilterableDoubleList component) {
filterableDoubleListMapBuilder.put(component.getName(), component);
return this;
}
public Builder register(AbstractButton component) {
actionMapBuilder.put(component.getName(), component);
return this;
}
public Builder register(DateTimeEditor component) {
dateTimeEditorMapBuilder.put(component.getName(), component);
return this;
}
public Builder register(CoordinatesEditor component) {
coordinatesEditorMapBuilder.put(component.getName(), component);
return this;
}
public Builder register(TabInfo component) {
tabModelSetBuilder.add(component);
return this;
}
public Builder addReferentialFilter(String propertyName, ReferentialReferencesFilter filter) {
referentialFiltersBuilder.put(propertyName, filter);
return this;
}
public FormUIContext build() {
return new FormUIContext(
beanComboBoxMapBuilder.build(),
beanListHeaderMapBuilder.build(),
filterableDoubleListMapBuilder.build(),
actionMapBuilder.build(),
dateTimeEditorMapBuilder.build(),
coordinatesEditorMapBuilder.build(),
tabModelSetBuilder.build(),
referentialFiltersBuilder.build());
}
}
public void loadFormDependencies(ReferentialDtoCacheManager cacheManager, FormDefinition formDefinition, boolean clear) {
if (formDefinition == null) {
return;
}
Class dtoType = formDefinition.getType();
ImmutableMap.Builder> modelReferentialReferenceSets = ImmutableMap.builder();
if (!clear) {
modelReferentialReferenceSets.putAll(referentialReferenceSetsByPropertyName);
}
log.debug(String.format("Update referential reference sets for: %s", dtoType.getName()));
ImmutableDtoMap> referentialReferenceSetsByType = cacheManager.updateReferentialReferenceSetsCache(dtoType);
for (Map.Entry> entry : formDefinition.getProperties().entrySet()) {
String propertyName = entry.getKey();
ReferentialDtoReferenceDefinition definition = entry.getValue();
ReferentialDtoReferenceSet referentialReferenceSet = referentialReferenceSetsByType.get(definition.getType());
ReferentialDtoReferenceSet filteredReferentialReferenceSet = filterReferentialReferenceSet(propertyName, definition, referentialReferenceSet);
modelReferentialReferenceSets.put(propertyName, filteredReferentialReferenceSet);
}
this.referentialReferenceSetsByPropertyName = modelReferentialReferenceSets.build();
}
public void updateUi(FormUIModel model) {
beanComboBoxUpdater.update(model);
beanListHeaderUpdater.update(model);
filterableDoubleListUpdater.update(model);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy