src/it/ht/rcs/console/system/view/frontend/Frontend.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:frontend="it.ht.rcs.console.system.view.frontend.*"
xmlns:graph="it.ht.rcs.console.system.view.frontend.graph.*"
width="100%"
height="100%"
addedToStage="onAddedToStage(event)"
creationComplete="init()"
removedFromStage="onRemovedFromStage(event)">
<fx:Script>
<![CDATA[
import it.ht.rcs.console.events.DataLoadedEvent;
import it.ht.rcs.console.monitor.controller.MonitorManager;
import it.ht.rcs.console.network.controller.CollectorManager;
import it.ht.rcs.console.network.model.Collector;
import it.ht.rcs.console.system.view.frontend.graph.NodeEvent;
import it.ht.rcs.console.system.view.frontend.graph.renderers.CollectorRenderer;
import it.ht.rcs.console.system.view.frontend.graph.renderers.DBRenderer;
import mx.collections.ArrayCollection;
import mx.collections.ListCollectionView;
import mx.managers.DragManager;
import mx.managers.PopUpManager;
[Bindable]
public var collectors:ListCollectionView;
[Bindable]
private var anonymizers:ListCollectionView;
private var nodes:Vector.<CollectorRenderer>;
private function init():void
{
refreshView();
}
private function onAddedToStage(event:Event):void
{
MonitorManager.instance.addEventListener(DataLoadedEvent.DATA_LOADED, onMonitorRefresh);
CollectorManager.instance.addEventListener(DataLoadedEvent.DATA_LOADED, refreshView);
CollectorManager.instance.refresh()
CollectorManager.instance.listenRefresh();
CollectorManager.instance.listenPush()
}
private function onRemovedFromStage(event:Event):void
{
MonitorManager.instance.removeEventListener(DataLoadedEvent.DATA_LOADED, onMonitorRefresh);
CollectorManager.instance.removeEventListener(DataLoadedEvent.DATA_LOADED, refreshView);
CollectorManager.instance.unlistenRefresh();
CollectorManager.instance.unlistenPush()
}
private function onMonitorRefresh(e:DataLoadedEvent):void
{
if (!DragManager.isDragging)
buildGraph();
}
private function refreshView(event:DataLoadedEvent=null):void
{
collectors=CollectorManager.instance.getView();
anonymizers=CollectorManager.instance.getView();
var i:int=0;
//Chain root - collectors
var roots:ArrayCollection=new ArrayCollection();
//Hash with anonimyzer and their check value
var toCheck:Dictionary=new Dictionary;
//By deafult every anonymizer check value is false
for (i=0; i < anonymizers.length; i++)
{
toCheck[anonymizers[i]]=false;
}
//get collectors
for (i=0; i < collectors.length; i++)
{
var item:Collector=anonymizers[i] as Collector;
if (item.type == 'local')
{
roots.addItem(item)
}
}
//Starting with collectors check every connected node
for (i=0; i < roots.length; i++)
{
var root:Collector=roots[i] as Collector;
var currentNode:Collector=root;
//collector
toCheck[currentNode]=true;
//loop connected nodes
while (currentNode && currentNode.next && currentNode.next[0] != null)
{
currentNode=getCollectorById(currentNode.next[0], anonymizers);
var safe:Boolean= currentNode==null? false: checkConnection(currentNode)
if(currentNode) toCheck[currentNode]=safe;
}
}
//If user has permissions update data to fix unconsistency
if (Console.currentSession.user.is_sys_frontend())
{
for (i=0; i < anonymizers.length; i++)
{
if(anonymizers[i].next==null)
anonymizers[i].next=new ArrayCollection([null]);
if(anonymizers[i].prev==null)
anonymizers[i].prev=new ArrayCollection([null]);
var nextNode:Collector=getCollectorById(anonymizers[i].next[0], anonymizers)
var prevNode:Collector=getCollectorById(anonymizers[i].prev[0], anonymizers)
if ((anonymizers[i].next[0] != null && nextNode!=null && nextNode.prev[0] != anonymizers[i]._id) || nextNode==null)
{
anonymizers[i].next[0]=null
}
if(prevNode==null)
{
item=anonymizers[i] as Collector
item.prev=new ArrayCollection([null])
}
if(nextNode==null)
{
item=anonymizers[i] as Collector
item.next=new ArrayCollection([null])
}
if (!toCheck[anonymizers[i]])
{
item=anonymizers[i] as Collector
item.prev=new ArrayCollection([null])
item.next=new ArrayCollection([null])
}
}
}
//Finally Render the view
anonymizers.filterFunction=anonymizerFilterFunction;
anonymizers.refresh();
buildGraph();
}
private function checkConnection(node:Collector):Boolean
{
var prevNode:Collector=getCollectorById(node.prev[0], anonymizers)
if ((node.prev[0] != null && node.prev[0] == prevNode._id))
{
return true;
}
return false;
}
private function anonymizerFilterFunction(item:Object):Boolean
{
return item.type == 'remote' && item.prev[0] == null && item.next[0] == null;
}
public function buildGraph():void
{
nodes=new Vector.<CollectorRenderer>(); //all
for each (var el:Collector in collectors)
{
var cr:CollectorRenderer=new CollectorRenderer(el, graph);
nodes.push(cr);
}
var renderers:Vector.<CollectorRenderer>=new Vector.<CollectorRenderer>(); //collectors
for each (var node:CollectorRenderer in nodes)
{
if (node.collector.type == 'local')
{
renderers.push(node);
}
var nextHop:CollectorRenderer=node.collector.next ? getRendererById(node.collector.next[0], nodes) : null;
node.nextHop=nextHop;
}
var db:DBRenderer=new DBRenderer();
db.collectors=renderers;
if(graph)
{
graph.db=db;
graph.dirty=true;
graph.rebuildGraph();
}
}
private function getRendererById(_id:String, list:Vector.<CollectorRenderer>):CollectorRenderer
{
if (_id != null)
{
for each (var cr:CollectorRenderer in list)
if (cr.collector._id == _id)
return cr;
}
return null;
}
private function getCollectorById(_id:String, list:ListCollectionView):Collector
{
if (_id != null)
{
for each (var c:Collector in list)
if (c._id == _id)
return c;
}
return null;
}
private function editCollector(collector:Collector):void
{
var popup:EditCollectorForm=PopUpManager.createPopUp(this.parentDocument as DisplayObject, EditCollectorForm, true) as EditCollectorForm;
popup.collector=collector;
PopUpManager.centerPopUp(popup);
}
private function enter(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.ENTER && list.selectedItem != null)
editCollector(list.selectedItem);
}
private function onListClick(event:*):void
{
graph.removeSelection();
if (list.selectedItem)
actionBar.selectedObject=list.selectedItem;
}
private function onNodeSelection(event:NodeEvent):void
{
if (event.collector != null)
list.selectedItem=null;
actionBar.selectedObject=event.collector;
}
]]>
</fx:Script>
<frontend:FrontendActionBar id="actionBar" graph="{graph}" collectors="{collectors}" />
<s:BorderContainer width="100%"
height="100%"
borderColor="#E3E6EC"
borderVisible="true"
borderWeight="2"
cornerRadius="10">
<s:backgroundFill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="#E3E6EC"/>
<s:GradientEntry color="#ffffff"/>
<s:GradientEntry color="#ffffff"/>
</s:LinearGradient>
</s:backgroundFill>
<s:VGroup width="100%"
height="100%"
gap="0"
horizontalAlign="center">
<frontend:CollectorList id="list"
click="onListClick(event)"
dataProvider="{anonymizers}"
keyDown="enter(event)" change="onListClick(event)"/>
<frontend:Separator width="90%"/>
<s:Scroller id="scroller"
width="100%"
height="100%">
<graph:FrontendGraph id="graph"
nodeSelected="onNodeSelection(event)"/>
</s:Scroller>
</s:VGroup>
</s:BorderContainer>
</s:VGroup>