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

net.intelie.liverig.plugin.widgets.DisplayUnitsService Maven / Gradle / Ivy

The newest version!
package net.intelie.liverig.plugin.widgets;

import net.intelie.live.EntityContext;
import net.intelie.live.LiveJson;
import net.intelie.live.SettingsNode;
import net.intelie.live.SettingsOptions;
import net.intelie.liverig.plugin.settings.SettingLogData;
import net.intelie.liverig.plugin.settings.SettingLogReader;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

public class DisplayUnitsService {
    private static final Logger LOGGER = LoggerFactory.getLogger(DisplayUnitsService.class);

    private static final String DISPLAY_UNITS_PATH = "display-units";
    private static final String ENTITIES_PATH = "display-units";
    private static final String ID_PATH = "display-units-id";

    private final SettingsNode entitiesSettings;
    private final SettingsNode idSettings;
    private final EntityContext entityContext;

    private Map cache = new ConcurrentHashMap<>();
    private Map> displayUnitDataCache = new ConcurrentHashMap<>();

    public DisplayUnitsService(@NotNull SettingsNode node, @NotNull EntityContext entityContext) {
        SettingsNode settingsHome = node.cd(DISPLAY_UNITS_PATH);
        this.entitiesSettings = settingsHome.cd(ENTITIES_PATH);
        this.idSettings = settingsHome.cd(ID_PATH);
        this.entityContext = entityContext;
    }

    @NotNull
    private SettingLogReader getSettingLogReader(@NotNull String id) {
        return new SettingLogReader(entityContext, entitiesSettings.cd(id));
    }

    @NotNull
    public Collection getLogsForId(@NotNull String id) {
        return getSettingLogReader(id).loggedSettingsExact().map(SettingLogData::new).collect(Collectors.toList());
    }

    public List getList() {
        return entitiesSettings.children().stream()
                .filter(Objects::nonNull)
                .map(s -> s.get(DisplayUnit.class))
                .collect(Collectors.toList());
    }

    public DisplayUnit get(@NotNull String id) {
        return cache.computeIfAbsent(id, (key) -> entitiesSettings.cd(key).get(DisplayUnit.class));
    }

    Map getDisplayUnitDataForMnemonic(String id, String mnemonic) {
        return displayUnitDataCache.computeIfAbsent(id, (idKey) -> new ConcurrentHashMap<>()).computeIfAbsent(mnemonic, (mnemonicKey) -> {
            DisplayUnitData dataForMnemonic = get(id).getDataForMnemonic(mnemonicKey);

            return LiveJson.fromJson(LiveJson.toJson(dataForMnemonic), Map.class);
        });
    }

    private void invalidateCache(@NotNull String id) {
        cache.remove(id);
        displayUnitDataCache.remove(id);
    }

    public Boolean delete(@NotNull String id) {
        DisplayUnit displayUnit = get(id);

        invalidateCache(id);
        entitiesSettings.cd(id).delete();

        return displayUnit != null;
    }

    public List getSimpleList() {
        return entitiesSettings.children().stream()
                .filter(Objects::nonNull)
                .map(s -> s.get(DisplayUnit.class)).filter(Objects::nonNull)
                .peek(s -> s.setData(null))
                .collect(Collectors.toList());
    }

    public DisplayUnit save(@NotNull DisplayUnit displayUnit) {
        if (displayUnit.getId() == null) {
            displayUnit.setId(nextId());
        }


        String id = displayUnit.getId().toString();
        SettingsNode cd = entitiesSettings.cd(id);
        cd.set(displayUnit);

        invalidateCache(id);
        cache.put(id, displayUnit);

        LOGGER.debug("Display unit saved: {}", displayUnit);

        return displayUnit;
    }

    @NotNull
    private Long nextId() {
        synchronized (idSettings) {
            return idSettings.withOptions(new SettingsOptions().enableLog(false), () -> {
                Long id = idSettings.get(Long.class);

                if (id == null || id == 0)
                    id = 1L;

                idSettings.set(id + 1);
                return id;
            });
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy