All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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