hackedteam/rcs-console

View on GitHub
src/it/ht/rcs/console/system/view/frontend/Frontend.mxml

Summary

Maintainability
Test Coverage
<?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>