/* * Copyright (C) 2016 NAUMEN. All rights reserved. * * This file may be distributed and/or modified under the terms of the * GNU General Public License version 2 as published by the Free Software * Foundation and appearing in the file LICENSE.GPL included in the * packaging of this file. * */ package ru.naumen.servacc.activechannel; import java.util.ArrayList; import java.util.List; import ru.naumen.servacc.activechannel.i.ActiveChannelsObservable; import ru.naumen.servacc.activechannel.i.ActiveChannelsObserver; import ru.naumen.servacc.activechannel.i.IActiveChannel; import ru.naumen.servacc.activechannel.i.IActiveChannelThrough; import ru.naumen.servacc.activechannel.i.IHidableChannel; import ru.naumen.servacc.activechannel.tasks.ActualizeActiveChannelsTask; import ru.naumen.servacc.activechannel.visitors.ActualizeActiveChannelVisitor; import ru.naumen.servacc.activechannel.visitors.HideActiveChannelVisitor; import ru.naumen.servacc.activechannel.visitors.IActiveChannelVisitor; import ru.naumen.servacc.config2.Group; import ru.naumen.servacc.config2.i.IConfigItem; /** * @author vtarasov * @since 16.02.16 */ public class ActiveChannelsRegistry extends Group implements ActiveChannelsObservable { private ActiveChannelsObserver observer = new ActiveChannelsObserver() { @Override public void activeChannelsChanged() {} }; private boolean running = true; public ActiveChannelsRegistry() { super("Active channels", null); new ActualizeActiveChannelsTask(this).start(); } @Override public boolean matches(String filter) { return true; } @Override public boolean isAutoExpanded() { return false; } @Override public String getIconName() { return "/icons/active-channels.png"; } public void saveChannel(List<String> path, IActiveChannel channel) { if (existsChannel(path)) { return; } if (channel.getParent() == null) { getChildren().add(channel); } else { channel.getParent().addChild(channel); } notifyObserver(); } public void deleteChannel(List<String> path) { IActiveChannel channel = findChannel(path); if (channel == null) { return; } deleteChannel(channel); } public void deleteChannel(IActiveChannel channel) { if (channel.getParent() == null) { getChildren().remove(channel); } else { channel.getParent().removeChild(channel); } notifyObserver(); } public boolean existsChannel(List<String> path) { return findChannel(path) != null; } public IActiveChannelThrough findChannelThrough(List<String> path) { IActiveChannel channel = findChannel(path); if (channel instanceof IActiveChannelThrough) { return (IActiveChannelThrough)channel; } return null; } public IActiveChannel findChannel(List<String> path) { List<IActiveChannel> channels = new ArrayList<>(); for (IConfigItem item : getChildren()) { channels.add((IActiveChannel)item); } int childIndex = 0; int childrenLevel = 0; while (childIndex < channels.size()) { if (childrenLevel == path.size()) { return null; } IActiveChannel channel = channels.get(childIndex); if (channel instanceof IHidableChannel && ((IHidableChannel)channel).isHidden()) { childIndex++; continue; } if (path.get(childrenLevel).equals(channel.getId())) { if (childrenLevel == path.size() - 1) { return channel; } if (!(channel instanceof IActiveChannelThrough)) { return null; } channels = ((IActiveChannelThrough)channel).getChildren(); childIndex = 0; childrenLevel++; continue; } childIndex++; } return null; } public void hideAllChannels() { forEachActiveChannel(new HideActiveChannelVisitor()); } public void actualizeAllChannels() { forEachActiveChannel(new ActualizeActiveChannelVisitor()); } private void forEachActiveChannel(IActiveChannelVisitor visitor) { new ArrayList<IConfigItem>(getChildren()).forEach((IConfigItem t) -> visitor.visit((IActiveChannel) t)); } @Override public void setObserver(ActiveChannelsObserver observer) { this.observer = observer; } @Override public void notifyObserver() { observer.activeChannelsChanged(); } public void finish() { running = false; } public boolean isRunning() { return running; } }