This commit is contained in:
WickedJack99
2024-01-13 01:05:35 +01:00
parent 2d8672aab0
commit 43d4ccf179
126 changed files with 2719 additions and 1061 deletions

View File

@@ -0,0 +1,427 @@
<mxfile host="Electron" modified="2024-01-07T09:13:08.243Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.16 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="_bvHm9ioVpy3Jx4YFCDc" version="22.1.16" type="device" pages="3">
<diagram name="Page-1" id="FHZ-RDlm81MId5-1I50H">
<mxGraphModel dx="1114" dy="663" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="none" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="n1GnVWBW3RMSIi8rW6qm-1" value="View" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="40" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-1" value="Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-2" value="Controller" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-3" value="View Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-4" value="Presenter" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-14" value="Client" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="330" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-15" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-2" target="WrU0Sfet5MJkPbADlNtg-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="340" as="sourcePoint" />
<mxPoint x="340" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-16" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-15">
<mxGeometry x="0.1" y="1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-17" value="Server" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="509" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-14" target="WrU0Sfet5MJkPbADlNtg-17">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-19" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-18">
<mxGeometry x="0.05" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-20" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-17" target="WrU0Sfet5MJkPbADlNtg-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-21" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-20">
<mxGeometry x="-0.025" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-22" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-14" target="WrU0Sfet5MJkPbADlNtg-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="350" as="sourcePoint" />
<mxPoint x="520" y="300" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-24" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-22">
<mxGeometry x="-0.1" y="3" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-25" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-2" target="WrU0Sfet5MJkPbADlNtg-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="540" y="220" as="sourcePoint" />
<mxPoint x="630" y="220" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-30" value="View Event&lt;br&gt;Manager" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-31" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="n1GnVWBW3RMSIi8rW6qm-1" target="WrU0Sfet5MJkPbADlNtg-30">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="160" y="220" as="sourcePoint" />
<mxPoint x="240" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-32" value="Event" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-31">
<mxGeometry x="0.0286" y="-2" relative="1" as="geometry">
<mxPoint y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-33" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-30" target="WrU0Sfet5MJkPbADlNtg-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-34" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-30" target="WrU0Sfet5MJkPbADlNtg-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-3" value="Network Interface" style="endArrow=none;dashed=1;html=1;rounded=0;align=left;verticalAlign=bottom;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="425" y="420" as="sourcePoint" />
<mxPoint x="680" y="420" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-4" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="n1GnVWBW3RMSIi8rW6qm-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="160" as="sourcePoint" />
<mxPoint x="220" y="110" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-5" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="n1GnVWBW3RMSIi8rW6qm-1" target="WrU0Sfet5MJkPbADlNtg-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-6" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-2" target="WrU0Sfet5MJkPbADlNtg-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-7" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="WrU0Sfet5MJkPbADlNtg-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="340" y="300" as="sourcePoint" />
<mxPoint x="390" y="250" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-9" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="WrU0Sfet5MJkPbADlNtg-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="340" as="sourcePoint" />
<mxPoint x="220" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-10" value="Update&lt;br&gt;View&lt;br&gt;Model&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="WrU0Sfet5MJkPbADlNtg-2">
<mxGeometry x="0.2549" y="22" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-11" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="n1GnVWBW3RMSIi8rW6qm-1" target="WrU0Sfet5MJkPbADlNtg-30">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-12" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-30" target="WrU0Sfet5MJkPbADlNtg-4">
<mxGeometry x="-0.3333" y="10" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="LyT_7eZ8ZHafqnmZi-tR" name="Page-3">
<mxGraphModel dx="1114" dy="663" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="dZXWpN2tcvNV-OdXUMDU-1" value="View" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-2" value="Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-3" value="Controller" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-4" value="View Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-5" value="Presenter" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-6" value="Client" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="330" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-7" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-3" target="dZXWpN2tcvNV-OdXUMDU-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="340" as="sourcePoint" />
<mxPoint x="340" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-8" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-7">
<mxGeometry x="0.1" y="1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-9" value="Server" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="509" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-6" target="dZXWpN2tcvNV-OdXUMDU-9">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-11" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-10">
<mxGeometry x="0.05" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-12" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-9" target="dZXWpN2tcvNV-OdXUMDU-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-13" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-12">
<mxGeometry x="-0.025" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-14" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-6" target="dZXWpN2tcvNV-OdXUMDU-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="350" as="sourcePoint" />
<mxPoint x="520" y="300" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-15" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-14">
<mxGeometry x="-0.1" y="3" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-16" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-3" target="dZXWpN2tcvNV-OdXUMDU-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="540" y="220" as="sourcePoint" />
<mxPoint x="630" y="220" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-17" value="View Event&lt;br&gt;Manager" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-18" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-1" target="dZXWpN2tcvNV-OdXUMDU-17">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="160" y="220" as="sourcePoint" />
<mxPoint x="240" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-19" value="Event" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-18">
<mxGeometry x="0.0286" y="-2" relative="1" as="geometry">
<mxPoint y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-20" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-17" target="dZXWpN2tcvNV-OdXUMDU-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-21" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-17" target="dZXWpN2tcvNV-OdXUMDU-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-22" value="Network Interface" style="endArrow=none;dashed=1;html=1;rounded=0;align=left;verticalAlign=bottom;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="425" y="420" as="sourcePoint" />
<mxPoint x="680" y="420" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-23" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="160" as="sourcePoint" />
<mxPoint x="220" y="110" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-24" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-1" target="dZXWpN2tcvNV-OdXUMDU-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-25" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-3" target="dZXWpN2tcvNV-OdXUMDU-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-26" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="340" y="300" as="sourcePoint" />
<mxPoint x="390" y="250" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-27" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="340" as="sourcePoint" />
<mxPoint x="220" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-28" value="Update&lt;br&gt;View&lt;br&gt;Model&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-3">
<mxGeometry x="0.2549" y="22" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-29" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-1" target="dZXWpN2tcvNV-OdXUMDU-17">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-30" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-17" target="dZXWpN2tcvNV-OdXUMDU-5">
<mxGeometry x="-0.3333" y="10" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-31" value="&lt;font color=&quot;#121212&quot;&gt;Swing UI&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#647687;fontColor=#ffffff;strokeColor=#314354;" vertex="1" parent="1">
<mxGeometry x="40" y="260" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-32" value="&lt;font color=&quot;#121212&quot;&gt;Sender&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#647687;fontColor=#ffffff;strokeColor=#314354;" vertex="1" parent="1">
<mxGeometry x="550" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-33" value="&lt;font color=&quot;#121212&quot;&gt;Receiver&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#647687;fontColor=#ffffff;strokeColor=#314354;" vertex="1" parent="1">
<mxGeometry x="680" y="190" width="120" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="Qvqhu417yh47AELHSp99" name="Page-2">
<mxGraphModel dx="1114" dy="663" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="RjpXFJRHx75nK1sPjYBd-1" value="View" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-2" value="View Event&lt;br&gt;Manager" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-3" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="RjpXFJRHx75nK1sPjYBd-1" target="RjpXFJRHx75nK1sPjYBd-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="170" as="sourcePoint" />
<mxPoint x="240" y="120" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-4" value="Event" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="RjpXFJRHx75nK1sPjYBd-3">
<mxGeometry x="0.0286" y="-2" relative="1" as="geometry">
<mxPoint y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-5" value="Events:" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="40" y="160" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-6" value="Connect to Server Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="200" width="220" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-8" value="Alarm ID x got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="280" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-9" value="Active Connections Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="320" width="220" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-10" value="System Information Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="360" width="230" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-11" value="Requests Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="400" width="170" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-12" value="Cake Diagram Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="440" width="200" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-13" value="&lt;font color=&quot;#ff0000&quot;&gt;Montoring Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="238" width="110" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-14" value="&lt;font color=&quot;#ff0000&quot;&gt;Connect to Server Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="160" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-15" value="&lt;font color=&quot;#ff0000&quot;&gt;Controlling Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="160" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-16" value="NFTables Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="200" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-17" value="Add new Port Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="240" width="200" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-18" value="Logs Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="480" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-19" value="&lt;font color=&quot;#ff0000&quot;&gt;NFTables Family Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="320" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-20" value="Download Configuration got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="360" width="220" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-21" value="inet family Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="400" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-22" value="ipv4 family Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="440" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-23" value="ipv6 family Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="480" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-24" value="&lt;font color=&quot;#ff0000&quot;&gt;Status Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="520" width="90" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-25" value="Go to Monitoring Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="560" width="250" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-28" value="Go to Controlling Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="600" width="250" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-29" value="Go to Previous Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="640" width="240" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-30" value="Go to Next Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="680" width="220" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,430 @@
<mxfile host="Electron" modified="2024-01-07T09:16:47.650Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.16 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="2A-9a8xq9IaTpGp-kday" version="22.1.16" type="device" pages="3">
<diagram name="Page-1" id="FHZ-RDlm81MId5-1I50H">
<mxGraphModel dx="1114" dy="663" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="none" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="n1GnVWBW3RMSIi8rW6qm-1" value="View" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="40" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-1" value="Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-2" value="Controller" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-3" value="View Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-4" value="Presenter" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-14" value="Client" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="330" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-15" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-2" target="WrU0Sfet5MJkPbADlNtg-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="340" as="sourcePoint" />
<mxPoint x="340" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-16" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-15">
<mxGeometry x="0.1" y="1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-17" value="Server" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="509" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-14" target="WrU0Sfet5MJkPbADlNtg-17">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-19" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-18">
<mxGeometry x="0.05" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-20" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-17" target="WrU0Sfet5MJkPbADlNtg-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-21" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-20">
<mxGeometry x="-0.025" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-22" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-14" target="WrU0Sfet5MJkPbADlNtg-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="350" as="sourcePoint" />
<mxPoint x="520" y="300" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-24" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-22">
<mxGeometry x="-0.1" y="3" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-25" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-2" target="WrU0Sfet5MJkPbADlNtg-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="540" y="220" as="sourcePoint" />
<mxPoint x="630" y="220" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-30" value="View Event&lt;br&gt;Manager" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-31" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="n1GnVWBW3RMSIi8rW6qm-1" target="WrU0Sfet5MJkPbADlNtg-30">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="160" y="220" as="sourcePoint" />
<mxPoint x="240" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-32" value="Event" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="WrU0Sfet5MJkPbADlNtg-31">
<mxGeometry x="0.0286" y="-2" relative="1" as="geometry">
<mxPoint y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-33" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-30" target="WrU0Sfet5MJkPbADlNtg-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="WrU0Sfet5MJkPbADlNtg-34" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-30" target="WrU0Sfet5MJkPbADlNtg-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-3" value="Network Interface" style="endArrow=none;dashed=1;html=1;rounded=0;align=left;verticalAlign=bottom;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="425" y="420" as="sourcePoint" />
<mxPoint x="680" y="420" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-4" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="n1GnVWBW3RMSIi8rW6qm-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="160" as="sourcePoint" />
<mxPoint x="220" y="110" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-5" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="n1GnVWBW3RMSIi8rW6qm-1" target="WrU0Sfet5MJkPbADlNtg-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-6" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-2" target="WrU0Sfet5MJkPbADlNtg-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-7" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="WrU0Sfet5MJkPbADlNtg-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="340" y="300" as="sourcePoint" />
<mxPoint x="390" y="250" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-9" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="WrU0Sfet5MJkPbADlNtg-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="340" as="sourcePoint" />
<mxPoint x="220" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-10" value="Update&lt;br&gt;View&lt;br&gt;Model&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-4" target="WrU0Sfet5MJkPbADlNtg-2">
<mxGeometry x="0.2549" y="22" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-11" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="n1GnVWBW3RMSIi8rW6qm-1" target="WrU0Sfet5MJkPbADlNtg-30">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="CPFinyiwZevcR04kn2mn-12" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="WrU0Sfet5MJkPbADlNtg-30" target="WrU0Sfet5MJkPbADlNtg-4">
<mxGeometry x="-0.3333" y="10" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="LyT_7eZ8ZHafqnmZi-tR" name="Page-3">
<mxGraphModel dx="1114" dy="663" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="dZXWpN2tcvNV-OdXUMDU-1" value="View" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-2" value="Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-3" value="Controller" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-4" value="View Model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-5" value="Presenter" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-6" value="Client" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="330" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-7" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-3" target="dZXWpN2tcvNV-OdXUMDU-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="290" y="340" as="sourcePoint" />
<mxPoint x="340" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-8" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-7">
<mxGeometry x="0.1" y="1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-9" value="Server" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="425" y="509" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-6" target="dZXWpN2tcvNV-OdXUMDU-9">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-11" value="Request" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-10">
<mxGeometry x="0.05" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-12" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-9" target="dZXWpN2tcvNV-OdXUMDU-6">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="450" as="sourcePoint" />
<mxPoint x="520" y="400" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-13" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-12">
<mxGeometry x="-0.025" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-14" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-6" target="dZXWpN2tcvNV-OdXUMDU-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="470" y="350" as="sourcePoint" />
<mxPoint x="520" y="300" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-15" value="Response&lt;br&gt;Data" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-14">
<mxGeometry x="-0.1" y="3" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-16" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-3" target="dZXWpN2tcvNV-OdXUMDU-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="540" y="220" as="sourcePoint" />
<mxPoint x="630" y="220" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-17" value="View Event&lt;br&gt;Manager" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-18" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-1" target="dZXWpN2tcvNV-OdXUMDU-17">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="160" y="220" as="sourcePoint" />
<mxPoint x="240" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-19" value="Event" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="dZXWpN2tcvNV-OdXUMDU-18">
<mxGeometry x="0.0286" y="-2" relative="1" as="geometry">
<mxPoint y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-20" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-17" target="dZXWpN2tcvNV-OdXUMDU-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-21" value="Event" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-17" target="dZXWpN2tcvNV-OdXUMDU-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="440" y="200" as="sourcePoint" />
<mxPoint x="490" y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-22" value="Network Interface" style="endArrow=none;dashed=1;html=1;rounded=0;align=left;verticalAlign=bottom;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="425" y="420" as="sourcePoint" />
<mxPoint x="680" y="420" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-23" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="160" as="sourcePoint" />
<mxPoint x="220" y="110" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-24" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-1" target="dZXWpN2tcvNV-OdXUMDU-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-25" value="Trigger&lt;br&gt;Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-3" target="dZXWpN2tcvNV-OdXUMDU-5">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="360" y="320" as="sourcePoint" />
<mxPoint x="410" y="270" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-26" value="Fetch&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="340" y="300" as="sourcePoint" />
<mxPoint x="390" y="250" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-27" value="Update&lt;br&gt;Data" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-4">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="170" y="340" as="sourcePoint" />
<mxPoint x="220" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-28" value="Update&lt;br&gt;View&lt;br&gt;Model&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-5" target="dZXWpN2tcvNV-OdXUMDU-3">
<mxGeometry x="0.2549" y="22" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-29" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-1" target="dZXWpN2tcvNV-OdXUMDU-17">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-30" value="Fetching&lt;br&gt;Completed" style="endArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="dZXWpN2tcvNV-OdXUMDU-17" target="dZXWpN2tcvNV-OdXUMDU-5">
<mxGeometry x="-0.3333" y="10" width="50" height="50" relative="1" as="geometry">
<mxPoint x="320" y="340" as="sourcePoint" />
<mxPoint x="370" y="290" as="targetPoint" />
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-31" value="&lt;font color=&quot;#121212&quot;&gt;Swing UI&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#647687;fontColor=#ffffff;strokeColor=#314354;" vertex="1" parent="1">
<mxGeometry x="40" y="260" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-32" value="&lt;font color=&quot;#121212&quot;&gt;Sender&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#647687;fontColor=#ffffff;strokeColor=#314354;" vertex="1" parent="1">
<mxGeometry x="550" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-33" value="&lt;font color=&quot;#121212&quot;&gt;Receiver&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#647687;fontColor=#ffffff;strokeColor=#314354;" vertex="1" parent="1">
<mxGeometry x="680" y="190" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="dZXWpN2tcvNV-OdXUMDU-34" value="Error Handler" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="509" width="120" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="Qvqhu417yh47AELHSp99" name="Page-2">
<mxGraphModel dx="1114" dy="663" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="RjpXFJRHx75nK1sPjYBd-1" value="View" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="40" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-2" value="View Event&lt;br&gt;Manager" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="230" y="40" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-3" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="RjpXFJRHx75nK1sPjYBd-1" target="RjpXFJRHx75nK1sPjYBd-2">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="190" y="170" as="sourcePoint" />
<mxPoint x="240" y="120" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-4" value="Event" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="RjpXFJRHx75nK1sPjYBd-3">
<mxGeometry x="0.0286" y="-2" relative="1" as="geometry">
<mxPoint y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-5" value="Events:" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="40" y="160" width="60" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-6" value="Connect to Server Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="200" width="220" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-8" value="Alarm ID x got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="280" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-9" value="Active Connections Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="320" width="220" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-10" value="System Information Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="360" width="230" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-11" value="Requests Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="400" width="170" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-12" value="Cake Diagram Panel was clicked" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="440" width="200" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-13" value="&lt;font color=&quot;#ff0000&quot;&gt;Montoring Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="238" width="110" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-14" value="&lt;font color=&quot;#ff0000&quot;&gt;Connect to Server Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="160" width="160" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-15" value="&lt;font color=&quot;#ff0000&quot;&gt;Controlling Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="160" width="120" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-16" value="NFTables Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="200" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-17" value="Add new Port Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="240" width="200" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-18" value="Logs Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="480" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-19" value="&lt;font color=&quot;#ff0000&quot;&gt;NFTables Family Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="320" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-20" value="Download Configuration got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="360" width="220" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-21" value="inet family Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="400" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-22" value="ipv4 family Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="440" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-23" value="ipv6 family Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="440" y="480" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-24" value="&lt;font color=&quot;#ff0000&quot;&gt;Status Panel:&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="520" width="90" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-25" value="Go to Monitoring Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="560" width="250" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-28" value="Go to Controlling Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="600" width="250" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-29" value="Go to Previous Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="640" width="240" height="30" as="geometry" />
</mxCell>
<mxCell id="RjpXFJRHx75nK1sPjYBd-30" value="Go to Next Panel Button got pressed" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="680" width="220" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -3,10 +3,10 @@
*/
package connect.src;
import data.src.ControllerToConnectionClient.ControllerToConnectionClientData;
import data.src.Controller_To_ConnectionClient.Controller_To_Connection_ClientData;
public interface Client {
public boolean createConnection(ControllerToConnectionClientData controllerToConnectionClientData);
public boolean createConnection(Controller_To_Connection_ClientData controllerToConnectionClientData);
public void startSender();
public void startReceiver();
public void closeConnection();

View File

@@ -3,10 +3,8 @@
*/
package connect.src;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.UnknownHostException;
@@ -21,8 +19,8 @@ import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import data.src.ControllerToConnectionClient.ConnectToServer;
import data.src.ControllerToConnectionClient.ControllerToConnectionClientData;
import data.src.Controller_To_ConnectionClient.ConnectToServer;
import data.src.Controller_To_ConnectionClient.Controller_To_Connection_ClientData;
public final class TLSClient implements Client {
@@ -32,13 +30,13 @@ public final class TLSClient implements Client {
return sslSocket;
}
public boolean createConnection(ControllerToConnectionClientData controllerToConnectionClientData) {
public boolean createConnection(Controller_To_Connection_ClientData controllerToConnectionClientData) {
try {
ConnectToServer connectToServer = ((ConnectToServer)controllerToConnectionClientData);
String ipAddress = connectToServer.getIPAddress();
int port = connectToServer.getPort();
String trustStorePath = connectToServer.getTruststorePath();
String trustStorePassword = connectToServer.getTruststorePassword();
String ipAddress = connectToServer.ipAddress();
int port = connectToServer.port();
String trustStorePath = connectToServer.trustStorePath();
String trustStorePassword = connectToServer.trustStorePassword();
KeyStore truststore = KeyStore.getInstance("JKS");
truststore.load(new FileInputStream(trustStorePath), trustStorePassword.toCharArray());

View File

@@ -1,69 +1,75 @@
/**
* @author Aaron Moser
* @date 01.12.2023
* @lastChange 07.01.2024
*/
package controller.src;
import javax.xml.crypto.Data;
import connect.src.Client;
import connect.src.TLSClient;
import controller.src.DataProcessing.DataProcessorThread;
import controller.src.Validate.Validate;
import data.src.ControllerToConnectionClient.ConnectToServer;
import data.src.ControllerToConnectionClient.ControllerToConnectionClientData;
import data.src.ControllerToView.ConnectToServerSuccessful;
import data.src.ControllerToView.ControllerToViewData;
import data.src.ViewToController.ConnectToServerData;
import data.src.ViewToController.EmptyViewToControllerData;
import data.src.ViewToController.ViewToControllerData;
import data.src.ViewToController.ViewToControllerData.ViewEvent;
import controller.src.events.ConnectToServerSuccessful;
import controller.src.interfaces.I_Controller;
import data.src.Controller_To_ConnectionClient.ConnectToServer;
import data.src.Controller_To_Presenter.Controller_To_Presenter_Data;
import logger.src.MessageLogger;
import model.src.Model;
import model.src.ModelRepresentation;
import model.src.I_Model;
import model.src.ConnectionModel.ConnectionStatus;
import queues.src.ControllerToViewQueue;
import queues.src.Controller_To_Presenter_Queue;
import queues.src.Presenter_To_Controller_Queue;
import queues.src.SendingQueue;
import queues.src.ViewToControllerQueue;
import queues.src.ViewEventManager_To_Controller_Queue;
import viewEventManager.src.data.AA_ConnectToServerData.AA_ConnectToServerData;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
import viewEventManager.src.events.AA_ConnectToServerPanelEvents.AA_ConnectToServerButtonGotPressed;
import viewEventManager.src.events.ZZ_General.ZZ_EmptyViewEvent;
public class ControllerThread extends Thread implements Controller {
public class ControllerThread extends Thread implements I_Controller {
private static final String className = "ControllerThread";
private final static boolean SUCCESSFUL = true;
private Model model;
private I_Model model = null;
private Client client;
private ViewEventManager_To_Controller_Queue viewEventManager_To_Controller_Queue = null;
private Controller_To_Presenter_Queue controller_To_Presenter_Queue = null;
private Presenter_To_Controller_Queue presenter_To_Controller_Queue = null;
public ControllerThread(Model model) {
this.model = model;
private Client client = null;
public ControllerThread(I_Model model, ViewEventManager_To_Controller_Queue viewEventManager_To_Controller_Queue, Controller_To_Presenter_Queue controller_To_Presenter_Queue, Presenter_To_Controller_Queue presenter_To_Controller_Queue) {
this.model = model;
this.viewEventManager_To_Controller_Queue = viewEventManager_To_Controller_Queue;
this.controller_To_Presenter_Queue = controller_To_Presenter_Queue;
this.presenter_To_Controller_Queue = presenter_To_Controller_Queue;
}
public void run() {
MessageLogger.printMessage(className, "Controller Thread was started.");
ViewToControllerData viewToControllerData = new EmptyViewToControllerData();
I_ViewEvent event = new ZZ_EmptyViewEvent();
// Run until view sends event quit application
while (viewToControllerData.getViewEvent() != ViewEvent.QuitApplication) {
while (event.getEventType() != E_ViewEvent.ZZ_ExitApplication) {
// Wait for a message from view.
while ((viewToControllerData = ViewToControllerQueue.getInstance().poll()) == null) {}
// If message from ViewEventManager received
if ((event = viewEventManager_To_Controller_Queue.poll()) != null) {
MessageLogger.printMessage(className, "Got new data from ViewEventManager.");
MessageLogger.printMessage(className, "Event is: " + event.getEventType());
MessageLogger.printMessage(className, "Got new data from ViewToControllerQueue.");
MessageLogger.printMessage(className, "Event is: " + viewToControllerData.getViewEvent());
switch (event.getEventType()) {
case AA_ConnectToServerButtonGotPressed: {
AA_ConnectToServerButtonGotPressed connectToServerEvent = (AA_ConnectToServerButtonGotPressed)event;
handleConnectToServerButtonWasPressed(new AA_ConnectToServerData(connectToServerEvent.connectToServerData().ipAddress(), connectToServerEvent.connectToServerData().port(), connectToServerEvent.connectToServerData().trustStoreFilePath(), connectToServerEvent.connectToServerData().trustStorePassword()));
}break;
default: {
switch (viewToControllerData.getViewEvent()) {
case ViewEvent.ConnectToServerButtonWasPressed: {
handleConnectToServerButtonWasPressed(viewToControllerData);
}break;
default: {
}break;
}break;
}
}
if (event == null) {
event = new ZZ_EmptyViewEvent();
}
}
MessageLogger.printMessage(className, "Exit controller thread.");
@@ -76,27 +82,29 @@ public class ControllerThread extends Thread implements Controller {
* necessary to establish a connection to a server.
* @param viewToControllerData
*/
private void handleConnectToServerButtonWasPressed(ViewToControllerData data) {
private void handleConnectToServerButtonWasPressed(AA_ConnectToServerData data) {
this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Pending);
ConnectToServerData connectToServerData = (ConnectToServerData)data;
String ipAddress = connectToServerData.getIPAddress();
int port = connectToServerData.getPort();
String ipAddress = data.ipAddress();
int port = data.port();
String trustStoreFilePath = data.trustStoreFilePath();
String trustStorePassword = data.trustStorePassword();
boolean validIP = Validate.isValidIPv4Address(ipAddress);
boolean validPort = Validate.isValidPort(port, 1, 60000);
MessageLogger.printMessage(className, "IP: " + validIP + ", Port: " + validPort);
ConnectToServer connectToServerData = new ConnectToServer(ipAddress, port, trustStoreFilePath, trustStorePassword);
if (validIP) {
if (validPort) {
this.client = new TLSClient();
if (this.client.createConnection(viewToControllerToClientConnectData(connectToServerData)) == SUCCESSFUL) {
if (this.client.createConnection(connectToServerData) == SUCCESSFUL) {
startThreads();
this.model.getConnectionModel().setConnectionStatus(ConnectionStatus.Connected);
ControllerToViewData controllerToViewData = new ConnectToServerSuccessful();
ControllerToViewQueue.getInstance().add(controllerToViewData);
controller_To_Presenter_Queue.add(new ConnectToServerSuccessful());
//SendingQueue.getInstance().add("getSysInf");
//SendingQueue.getInstance().add("getCon");
@@ -109,15 +117,6 @@ public class ControllerThread extends Thread implements Controller {
//TODO send event to view that ip is not valid.
}
}
private ConnectToServer viewToControllerToClientConnectData(ConnectToServerData connectToServerDataView) {
ConnectToServer connectToServerData = new ConnectToServer();
connectToServerData.setIPAddress(connectToServerDataView.getIPAddress());
connectToServerData.setPort(connectToServerDataView.getPort());
connectToServerData.setTruststorePath(connectToServerDataView.getTrustStorePath());
connectToServerData.setTruststorePassword(connectToServerDataView.getTrustStorePassword());
return connectToServerData;
}
private void startThreads() {
DataProcessorThread.getInstance().start();

View File

@@ -1,21 +1,20 @@
/**
* @author Aaron Moser
* @date 28.12.2023
* @lastChange 05.01.2024
*/
package controller.src.DataProcessing;
import controller.src.DataProcessing.ConnectionsProcessing.ConnectionInformation;
import controller.src.DataProcessing.ConnectionsProcessing.ConnectionsProcessor;
import controller.src.DataProcessing.nftablesProcessing.NFTableInformation;
import controller.src.DataProcessing.nftablesProcessing.NFTablesProcessor;
import model.src.Model;
import model.src.I_Model;
import model.src.ModelConstants.AccessModifier;
import queues.src.ReceivingQueue;
public final class DataProcessorThread extends Thread {
private static DataProcessorThread instance = null;
private Model model = null;
private I_Model model = null;
private DataProcessorThread() {}
@@ -57,7 +56,7 @@ public final class DataProcessorThread extends Thread {
return this.dataProcessorRunning;
}
public void setModel(Model model) {
public void setModel(I_Model model) {
this.model = model;
}
@@ -80,8 +79,7 @@ public final class DataProcessorThread extends Thread {
model.getNetworkModel().accessConnections(AccessModifier.WriteEntry, conInf);
}break;
case NFTablesConfiguration: {
NFTableInformation nftConf = NFTablesProcessor.processDataString(data);
model.getNFTablesModel().accessNFTConfiguration(AccessModifier.WriteEntry, nftConf);
}break;
case Undefined: // intended fall through
default: {

View File

@@ -0,0 +1,6 @@
package controller.src.enums;
public enum E_ControllerEvent {
ConnectToServerSuccessful,
UpdateViewModel,
}

View File

@@ -0,0 +1,13 @@
package controller.src.events;
import controller.src.enums.E_ControllerEvent;
import controller.src.interfaces.I_ControllerEvent;
public final record ConnectToServerSuccessful() implements I_ControllerEvent {
@Override
public E_ControllerEvent getEventType() {
return E_ControllerEvent.ConnectToServerSuccessful;
}
}

View File

@@ -0,0 +1,13 @@
package controller.src.events;
import controller.src.enums.E_ControllerEvent;
import controller.src.interfaces.I_ControllerEvent;
public final record UpdateViewModel(int fetchID) implements I_ControllerEvent {
@Override
public E_ControllerEvent getEventType() {
return E_ControllerEvent.UpdateViewModel;
}
}

View File

@@ -0,0 +1,10 @@
/**
* @author Aaron Moser
* @date 01.12.2023
* @lastChange 09.01.2024
*/
package controller.src.interfaces;
public interface I_Controller {
public void start();
}

View File

@@ -0,0 +1,7 @@
package controller.src.interfaces;
import controller.src.enums.E_ControllerEvent;
public interface I_ControllerEvent {
public E_ControllerEvent getEventType();
}

View File

@@ -1,50 +0,0 @@
/**
* @author Aaron Moser
* @date 08.12.2023
*/
package data.src.ControllerToConnectionClient;
public class ConnectToServer implements ControllerToConnectionClientData {
private String ipAddress;
private int port;
String truststorePath;
String truststorePassword;
@Override
public ConnectionClientEvent getConnectionClientEvent() {
return ConnectionClientEvent.ConnectToServer;
}
public String getIPAddress() {
return this.ipAddress;
}
public void setIPAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
public int getPort() {
return this.port;
}
public void setPort(int port) {
this.port = port;
}
public String getTruststorePath() {
return this.truststorePath;
}
public void setTruststorePath(String truststorePath) {
this.truststorePath = truststorePath;
}
public String getTruststorePassword() {
return this.truststorePassword;
}
public void setTruststorePassword(String truststorePassword) {
this.truststorePassword = truststorePassword;
}
}

View File

@@ -1,15 +0,0 @@
package data.src.ControllerToView;
public class ConnectToServerSuccessful implements ControllerToViewData {
@Override
public void setControllerEvent(ControllerEvent controllerEvent) {
return;
}
@Override
public ControllerEvent getControllerEvent() {
return ControllerEvent.ConnectToServerWasSuccessful;
}
}

View File

@@ -1,13 +0,0 @@
/**
* @author Aaron Moser
* @date 01.12.2023
*/
package data.src.ControllerToView;
public interface ControllerToViewData {
public static enum ControllerEvent {
ConnectToServerWasSuccessful,
}
public void setControllerEvent(ControllerEvent controllerEvent);
public ControllerEvent getControllerEvent();
}

View File

@@ -0,0 +1,14 @@
/**
* @author Aaron Moser
* @date 08.12.2023
* @lastChange 06.01.2024
*/
package data.src.Controller_To_ConnectionClient;
public final record ConnectToServer(String ipAddress, int port, String trustStorePath, String trustStorePassword) implements Controller_To_Connection_ClientData {
@Override
public ConnectionClientEvent getConnectionClientEvent() {
return ConnectionClientEvent.ConnectToServer;
}
}

View File

@@ -1,10 +1,11 @@
/**
* @author Aaron Moser
* @date 08.12.2023
* @lastChange 06.01.2024
*/
package data.src.ControllerToConnectionClient;
package data.src.Controller_To_ConnectionClient;
public interface ControllerToConnectionClientData {
public interface Controller_To_Connection_ClientData {
public static enum ConnectionClientEvent {
ConnectToServer,
};

View File

@@ -0,0 +1,5 @@
package data.src.Controller_To_Presenter;
public final record Controller_To_Presenter_Data() {
}

View File

@@ -0,0 +1,5 @@
package data.src.Presenter_To_Controller;
public final record Presenter_To_Controller_Data() {
}

View File

@@ -0,0 +1,7 @@
package data.src.Presenter_To_View;
import presenter.src.interfaces.I_PresenterEvent;
public final record Presenter_To_View_Data(I_PresenterEvent event) {
}

View File

@@ -1,55 +0,0 @@
/**
* @author Aaron Moser
* @date 05.12.2023
*/
package data.src.ViewToController;
public class ConnectToServerData implements ViewToControllerData {
private String ipAddress;
private int port;
private String trustStorePath;
private String trustStorePassword;
public ConnectToServerData(String ipAddress, int port, String trustStorePath, String trustStorePassword) {
this.ipAddress = ipAddress;
this.port = port;
this.trustStorePath = trustStorePath;
this.trustStorePassword = trustStorePassword;
}
@Override
public void setViewEvent(ViewEvent viewEvent) {
return;
}
@Override
public ViewEvent getViewEvent() {
return ViewEvent.ConnectToServerButtonWasPressed;
}
public String getIPAddress() {
return this.ipAddress;
}
public int getPort() {
return this.port;
}
public String getTrustStorePath() {
return this.trustStorePath;
}
public void setTrustStorePath(String trustStorePath) {
this.trustStorePath = trustStorePath;
}
public String getTrustStorePassword() {
return this.trustStorePassword;
}
public void setTrustStorePassword(String trustStorePassword) {
this.trustStorePassword = trustStorePassword;
}
}

View File

@@ -1,19 +0,0 @@
/**
* @author Aaron Moser
* @date 05.12.2023
*/
package data.src.ViewToController;
public class EmptyViewToControllerData implements ViewToControllerData {
@Override
public void setViewEvent(ViewEvent viewEvent) {
return;
}
@Override
public ViewEvent getViewEvent() {
return ViewEvent.EmptyEvent;
}
}

View File

@@ -1,15 +0,0 @@
/**
* @author Aaron Moser
* @date 01.12.2023
*/
package data.src.ViewToController;
public interface ViewToControllerData {
public static enum ViewEvent {
EmptyEvent,
QuitApplication,
ConnectToServerButtonWasPressed,
}
public void setViewEvent(ViewEvent viewEvent);
public ViewEvent getViewEvent();
}

View File

@@ -2,8 +2,8 @@
* @author Aaron Moser
* @date 01.12.2023
*/
package controller.src;
package gui.src;
public interface Controller {
public interface I_View {
public void start();
}

View File

@@ -1,12 +0,0 @@
/**
* @author Aaron Moser
* @date 01.12.2023
*/
package gui.src;
import data.src.ControllerToView.ControllerToViewData;
public interface View {
public void start();
public void notify(ControllerToViewData controllerToViewData);
}

View File

@@ -1,44 +1,61 @@
/**
* @author Aaron Moser
* @date 01.12.2023
* @lastChange 07.01.2024
*/
package gui.src;
import data.src.ControllerToView.ControllerToViewData;
import data.src.Presenter_To_View.Presenter_To_View_Data;
import gui.src.frames.MainFrame;
import logger.src.MessageLogger;
import queues.src.ControllerToViewQueue;
import presenter.src.events.FetchData;
import queues.src.Presenter_To_View_Queue;
import queues.src.View_To_ViewEventManager_Queue;
import viewModel.src.interfaces.I_ViewModel;
public class ViewThread extends Thread implements View {
private static final String className = "ViewThread";
private static ViewThread instance;
public class ViewThread extends Thread implements I_View {
private static final String className = "View";
private boolean isRunning = true;
private ViewThread() {}
private I_ViewModel viewModel = null;
private Presenter_To_View_Queue presenter_To_View_Queue = null;
private View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue = null;
public static ViewThread getInstance() {
if (null == instance) {
instance = new ViewThread();
public ViewThread(
I_ViewModel viewModel,
Presenter_To_View_Queue presenter_To_View_Queue,
View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue) {
this.viewModel = viewModel;
this.presenter_To_View_Queue = presenter_To_View_Queue;
this.view_To_ViewEventManager_Queue = view_To_ViewEventManager_Queue;
}
return instance;
}
public void run() {
MainFrame.getInstance();
MainFrame.getInstance(this.viewModel, this.view_To_ViewEventManager_Queue, this.presenter_To_View_Queue);
MessageLogger.printMessage(className, "Swing ui thread was started.");
while (isRunning) {
ControllerToViewData controllerToViewData = ControllerToViewQueue.getInstance().poll();
if (controllerToViewData != null) {
notify(controllerToViewData);
try {
Thread.sleep(100);
// Take blocks until element is available
Presenter_To_View_Data data = presenter_To_View_Queue.take();
switch (data.event().getType()) {
case FetchData: {
FetchData fetchDataEvent = (FetchData)data.event();
MessageLogger.printMessage(className, "Fetch data event received from presenter. ID:" + fetchDataEvent.id() + " Triggering MainFrame.");
MainFrame.triggerFetchData(fetchDataEvent.id());
}break;
default: {
}break;
}
} catch (InterruptedException e) {
//TODO error handler has to restart queue.
//Error has to be printed to log.
e.printStackTrace();
}
}
}
public void notify(ControllerToViewData controllerToViewData) {
MainFrame.getInstance().notify(controllerToViewData);
}
}

View File

@@ -1,6 +1,7 @@
/**
* @author Aaron Moser
* @date 31.10.2023
* @lastChange 04.01.2024
*/
package gui.src.constants;
@@ -14,7 +15,7 @@ public final class GUIConstants {
}
/**
* Represents kinds of panels.
* Represents kinds of panels that can be put in main frame.
*/
public static enum Panel {
MonitoringPanel,
@@ -25,6 +26,21 @@ public final class GUIConstants {
ConnectionsTablePanel
}
public static enum ControllingSubPanel {
BasePanel,
NFTableFamilyPanel,
NFTableTablePanel,
NFTableChainPanel,
NFTableRulePanel,
None
}
public static enum NFTablePanel {
NFTableTablesPanel,
NFTableChainsPanel,
NFTableRulesPanel
}
public static enum Status {
Connected,
Connecting,

View File

@@ -1,20 +1,16 @@
/**
* @author Aaron Moser
* @date 31.10.2023
* @lastChange 30.12.2023
* @lastChange 07.01.2024
*/
package gui.src.frames;
import javax.swing.*;
import data.src.ControllerToView.ControllerToViewData;
import data.src.ControllerToView.ControllerToViewData.ControllerEvent;
import gui.src.constants.GUIConstants;
import gui.src.constants.GUIConstants.Panel;
import gui.src.constants.GUIConstants.Theme;
import gui.src.interfaces.Themeable;
import gui.src.interfaces.I_PanelChangeable;
import gui.src.interfaces.I_Themeable;
import gui.src.menubar.MenuBar;
import gui.src.panels.ConnectToServerPanel.ConnectToServerPanel;
@@ -22,45 +18,68 @@ import gui.src.panels.ConnectionsTablePanel.ConnectionsTablePanel;
import gui.src.panels.ControllingPanel.ControllingPanel;
import gui.src.panels.MonitoringPanel.MonitoringPanel;
import gui.src.panels.StatusPanel.StatusPanel;
import queues.src.Presenter_To_View_Queue;
import queues.src.View_To_ViewEventManager_Queue;
import viewModel.src.interfaces.I_ViewModel;
import java.awt.*;
public final class MainFrame extends JFrame implements Themeable {
public final class MainFrame extends JFrame implements I_Themeable, I_PanelChangeable {
private static MainFrame instance;
private MainFrame() {
this.setTitle("Firewall Dashboard");
this.setJMenuBar(MenuBar.getMenuBar());
this.setPanel(Panel.ConnectToServerPanel);
this.setSize(1400, 700);
this.setMinimumSize(new Dimension(700, 500));
this.setLocation(100, 100);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
private I_ViewModel viewModel = null;
private View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue = null;
private Presenter_To_View_Queue presenter_To_View_Queue = null;
private JPanel contentPanel = null;
private MainFrame(
I_ViewModel viewModel,
View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue,
Presenter_To_View_Queue presenter_To_View_Queue) {
this.viewModel = viewModel;
this.view_To_ViewEventManager_Queue = view_To_ViewEventManager_Queue;
this.presenter_To_View_Queue = presenter_To_View_Queue;
this.contentPanel = new JPanel();
this.getContentPane().add(this.contentPanel);
this.setTitle("Firewall Dashboard");
this.setJMenuBar(MenuBar.getMenuBar());
this.setPanel(Panel.ConnectToServerPanel);
this.setLocation(100, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static MainFrame getInstance() {
if (null == instance) {
instance = new MainFrame();
}
return instance;
public static MainFrame getInstance(
I_ViewModel viewModel,
View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue,
Presenter_To_View_Queue presenter_To_View_Queue) {
if (instance == null) {
instance = new MainFrame(viewModel, view_To_ViewEventManager_Queue, presenter_To_View_Queue);
}
return instance;
}
@Override
public void setPanel(Panel kindOfPanel) {
try {
switch (kindOfPanel) {
case MonitoringPanel: {
this.setPanel(MonitoringPanel.getInstance());
//StatusPanel.getInstance().setPreviousNextButtonsVisible(false);
}break;
case ControllingPanel: {
this.setPanel(ControllingPanel.getInstance());
//StatusPanel.getInstance().setPreviousNextButtonsVisible(true);
}break;
case ConnectToServerPanel: {
this.setPanel(ConnectToServerPanel.getInstance());
this.setPanel(ConnectToServerPanel.getInstance(viewModel, view_To_ViewEventManager_Queue));
}break;
case ConnectionsTablePanel: {
this.setPanel(ConnectionsTablePanel.getInstance());
//this.setPanel(ConnectionsTablePanel.getInstance());
}break;
default: {
throw new Exception("Unknown kind of panel.");
@@ -73,9 +92,9 @@ public final class MainFrame extends JFrame implements Themeable {
}
private void setPanel(JPanel panel) {
this.getContentPane().removeAll();
this.contentPanel.removeAll();
this.getContentPane().setLayout(new GridBagLayout());
this.contentPanel.setLayout(new GridBagLayout());
// Status Panel
GridBagConstraints statusConstraints = new GridBagConstraints();
@@ -85,7 +104,7 @@ public final class MainFrame extends JFrame implements Themeable {
statusConstraints.fill = GridBagConstraints.HORIZONTAL;
statusConstraints.weightx = 1;
statusConstraints.insets = new Insets(5,5,0,0);
this.getContentPane().add(StatusPanel.getInstance(), statusConstraints);
this.contentPanel.add(StatusPanel.getInstance(this), statusConstraints);
// Main Panel
GridBagConstraints mainConstraints = new GridBagConstraints();
@@ -93,12 +112,11 @@ public final class MainFrame extends JFrame implements Themeable {
mainConstraints.gridy = 2;
mainConstraints.anchor = GridBagConstraints.CENTER;
mainConstraints.weighty = 0.1;
this.getContentPane().add(panel, mainConstraints);
this.contentPanel.add(panel, mainConstraints);
this.pack();
this.setSize(1400, 700);
this.getContentPane().update(this.getGraphics());
this.update(this.getGraphics());
this.setSize(new Dimension(1400, 700));
this.update(getGraphics());
this.setVisible(true);
}
// Nice to have
@@ -121,17 +139,9 @@ public final class MainFrame extends JFrame implements Themeable {
}
}
public void notify(ControllerToViewData controllerToViewData) {
ControllerEvent controllerEvent = controllerToViewData.getControllerEvent();
switch (controllerEvent) {
case ConnectToServerWasSuccessful: {
ConnectToServerPanel.getInstance().enableFields();
StatusPanel.getInstance().setStatus(GUIConstants.Status.Connected);
this.setPanel(Panel.MonitoringPanel);
}break;
default: {
public static void triggerFetchData(int triggerID) {
if (instance != null) {
}break;
}
}
}

View File

@@ -0,0 +1,8 @@
package gui.src.interfaces;
public interface I_FetchesViewModel {
/**
* Fetches data from view model and updates data of all ui elements at current parent.
*/
public void fetchViewModel();
}

View File

@@ -0,0 +1,7 @@
package gui.src.interfaces;
import gui.src.constants.GUIConstants.Panel;
public interface I_PanelChangeable {
public void setPanel(Panel kindOfPanel);
}

View File

@@ -7,6 +7,6 @@ package gui.src.interfaces;
import gui.src.constants.GUIConstants.Theme;
public interface Themeable {
public interface I_Themeable {
public void setThemeColor(Theme themeColor);
}

View File

@@ -1,12 +1,13 @@
/**
* @author Aaron Moser
* @date 31.10.2023
* @lastChange 07.01.2024
*/
package gui.src.interfaces;
import gui.src.constants.GUIConstants.Languages;
public interface Translateable {
public interface I_Translateable {
public void changeLanguage(Languages language);
}

View File

@@ -1,6 +1,7 @@
/**
* @author Aaron Moser
* @date 01.11.2023
* @lastChange 07.01.2024
*/
package gui.src.menubar;
@@ -10,12 +11,12 @@ import javax.swing.JMenu;
import java.awt.event.ActionListener;
import gui.src.constants.GUIConstants.Languages;
import gui.src.interfaces.Translateable;
import gui.src.interfaces.I_Translateable;
/**
* Menu at menu bar.
*/
public final class Menu extends JMenu implements Translateable {
public final class Menu extends JMenu implements I_Translateable {
private String[] translations = null;
/**

View File

@@ -1,6 +1,7 @@
/**
* @author Aaron Moser
* @date 01.11.2023
* @lastChange 07.01.2024
*/
package gui.src.menubar;
@@ -9,12 +10,12 @@ import javax.swing.JMenuBar;
import gui.src.constants.GUIConstants.Languages;
import gui.src.interfaces.Translateable;
import gui.src.interfaces.I_Translateable;
import gui.src.menubar.menus.HelpMenuFactory;
import gui.src.menubar.menus.LanguageMenuFactory;
public final class MenuBar extends JMenuBar implements Translateable {
public final class MenuBar extends JMenuBar implements I_Translateable {
private MenuBarLanguageController languageController = null;

View File

@@ -1,6 +1,7 @@
/**
* @author Aaron Moser
* @date 01.11.2023
* @lastChange 07.01.2024
*/
package gui.src.menubar;
@@ -10,12 +11,12 @@ import java.awt.event.ActionListener;
import javax.swing.JMenuItem;
import gui.src.constants.GUIConstants.Languages;
import gui.src.interfaces.Translateable;
import gui.src.interfaces.I_Translateable;
/**
* Menu item at menu at menu bar.
*/
public final class MenuItem extends JMenuItem implements Translateable {
public final class MenuItem extends JMenuItem implements I_Translateable {
private String[] translations = null;
/**

View File

@@ -1,51 +0,0 @@
/**
* @author Aaron Moser
* @date 09.12.2023
* @lastChange 30.12.2023
*/
package gui.src.panels.ConnectToServerPanel;
import data.src.ViewToController.ConnectToServerData;
import gui.src.constants.GUIConstants;
import gui.src.panels.StatusPanel.StatusPanel;
import queues.src.ViewToControllerQueue;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ConnectToServerButton extends JButton implements ActionListener {
private final JTextField ipAddressTextField;
private final JTextField portTextField;
private final JTextField trustStorePasswordTextField;
public ConnectToServerButton(JTextField ipAddressTextField, JTextField portTextField, JTextField trustStorePasswordTextField) {
this.ipAddressTextField = ipAddressTextField;
this.portTextField = portTextField;
this.trustStorePasswordTextField = trustStorePasswordTextField;
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Connect to server button was pressed.");
ConnectToServerPanel.getInstance().disableFields();
// Reads in fields text
String ipAddress = this.ipAddressTextField.getText();
int port = Integer.parseInt(this.portTextField.getText());
String trustStorePath = ConnectToServerPanel.getInstance().getServerCertStoreFilePath();
String trustStorePassword = this.trustStorePasswordTextField.getText();
StatusPanel.getInstance().setStatus(GUIConstants.Status.Connecting);
// Sends data to queue
ViewToControllerQueue.getInstance().add(new ConnectToServerData(
ipAddress,
port,
trustStorePath,
trustStorePassword
));
}
}

View File

@@ -1,72 +1,74 @@
/**
* @author Aaron Moser
* @date 02.12.2023
* @lastChange 08.01.2024
*/
package gui.src.panels.ConnectToServerPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import gui.src.constants.GUIConstants.Languages;
import gui.src.constants.GUIConstants.Theme;
import gui.src.interfaces.I_FetchesViewModel;
import queues.src.View_To_ViewEventManager_Queue;
import viewEventManager.src.data.AA_ConnectToServerData.AA_ConnectToServerData;
import viewEventManager.src.events.I_ViewEvent;
import viewEventManager.src.events.AA_ConnectToServerPanelEvents.AA_ConnectToServerButtonGotPressed;
import viewModel.src.interfaces.I_ConnectToServerPanel_ViewModel;
import viewModel.src.interfaces.I_ViewModel;
import gui.src.interfaces.Themeable;
import gui.src.interfaces.Translateable;
/**
* The panel to enter data to connect to the server.
*/
public final class ConnectToServerPanel extends JPanel implements I_FetchesViewModel {
private static ConnectToServerPanel instance = null;
public final class ConnectToServerPanel extends JPanel implements Themeable, Translateable {
private String serverCertStoreFilePath;
private static ConnectToServerPanel instance;
private I_ViewModel viewModel = null;
private View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue = null;
private JLabel mainMessageLabel;
private JLabel ipAddressLabel;
private JLabel portLabel;
private JLabel serverCertStoreLabel;
private JLabel serverCertStorePasswordLabel;
private String serverCertStoreFilePath = "";
private JRadioButton[] ipVersionRadioButtons;
private JLabel mainMessageLabel = null;
private JLabel ipAddressLabel = null;
private JLabel portLabel = null;
private JLabel serverCertStoreLabel = null;
private JLabel serverCertStorePasswordLabel = null;
private JTextField ipAddressTextField;
private JTextField portTextField;
private JTextField trustStorePasswordTextField;
private JRadioButton[] ipVersionRadioButtons = null;
private JButton connectButton;
private JButton trustStoreFileChooserButton;
private JTextField ipAddressTextField = null;
private JTextField portTextField = null;
private JTextField trustStorePasswordTextField = null;
private final String[] translationsDE = {
"Verbinden Sie sich mit dem Server",
"IPv4",
"IPv6",
"IP Adresse",
"Port",
"Waehlen Sie den Trust Store, welcher das Server-Zertifikat enthaelt.",
"Datei waehlen",
"Trust Store Passwort",
"Verbinden"
};
private final String[] translationsEN = {
"Connect to server",
"IPv4",
"IPv6",
"IP address",
"Port",
"Select the trust store, which contains the server certificate",
"Choose file",
"Trust store password",
"Connect"
};
private JButton connectButton = null;
private JButton trustStoreFileChooserButton = null;
public static ConnectToServerPanel getInstance() {
if (null == instance) {
instance = new ConnectToServerPanel();
/**
* On first call, initializes instance with overhanded parameters.
* On later calls, lets instance fetch new data from view model and returns updated instance.
* @param viewModel the model containing all the attributes of the ui elements.
* @param view_To_ViewEventManager_Queue the queue to send events from the view to the view event manager.
* @return the instance of the ConnectToServerPanel.
*/
public static ConnectToServerPanel getInstance(I_ViewModel viewModel, View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue) {
if (instance == null) {
instance = new ConnectToServerPanel(viewModel, view_To_ViewEventManager_Queue);
}
instance.fetchViewModel();
return instance;
}
private ConnectToServerPanel() {
private ConnectToServerPanel(I_ViewModel viewModel, View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue) {
this.viewModel = viewModel;
this.view_To_ViewEventManager_Queue = view_To_ViewEventManager_Queue;
this.createComponents();
this.addComponents();
this.changeLanguage(Languages.German);
this.fetchViewModel();
}
/**
@@ -228,7 +230,23 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra
}
private void createServerCertStoreFileChooserButton() {
this.trustStoreFileChooserButton = new TrustStoreButton();
this.trustStoreFileChooserButton = new JButton();
this.trustStoreFileChooserButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
int fileChooserOption = fileChooser.showSaveDialog(null);
// if the user selects a file
if (fileChooserOption == JFileChooser.APPROVE_OPTION) {
serverCertStoreFilePath = fileChooser.getSelectedFile().getAbsolutePath();
}
}
});
}
private void addServerCertStoreFileChooserButton() {
@@ -273,7 +291,23 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra
}
private void createConnectButton() {
this.connectButton = new ConnectToServerButton(this.ipAddressTextField, this.portTextField, this.trustStorePasswordTextField);
this.connectButton = new JButton();
this.connectButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
I_ViewEvent data = new AA_ConnectToServerButtonGotPressed(
new AA_ConnectToServerData(
ipAddressTextField.getText(),
Integer.valueOf(portTextField.getText()),
serverCertStoreFilePath,
trustStorePasswordTextField.getText()));
// Pass the data to the event manager
view_To_ViewEventManager_Queue.add(data);
}
});
}
private void addConnectButton() {
@@ -287,227 +321,20 @@ public final class ConnectToServerPanel extends JPanel implements Themeable, Tra
this.add(this.connectButton, gridBagConstraints);
}
public void setThemeColor(Theme themeColor) {
try {
switch (themeColor) {
case Dark: {
}break;
case Light: {
}break;
default: {
throw new Exception("Unknown kind of theme color.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.setThemeColor(Theme.Light);
}
}
@Override
public void fetchViewModel() {
I_ConnectToServerPanel_ViewModel panelViewModel = viewModel.get_ConnectToServerPanel_ViewModel();
/**
* Changes text of panel elements.
* Panel elements are: descriptive text, ip version radio buttons,
* ip address field descriptive text, port field descriptive text,
* connect button text.
* @param language the language the elements to set to.
*/
public void changeLanguage(Languages language) {
changeLanguageMainMessageLabel(language);
changeLanguageIPVersionRadioButtons(language);
changeLanguageIPAddressLabel(language);
changeLanguagePortLabel(language);
changeLanguageConnectButton(language);
changeLanguageServerCertStoreLabel(language);
changeLanguageTrustStoreFileChooserButton(language);
changeLanguageServerCertStorePasswordLabel(language);
}
mainMessageLabel.setText(panelViewModel.get_MainMessageLabel_Text());
ipAddressLabel.setText(panelViewModel.get_IPAddressLabel_Text());
portLabel.setText(panelViewModel.get_PortLabel_Text());
serverCertStoreLabel.setText(panelViewModel.get_ServerCertStoreLabel_Text());
serverCertStorePasswordLabel.setText(panelViewModel.get_ServerCertStorePasswordLabel_Text());
/**
* Changes translation of radio buttons for selection of ip-version.
* Prints an error message if the language is unknown.
* @param language the language the elements to set to.
*/
private void changeLanguageIPVersionRadioButtons(Languages language) {
try {
switch (language) {
case German: {
ipVersionRadioButtons[0].setText(translationsDE[1]);
ipVersionRadioButtons[1].setText(translationsDE[2]);
}break;
case English: {
ipVersionRadioButtons[0].setText(translationsEN[1]);
ipVersionRadioButtons[1].setText(translationsEN[2]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguageIPVersionRadioButtons(Languages.German);
}
}
ipVersionRadioButtons[0].setText(panelViewModel.get_IPVersion4RadioButton_Text());
ipVersionRadioButtons[1].setText(panelViewModel.get_IPVersion6RadioButton_Text());
private void changeLanguageMainMessageLabel(Languages language) {
try {
switch (language) {
case German: {
mainMessageLabel.setText(translationsDE[0]);
}break;
case English: {
mainMessageLabel.setText(translationsEN[0]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguageMainMessageLabel(Languages.German);
}
}
private void changeLanguageIPAddressLabel(Languages language) {
try {
switch (language) {
case German: {
ipAddressLabel.setText(translationsDE[3]);
}break;
case English: {
ipAddressLabel.setText(translationsEN[3]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguageIPAddressLabel(Languages.German);
}
}
private void changeLanguagePortLabel(Languages language) {
try {
switch (language) {
case German: {
this.portLabel.setText(translationsDE[4]);
}break;
case English: {
this.portLabel.setText(translationsEN[4]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguagePortLabel(Languages.German);
}
}
private void changeLanguageServerCertStoreLabel(Languages language) {
try {
switch (language) {
case German: {
this.serverCertStoreLabel.setText(translationsDE[5]);
}break;
case English: {
this.serverCertStoreLabel.setText(translationsEN[5]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguagePortLabel(Languages.German);
}
}
private void changeLanguageTrustStoreFileChooserButton(Languages language) {
try {
switch (language) {
case German: {
this.trustStoreFileChooserButton.setText(translationsDE[6]);
}break;
case English: {
this.trustStoreFileChooserButton.setText(translationsEN[6]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguagePortLabel(Languages.German);
}
}
private void changeLanguageServerCertStorePasswordLabel(Languages language) {
try {
switch (language) {
case German: {
this.serverCertStorePasswordLabel.setText(translationsDE[7]);
}break;
case English: {
this.serverCertStorePasswordLabel.setText(translationsEN[7]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguagePortLabel(Languages.German);
}
}
private void changeLanguageConnectButton(Languages language) {
try {
switch (language) {
case German: {
this.connectButton.setText(translationsDE[8]);
}break;
case English: {
this.connectButton.setText(translationsEN[8]);
}break;
default: {
throw new Exception("Unknown kind of language.");
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
this.changeLanguagePortLabel(Languages.German);
}
}
public void setServerCertStoreFilePath(String serverCertStoreFilePath) {
this.serverCertStoreFilePath = serverCertStoreFilePath;
}
public String getServerCertStoreFilePath() {
return serverCertStoreFilePath;
}
public void enableFields() {
for (JRadioButton radioButton : this.ipVersionRadioButtons) {
radioButton.setEnabled(true);
}
this.ipAddressTextField.setEditable(true);
this.portTextField.setEditable(true);
this.trustStorePasswordTextField.setEditable(true);
this.connectButton.setEnabled(true);
}
public void disableFields() {
for (JRadioButton radioButton : this.ipVersionRadioButtons) {
radioButton.setEnabled(false);
}
this.ipAddressTextField.setEditable(false);
this.portTextField.setEditable(false);
this.trustStorePasswordTextField.setEditable(false);
this.connectButton.setEnabled(false);
connectButton.setText(panelViewModel.get_ConnectButton_Text());
trustStoreFileChooserButton.setText(panelViewModel.get_TrustStoreFileChooserButton_Text());
}
}

View File

@@ -1,32 +0,0 @@
/**
* @author Aaron Moser
* @date 09.12.2023
*/
package gui.src.panels.ConnectToServerPanel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TrustStoreButton extends JButton implements ActionListener {
public TrustStoreButton() {
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
int fileChooserOption = fileChooser.showSaveDialog(null);
// if the user selects a file
if (fileChooserOption == JFileChooser.APPROVE_OPTION) {
ConnectToServerPanel.getInstance().setServerCertStoreFilePath(fileChooser.getSelectedFile().getAbsolutePath());
}
}
}

View File

@@ -1,8 +1,15 @@
/**
* @author Aaron Moser
* @date
* @lastChange 07.01.2024
*/
package gui.src.panels.ConnectionsTablePanel;
import javax.swing.JPanel;
public class ConnectionsTablePanel extends JPanel {
import gui.src.interfaces.I_FetchesViewModel;
public class ConnectionsTablePanel extends JPanel implements I_FetchesViewModel {
private static ConnectionsTablePanel instance;
private ConnectionsTablePanel() {
@@ -15,4 +22,10 @@ public class ConnectionsTablePanel extends JPanel {
}
return instance;
}
@Override
public void fetchViewModel() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'fetchViewModel'");
}
}

View File

@@ -0,0 +1,29 @@
package gui.src.panels.ControllingPanel.BasePanel;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
public class ControllingBasePanel extends JPanel {
private static ControllingBasePanel instance = null;
private final JButton nftConfigButton;
private ControllingBasePanel() {
nftConfigButton = new NFTConfigurationButton();
this.setLayout(new GridBagLayout());
GridBagConstraints nftConfButtonConstraints = new GridBagConstraints();
this.add(nftConfigButton, nftConfButtonConstraints);
}
public static ControllingBasePanel getInstance() {
if (instance == null) {
instance = new ControllingBasePanel();
}
return instance;
}
}

View File

@@ -0,0 +1,28 @@
/**
* @author Aaron Moser
* @date 04.01.2024
* @lastChange 04.01.2024
*/
package gui.src.panels.ControllingPanel.BasePanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import gui.src.constants.GUIConstants.ControllingSubPanel;
import gui.src.panels.ControllingPanel.ControllingPanel;
public final class NFTConfigurationButton extends JButton implements ActionListener {
public NFTConfigurationButton() {
this.setText("NFT Configuration");
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
ControllingPanel.getInstance().setPanel(ControllingSubPanel.NFTableFamilyPanel);
}
}

View File

@@ -5,19 +5,125 @@
package gui.src.panels.ControllingPanel;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import javax.swing.JPanel;
import gui.src.constants.GUIConstants.ControllingSubPanel;
import gui.src.frames.MainFrame;
import gui.src.panels.ControllingPanel.BasePanel.ControllingBasePanel;
import gui.src.panels.ControllingPanel.NFTable.NFTFamilyPanel.NFTFamilyPanel;
import gui.src.panels.ControllingPanel.NFTable.NFTablesTablePanel.NFTablesTablePanel;
import gui.src.panels.ControllingPanel.NFTable.NFTablesChainPanel.NFTablesChainPanel;
import gui.src.panels.ControllingPanel.NFTable.NFTablesRulePanel.NFTablesRulePanel;
public final class ControllingPanel extends JPanel {
private static ControllingPanel instance;
private ControllingPanel() {
private ControllingSubPanel activePanelType = ControllingSubPanel.None;
private Deque<ControllingSubPanel> previousPanelStack = new ArrayDeque<ControllingSubPanel>();
private Deque<ControllingSubPanel> nextPanelStack = new ArrayDeque<ControllingSubPanel>();
private ControllingPanel() {
this.setPanel(ControllingSubPanel.BasePanel);
}
public static ControllingPanel getInstance() {
if (null == instance) {
if (instance == null) {
instance = new ControllingPanel();
}
return instance;
}
public void setPanel(ControllingSubPanel panelType) {
this.removeAll();
switch (panelType) {
case ControllingSubPanel.BasePanel: {
if (activePanelType != ControllingSubPanel.BasePanel) {
previousPanelStack.push(activePanelType);
this.activePanelType = ControllingSubPanel.BasePanel;
this.add(ControllingBasePanel.getInstance());
}
}break;
case ControllingSubPanel.NFTableFamilyPanel: {
if (activePanelType != ControllingSubPanel.NFTableFamilyPanel) {
previousPanelStack.push(activePanelType);
this.activePanelType = ControllingSubPanel.NFTableFamilyPanel;
this.add(NFTFamilyPanel.getInstance());
}
}break;
case ControllingSubPanel.NFTableTablePanel: {
if (activePanelType != ControllingSubPanel.NFTableTablePanel) {
previousPanelStack.push(activePanelType);
this.activePanelType = ControllingSubPanel.NFTableTablePanel;
this.add(NFTablesTablePanel.getInstance());
}
}break;
case ControllingSubPanel.NFTableChainPanel: {
if (activePanelType != ControllingSubPanel.NFTableChainPanel) {
previousPanelStack.push(activePanelType);
this.activePanelType = ControllingSubPanel.NFTableChainPanel;
this.add(NFTablesChainPanel.getInstance());
}
}break;
case ControllingSubPanel.NFTableRulePanel: {
if (activePanelType != ControllingSubPanel.NFTableRulePanel) {
previousPanelStack.push(activePanelType);
this.activePanelType = ControllingSubPanel.NFTableRulePanel;
this.add(NFTablesRulePanel.getInstance());
}
}break;
default: {
}break;
}
MainFrame.getInstance(null, null, null).setVisible(true);
}
public void previousButtonEvent() {
if (!previousPanelStack.isEmpty()) {
nextPanelStack.push(activePanelType);
setPanel(previousPanelStack.pop());
}
}
public void nextButtonEvent() {
if(!nextPanelStack.isEmpty()) {
previousPanelStack.push(activePanelType);
setPanel(nextPanelStack.pop());
}
}
/*public void setNFTInformation(NFTablesConfigurationReceived nftConfig) {
LinkedList<LinkedList<LinkedList<String>>> nftInformation = nftConfig.getNFTableInformation().getTables();
LinkedList<String> tables = new LinkedList<String>();
HashMap<String, String> chains = new HashMap<String, String>();
HashMap<String, String> rules = new HashMap<String, String>();
for (int tableIndex = 0; tableIndex < nftInformation.size(); tableIndex++) {
for (int chainIndex = 0; chainIndex < nftInformation.get(tableIndex).size(); chainIndex++) {
for (int ruleIndex = 0; ruleIndex < nftInformation.get(tableIndex).get(chainIndex).size(); ruleIndex++) {
switch (ruleIndex) {
case 0: {
tables.add(nftInformation.get(tableIndex).get(chainIndex).get(0));
}break;
case 1: {
chains.put(nftInformation.get(tableIndex).get(chainIndex).get(0), nftInformation.get(tableIndex).get(chainIndex).get(1));
}break;
default: {
}break;
}
}
}
}
NFTablesTablePanel.getInstance().setTables(tables);
} */
}

View File

@@ -0,0 +1,35 @@
/**
* @author Aaron Moser
* @date 04.01.2024
* @lastChange 04.01.2024
*/
package gui.src.panels.ControllingPanel.NFTable.NFTFamilyPanel;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class IPv4FamilyButton extends JButton implements ActionListener {
private static IPv4FamilyButton instance = null;
private IPv4FamilyButton() {
this.setText("IPv4");
this.addActionListener(this);
this.setPreferredSize(new Dimension(100,100));
}
public static IPv4FamilyButton getInstance() {
if (instance == null) {
instance = new IPv4FamilyButton();
}
return instance;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'");
}
}

View File

@@ -0,0 +1,35 @@
/**
* @author Aaron Moser
* @date 04.01.2024
* @lastChange 04.01.2024
*/
package gui.src.panels.ControllingPanel.NFTable.NFTFamilyPanel;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class IPv6FamilyButton extends JButton implements ActionListener {
private static IPv6FamilyButton instance = null;
private IPv6FamilyButton() {
this.setText("IPv6");
this.addActionListener(this);
this.setPreferredSize(new Dimension(100,100));
}
public static IPv6FamilyButton getInstance() {
if (instance == null) {
instance = new IPv6FamilyButton();
}
return instance;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'");
}
}

View File

@@ -0,0 +1,35 @@
/**
* @author Aaron Moser
* @date 04.01.2024
* @lastChange 04.01.2024
*/
package gui.src.panels.ControllingPanel.NFTable.NFTFamilyPanel;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class InetFamilyButton extends JButton implements ActionListener {
private static InetFamilyButton instance = null;
private InetFamilyButton() {
this.setText("Inet");
this.addActionListener(this);
this.setPreferredSize(new Dimension(100,100));
}
public static InetFamilyButton getInstance() {
if (instance == null) {
instance = new InetFamilyButton();
}
return instance;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'actionPerformed'");
}
}

View File

@@ -0,0 +1,71 @@
/**
* @author Aaron Moser
* @date 31.12.2023
* @lastChange 04.01.2024
*/
package gui.src.panels.ControllingPanel.NFTable.NFTFamilyPanel;
import javax.swing.*;
import java.awt.*;
public final class NFTFamilyPanel extends JPanel {
private static NFTFamilyPanel instance = null;
private final JLabel instruction;
private final JButton inetFamilyButton;
private final JButton ipv4FamilyButton;
private final JButton ipv6FamilyButton;
private NFTFamilyPanel() {
instruction = new JLabel("Waehlen Sie die Familie aus, deren Tabellen / Ketten / Regeln Sie anschauen / veraendern moechten.");
this.setLayout(new GridBagLayout());
this.addInstructions();
inetFamilyButton = InetFamilyButton.getInstance();
ipv4FamilyButton = IPv4FamilyButton.getInstance();
ipv6FamilyButton = IPv6FamilyButton.getInstance();
this.addFamilyButtons();
}
private void addInstructions() {
GridBagConstraints instructionConstraints = new GridBagConstraints();
instructionConstraints.gridx = 0;
instructionConstraints.gridy = 0;
instructionConstraints.anchor = GridBagConstraints.NORTHWEST;
instructionConstraints.fill = GridBagConstraints.HORIZONTAL;
instructionConstraints.weightx = 1;
instructionConstraints.insets = new Insets(0,0,0,0);
this.add(instruction, instructionConstraints);
}
private void addFamilyButtons() {
GridBagConstraints buttonPanelConstraints = new GridBagConstraints();
buttonPanelConstraints.gridx = 0;
buttonPanelConstraints.gridy = 1;
buttonPanelConstraints.anchor = GridBagConstraints.NORTHWEST;
buttonPanelConstraints.fill = GridBagConstraints.HORIZONTAL;
buttonPanelConstraints.weightx = 1;
buttonPanelConstraints.insets = new Insets(0,0,0,0);
JPanel familyButtonPanel = new JPanel();
familyButtonPanel.setLayout(new FlowLayout());
familyButtonPanel.add(inetFamilyButton);
familyButtonPanel.add(ipv4FamilyButton);
familyButtonPanel.add(ipv6FamilyButton);
this.add(familyButtonPanel, buttonPanelConstraints);
}
public static NFTFamilyPanel getInstance() {
if (instance == null) {
instance = new NFTFamilyPanel();
}
return instance;
}
}

View File

@@ -1,12 +1,26 @@
/**
* @author Aaron Moser
* @date 30.12.2023
* @lastChange 30.12.2023
* @lastChange 04.01.2024
*/
package gui.src.panels.ControllingPanel.NFTable.NFTablesChainPanel;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
public class NFTablesChainPanel extends JPanel {
public final class NFTablesChainPanel extends JPanel {
private static NFTablesChainPanel instance = null;
private NFTablesChainPanel() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
}
public static NFTablesChainPanel getInstance() {
if (instance == null) {
instance = new NFTablesChainPanel();
}
return instance;
}
}

View File

@@ -0,0 +1,26 @@
/**
* @author Aaron Moser
* @date 04.01.2024
* @lastChange 04.01.2024
*/
package gui.src.panels.ControllingPanel.NFTable.NFTablesRulePanel;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
public final class NFTablesRulePanel extends JPanel {
private static NFTablesRulePanel instance = null;
private NFTablesRulePanel() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
}
public static NFTablesRulePanel getInstance() {
if (instance == null) {
instance = new NFTablesRulePanel();
}
return instance;
}
}

View File

@@ -5,16 +5,25 @@
*/
package gui.src.panels.ControllingPanel.NFTable.NFTablesTablePanel;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
public final class NFTablesTablePanel extends JPanel {
private static NFTablesTablePanel instance = null;
private NFTablesTablePanel() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
private JPanel tableListPanel = null;
private NFTablesTablePanel() {
setTables(null);
this.setLayout(new GridBagLayout());
GridBagConstraints tablesPanelConstraints = new GridBagConstraints();
this.add(tableListPanel, tablesPanelConstraints);
}
public static NFTablesTablePanel getInstance() {
@@ -23,4 +32,19 @@ public final class NFTablesTablePanel extends JPanel {
}
return instance;
}
public void setTables(List<String> tables) {
tableListPanel = new JPanel();
tableListPanel.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
if (tables != null) {
for (String table : tables) {
//tableListPanel.add();
}
} else {
//tableListPanel.add();
}
}
}

View File

@@ -41,7 +41,7 @@ public class ConnectionsLineChartPanel extends JPanel {
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
MainFrame.getInstance().setPanel(null);
// MainFrame.getInstance().setPanel(null);
}
});
}

View File

@@ -11,20 +11,24 @@ import java.awt.event.ActionListener;
import javax.swing.JButton;
import gui.src.constants.GUIConstants.Panel;
import gui.src.frames.MainFrame;
import gui.src.interfaces.I_PanelChangeable;
public class ControllingButton extends JButton implements ActionListener {
private static ControllingButton instance = null;
private ControllingButton() {
private I_PanelChangeable mainFrame = null;
private ControllingButton(I_PanelChangeable mainFrame) {
this.mainFrame = mainFrame;
this.setText("Controlling");
this.addActionListener(this);
}
public static ControllingButton getInstance() {
public static ControllingButton getInstance(I_PanelChangeable mainFrame) {
if (instance == null) {
instance = new ControllingButton();
instance = new ControllingButton(mainFrame);
}
return instance;
}
@@ -32,8 +36,8 @@ public class ControllingButton extends JButton implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
this.setEnabled(false);
MonitoringButton.getInstance().setEnabled(true);
MainFrame.getInstance().setPanel(Panel.ControllingPanel);
MonitoringButton.getInstance(null).setEnabled(true);
this.mainFrame.setPanel(Panel.ControllingPanel);
}
}

View File

@@ -12,19 +12,23 @@ import javax.swing.JButton;
import gui.src.constants.GUIConstants.Panel;
import gui.src.frames.MainFrame;
import gui.src.interfaces.I_PanelChangeable;
public class MonitoringButton extends JButton implements ActionListener {
private static MonitoringButton instance = null;
private MonitoringButton() {
private I_PanelChangeable mainFrame = null;
private MonitoringButton(I_PanelChangeable mainFrame) {
this.mainFrame = mainFrame;
this.setText("Monitoring");
this.addActionListener(this);
}
public static MonitoringButton getInstance() {
public static MonitoringButton getInstance(I_PanelChangeable mainFrame) {
if (instance == null) {
instance = new MonitoringButton();
instance = new MonitoringButton(mainFrame);
}
return instance;
}
@@ -32,8 +36,8 @@ public class MonitoringButton extends JButton implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
this.setEnabled(false);
ControllingButton.getInstance().setEnabled(true);
MainFrame.getInstance().setPanel(Panel.MonitoringPanel);
ControllingButton.getInstance(null).setEnabled(true);
mainFrame.setPanel(Panel.MonitoringPanel);
}
}

View File

@@ -0,0 +1,30 @@
package gui.src.panels.StatusPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import gui.src.panels.ControllingPanel.ControllingPanel;
public class NextButton extends JButton implements ActionListener {
private static NextButton instance = null;
private NextButton() {
this.setText("->");
this.addActionListener(this);
}
public static NextButton getInstance() {
if (instance == null) {
instance = new NextButton();
}
return instance;
}
@Override
public void actionPerformed(ActionEvent e) {
ControllingPanel.getInstance().nextButtonEvent();
}
}

View File

@@ -0,0 +1,29 @@
package gui.src.panels.StatusPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import gui.src.panels.ControllingPanel.ControllingPanel;
public class PreviousButton extends JButton implements ActionListener {
private static PreviousButton instance = null;
private PreviousButton() {
this.setText("<-");
this.addActionListener(this);
}
public static PreviousButton getInstance() {
if (instance == null) {
instance = new PreviousButton();
}
return instance;
}
@Override
public void actionPerformed(ActionEvent e) {
ControllingPanel.getInstance().previousButtonEvent();
}
}

View File

@@ -6,6 +6,7 @@
package gui.src.panels.StatusPanel;
import gui.src.constants.GUIConstants;
import gui.src.interfaces.I_PanelChangeable;
import javax.swing.*;
import java.awt.*;
@@ -13,38 +14,63 @@ import java.awt.*;
public class StatusPanel extends JPanel {
private static StatusPanel instance;
private final JPanel flowPanel;
private final JPanel flowPanelWest;
private final JPanel flowPanelEast;
private final JLabel statusLabel;
private final JButton monitoringButton;
private final JButton controllingButton;
private StatusPanel() {
private final JButton nextControllingButton;
private final JButton previousControllingButton;
private StatusPanel(I_PanelChangeable mainFrame) {
this.statusLabel = new JLabel("Status: Disconnected");
this.monitoringButton = MonitoringButton.getInstance();
this.controllingButton = ControllingButton.getInstance();
this.monitoringButton = MonitoringButton.getInstance(mainFrame);
this.controllingButton = ControllingButton.getInstance(mainFrame);
this.nextControllingButton = NextButton.getInstance();
this.previousControllingButton = PreviousButton.getInstance();
this.monitoringButton.setVisible(false);
this.controllingButton.setVisible(false);
this.flowPanel = new JPanel();
this.flowPanel.setLayout(new FlowLayout());
this.flowPanel.add(this.statusLabel);
this.flowPanel.add(this.monitoringButton);
this.flowPanel.add(this.controllingButton);
this.nextControllingButton.setVisible(false);
this.previousControllingButton.setVisible(false);
this.flowPanelWest = new JPanel();
this.flowPanelWest.setLayout(new FlowLayout());
this.flowPanelWest.add(this.statusLabel);
this.flowPanelWest.add(this.monitoringButton);
this.flowPanelWest.add(this.controllingButton);
GridBagConstraints flowPanelConstraints = new GridBagConstraints();
flowPanelConstraints.anchor = GridBagConstraints.WEST;
flowPanelConstraints.weightx = 1;
flowPanelConstraints.gridx = 0;
flowPanelConstraints.weightx = 0.5;
flowPanelConstraints.weighty = 1;
flowPanelConstraints.insets = new Insets(0, 0, 0, 0);
this.setLayout(new GridBagLayout());
this.add(this.flowPanel, flowPanelConstraints);
this.add(this.flowPanelWest, flowPanelConstraints);
this.flowPanelEast = new JPanel();
this.flowPanelEast.setLayout(new FlowLayout());
this.flowPanelEast.add(this.previousControllingButton);
this.flowPanelEast.add(this.nextControllingButton);
GridBagConstraints flowPanelConstraintsEast = new GridBagConstraints();
flowPanelConstraintsEast.anchor = GridBagConstraints.EAST;
flowPanelConstraintsEast.gridx = 1;
flowPanelConstraintsEast.weightx = 0.5;
flowPanelConstraintsEast.weighty = 1;
flowPanelConstraintsEast.insets = new Insets(0, 0, 0, 0);
this.setLayout(new GridBagLayout());
this.add(this.flowPanelEast, flowPanelConstraintsEast);
}
public static StatusPanel getInstance() {
public static StatusPanel getInstance(I_PanelChangeable mainFrame) {
if (null == instance) {
instance = new StatusPanel();
instance = new StatusPanel(mainFrame);
}
return instance;
}
@@ -70,4 +96,9 @@ public class StatusPanel extends JPanel {
}break;
}
}
public void setPreviousNextButtonsVisible(boolean isVisble) {
this.previousControllingButton.setVisible(isVisble);
this.nextControllingButton.setVisible(isVisble);
}
}

View File

@@ -1,30 +1,91 @@
/**
* @author Aaron Moser
* @date 31.10.2023
* @lastCHange 06.01.2024
*/
package main.src;
import controller.src.Controller;
import controller.src.ControllerThread;
import controller.src.interfaces.I_Controller;
import gui.src.I_View;
import gui.src.ViewThread;
import model.src.ModelRepresentation;
import model.src.I_Model;
import model.src.Model;
import queues.src.ControllerToViewQueue;
import queues.src.ViewToControllerQueue;
import presenter.src.PresenterThread;
import presenter.src.interfaces.I_Presenter;
import queues.src.Controller_To_Presenter_Queue;
import queues.src.Presenter_To_Controller_Queue;
import queues.src.Presenter_To_View_Queue;
import queues.src.ViewEventManager_To_Controller_Queue;
import queues.src.ViewEventManager_To_Presenter_Queue;
import queues.src.View_To_ViewEventManager_Queue;
import viewEventManager.src.ViewEventManagerThread;
import viewEventManager.src.interfaces.I_ViewEventManager;
import viewModel.src.enums.E_Language;
import viewModel.src.enums.E_Status;
import viewModel.src.informations.StatusPanel_Information;
import viewModel.src.interfaces.I_ViewModel;
import viewModel.src.models.ConnectToServerPanel_ViewModel;
import viewModel.src.models.ControllingPanel_ViewModel;
import viewModel.src.models.MonitoringPanel_ViewModel;
import viewModel.src.models.StatusPanel_ViewModel;
import viewModel.src.models.ViewModel;
public final class Main {
public static void main(String[] args) {
ControllerToViewQueue.getInstance();
ViewToControllerQueue.getInstance();
ViewThread.getInstance().start();
Controller_To_Presenter_Queue controller_to_presenter_queue = new Controller_To_Presenter_Queue();
ModelRepresentation model = new ModelRepresentation();
ViewEventManager_To_Controller_Queue viewEventManager_to_controller_queue = new ViewEventManager_To_Controller_Queue();
ViewEventManager_To_Presenter_Queue viewEventManager_to_presenter_queue = new ViewEventManager_To_Presenter_Queue();
Controller controller = new ControllerThread(model);
Presenter_To_Controller_Queue presenter_to_controller_queue = new Presenter_To_Controller_Queue();
Presenter_To_View_Queue presenter_to_view_queue = new Presenter_To_View_Queue();
View_To_ViewEventManager_Queue view_to_viewEventManager_queue = new View_To_ViewEventManager_Queue();
I_Model model = new Model();
I_ViewModel viewModel = new ViewModel(
E_Language.German,
new StatusPanel_ViewModel(new StatusPanel_Information(E_Language.German, E_Status.Disconnected)),
new ConnectToServerPanel_ViewModel(E_Language.German),
new MonitoringPanel_ViewModel(E_Language.German),
new ControllingPanel_ViewModel(E_Language.German));
I_Presenter presenter = new PresenterThread(
model,
viewModel,
viewEventManager_to_presenter_queue,
presenter_to_controller_queue,
controller_to_presenter_queue,
presenter_to_view_queue);
I_Controller controller = new ControllerThread(
model,
viewEventManager_to_controller_queue,
controller_to_presenter_queue,
presenter_to_controller_queue);
I_ViewEventManager viewEventManager = new ViewEventManagerThread(
viewEventManager_to_controller_queue,
viewEventManager_to_presenter_queue,
view_to_viewEventManager_queue);
I_View view = new ViewThread(
viewModel,
presenter_to_view_queue,
view_to_viewEventManager_queue);
viewEventManager.start();
controller.start();
presenter.start();
view.start();
}
}

View File

@@ -0,0 +1,14 @@
/**
* @author Aaron Moser
* @date 01.12.2023
*/
package model.src;
import model.src.NFTable.NFTablesModel;
public interface I_Model {
public int getFetchID();
public NetworkModel getNetworkModel();
public NFTablesModel getNFTablesModel();
public ConnectionModel getConnectionModel();
}

View File

@@ -1,11 +1,42 @@
/**
* @author Aaron Moser
* @date 01.12.2023
* @lastChange 04.01.2024
*/
package model.src;
public interface Model {
public NetworkModel getNetworkModel();
public NFTablesModel getNFTablesModel();
public ConnectionModel getConnectionModel();
import model.src.NFTable.NFTablesModel;
public class Model implements I_Model {
private int actualFetchID = 0;
private NetworkModel networkModel;
private NFTablesModel nfTablesModel;
private ConnectionModel connectionModel;
public Model() {
this.networkModel = new NetworkModel();
this.nfTablesModel = NFTablesModel.getInstance();
this.connectionModel = new ConnectionModel();
}
@Override
public synchronized NetworkModel getNetworkModel() {
return this.networkModel;
}
@Override
public synchronized NFTablesModel getNFTablesModel() {
return this.nfTablesModel;
}
@Override
public synchronized ConnectionModel getConnectionModel() {
return this.connectionModel;
}
@Override
public int getFetchID() {
return this.actualFetchID;
}
}

View File

@@ -4,6 +4,7 @@ public class ModelConstants {
public enum AccessModifier {
ReadAllEntries,
WriteEntry,
WriteEntries,
DeleteEntry,
DeleteAllEntries
}

View File

@@ -1,29 +0,0 @@
/**
* @author Aaron Moser
* @date 01.12.2023
*/
package model.src;
public class ModelRepresentation implements Model {
private NetworkModel networkModel;
private NFTablesModel nfTablesModel;
private ConnectionModel connectionModel;
public ModelRepresentation() {
this.networkModel = new NetworkModel();
this.nfTablesModel = new NFTablesModel();
this.connectionModel = new ConnectionModel();
}
public synchronized NetworkModel getNetworkModel() {
return this.networkModel;
}
public synchronized NFTablesModel getNFTablesModel() {
return this.nfTablesModel;
}
public synchronized ConnectionModel getConnectionModel() {
return this.connectionModel;
}
}

View File

@@ -0,0 +1,10 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
*/
package model.src.NFTable;
public record NFTChain(String family, String name, String tableName, int handle, NFTExpression expr) {
}

View File

@@ -0,0 +1,10 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
*/
package model.src.NFTable;
public record NFTExpression(String action, String target) {
}

View File

@@ -0,0 +1,5 @@
package model.src.NFTable;
public record NFTRule(String family, String tableName, String chainName, int handle, NFTExpression expr) {
}

View File

@@ -0,0 +1,10 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
*/
package model.src.NFTable;
public record NFTable(String family, String name, int handle) {
}

View File

@@ -0,0 +1,99 @@
/**
* @author Aaron Moser
* @date 01.12.2023
* @lastChange 05.01.2024
*/
package model.src.NFTable;
import java.util.HashMap;
import java.util.LinkedList;
import model.src.ModelConstants.AccessModifier;
public final class NFTablesModel {
private static NFTablesModel instance = null;
private LinkedList<NFTable> tables = null;
private HashMap<String, LinkedList<NFTChain>> chains = null;
private HashMap<String, LinkedList<NFTRule>> rules = null;
private NFTablesModel() {
this.tables = new LinkedList<NFTable>();
this.chains = new HashMap<String, LinkedList<NFTChain>>();
this.rules = new HashMap<String, LinkedList<NFTRule>>();
}
public static synchronized NFTablesModel getInstance() {
if (instance == null) {
instance = new NFTablesModel();
}
return instance;
}
public synchronized LinkedList<NFTable> accessTables(AccessModifier am, LinkedList<NFTable> newTables) {
switch (am) {
case AccessModifier.ReadAllEntries: {
return getTables();
}
case AccessModifier.WriteEntries: {
this.tables = new LinkedList<NFTable>(newTables);
}break;
default: {
// Do nothing in other cases.
}break;
}
return null;
}
private LinkedList<NFTable> getTables() {
return new LinkedList<NFTable>(this.tables);
}
public synchronized LinkedList<NFTChain> accessChains(AccessModifier am, LinkedList<NFTChain> newChains, String tableName) {
switch (am) {
case AccessModifier.ReadAllEntries: {
return getChains(tableName);
}
case AccessModifier.WriteEntries: {
this.chains.put(tableName, new LinkedList<NFTChain>(newChains));
}break;
default: {
// Do nothing in other cases.
}break;
}
return null;
}
private LinkedList<NFTChain> getChains(String table) {
LinkedList<NFTChain> maybeChains = this.chains.get(table);
if (maybeChains != null) {
return new LinkedList<NFTChain>(maybeChains);
} else {
return null;
}
}
public synchronized LinkedList<NFTRule> accessRules(AccessModifier am, LinkedList<NFTRule> newRules, String chainName) {
switch (am) {
case AccessModifier.ReadAllEntries: {
return getRules(chainName);
}
case AccessModifier.WriteEntries: {
this.rules.put(chainName, new LinkedList<NFTRule>(newRules));
}break;
default: {
// Do nothing in other cases.
}break;
}
return null;
}
private LinkedList<NFTRule> getRules(String chain) {
LinkedList<NFTRule> maybeRules = this.rules.get(chain);
if (maybeRules != null) {
return new LinkedList<NFTRule>(maybeRules);
} else {
return null;
}
}
}

View File

@@ -1,32 +0,0 @@
/**
* @author Aaron Moser
* @date 01.12.2023
*/
package model.src;
import controller.src.DataProcessing.nftablesProcessing.NFTableInformation;
import model.src.ModelConstants.AccessModifier;
public final class NFTablesModel {
private NFTableInformation nfTableInformation = null;
public NFTablesModel() {}
public synchronized NFTableInformation accessNFTConfiguration(AccessModifier accessModifier, NFTableInformation nftInf) {
switch (accessModifier) {
case ReadAllEntries: {
return new NFTableInformation(nfTableInformation);
}//break;
case WriteEntry: {
this.nfTableInformation = new NFTableInformation(nftInf);
}break;
case DeleteAllEntries: {
this.nfTableInformation = new NFTableInformation();
}break;
case DeleteEntry: // Intended fall through
default: {
}break;
}
return null;
}
}

View File

@@ -0,0 +1,106 @@
package presenter.src;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import controller.src.events.UpdateViewModel;
import controller.src.interfaces.I_ControllerEvent;
import model.src.I_Model;
import presenter.src.interfaces.I_Presenter;
import queues.src.Controller_To_Presenter_Queue;
import queues.src.Presenter_To_Controller_Queue;
import queues.src.Presenter_To_View_Queue;
import queues.src.ViewEventManager_To_Presenter_Queue;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
import viewEventManager.src.events.ZZ_General.ZZ_EmptyViewEvent;
import viewEventManager.src.events.ZZ_General.ZZ_FetchCompleted;
import viewModel.src.interfaces.I_ViewModel;
public class PresenterThread extends Thread implements I_Presenter {
private I_Model model = null;
private I_ViewModel viewModel = null;
private ViewEventManager_To_Presenter_Queue viewEventManager_To_Presenter_Queue = null;
private Presenter_To_Controller_Queue presenter_To_Controller_Queue = null;
private Controller_To_Presenter_Queue controller_To_Presenter_Queue = null;
private Presenter_To_View_Queue presenter_To_View_Queue = null;
private Queue<Integer> fetchQueue = new ConcurrentLinkedQueue<Integer>();
public PresenterThread(
I_Model model,
I_ViewModel viewModel,
ViewEventManager_To_Presenter_Queue viewEventManager_To_Presenter_Queue,
Presenter_To_Controller_Queue presenter_To_Controller_Queue,
Controller_To_Presenter_Queue controller_To_Presenter_Queue,
Presenter_To_View_Queue presenter_To_View_Queue) {
this.model = model;
this.viewModel = viewModel;
this.viewEventManager_To_Presenter_Queue = viewEventManager_To_Presenter_Queue;
this.presenter_To_Controller_Queue = presenter_To_Controller_Queue;
this.controller_To_Presenter_Queue = controller_To_Presenter_Queue;
this.presenter_To_View_Queue = presenter_To_View_Queue;
}
@Override
public void run() {
I_ViewEvent viewEvent = new ZZ_EmptyViewEvent();
while (viewEvent.getEventType() != E_ViewEvent.ZZ_ExitApplication) {
I_ControllerEvent controllerEvent = controller_To_Presenter_Queue.poll();
handleControllerEvent(controllerEvent);
viewEvent = viewEventManager_To_Presenter_Queue.poll();
handleViewEvent(viewEvent);
if (viewEvent == null) {
viewEvent = new ZZ_EmptyViewEvent();
}
}
}
private void handleControllerEvent(I_ControllerEvent controllerEvent) {
if (controllerEvent != null) {
switch (controllerEvent.getEventType()) {
case ConnectToServerSuccessful: {
}break;
case UpdateViewModel: {
UpdateViewModel event = (UpdateViewModel)controllerEvent;
fetchQueue.add(event.fetchID());
// TODO update viewModel with data from model
}break;
default:
break;
}
}
}
private void handleViewEvent(I_ViewEvent viewEvent) {
if (viewEvent != null) {
switch (viewEvent.getEventType()) {
case AA_ConnectToServerButtonGotPressed: {
}break;
case ZZ_FetchCompleted: {
ZZ_FetchCompleted event = (ZZ_FetchCompleted)viewEvent;
if (event.fetchID() == fetchQueue.peek()) {
fetchQueue.poll();
} else {
// TODO error
}
}break;
default:
break;
}
}
}
}

View File

@@ -0,0 +1,10 @@
/**
* @author Aaron Moser
* @date 07.01.2024
* @lastChange 07.01.2024
*/
package presenter.src.enums;
public enum E_PresenterEvent {
FetchData
}

View File

@@ -0,0 +1,18 @@
/**
* @author Aaron Moser
* @date 07.01.2024
* @lastChange 07.01.2024
*/
package presenter.src.events;
import presenter.src.enums.E_PresenterEvent;
import presenter.src.interfaces.I_PresenterEvent;
public final record FetchData(int id) implements I_PresenterEvent {
@Override
public E_PresenterEvent getType() {
return E_PresenterEvent.FetchData;
}
}

View File

@@ -0,0 +1,7 @@
package presenter.src.interfaces;
import gui.src.I_View;
public interface I_Presenter {
public void start();
}

View File

@@ -0,0 +1,7 @@
package presenter.src.interfaces;
import presenter.src.enums.E_PresenterEvent;
public interface I_PresenterEvent {
public E_PresenterEvent getType();
}

View File

@@ -1,20 +0,0 @@
/**
* @author Aaron Moser
* @date 04.12.2023
*/
package queues.src;
import java.util.concurrent.ConcurrentLinkedQueue;
import data.src.ControllerToView.ControllerToViewData;
public class ControllerToViewQueue extends ConcurrentLinkedQueue<ControllerToViewData> {
private static ControllerToViewQueue controllerToViewQueueInstance;
public static ControllerToViewQueue getInstance() {
if (null == controllerToViewQueueInstance) {
controllerToViewQueueInstance = new ControllerToViewQueue();
}
return controllerToViewQueueInstance;
}
}

View File

@@ -0,0 +1,9 @@
package queues.src;
import java.util.concurrent.ConcurrentLinkedQueue;
import controller.src.interfaces.I_ControllerEvent;
public class Controller_To_Presenter_Queue extends ConcurrentLinkedQueue<I_ControllerEvent> {
}

View File

@@ -0,0 +1,9 @@
package queues.src;
import java.util.concurrent.ConcurrentLinkedQueue;
import data.src.Presenter_To_Controller.Presenter_To_Controller_Data;
public class Presenter_To_Controller_Queue extends ConcurrentLinkedQueue<Presenter_To_Controller_Data>{
}

View File

@@ -0,0 +1,9 @@
package queues.src;
import java.util.concurrent.LinkedBlockingQueue;
import data.src.Presenter_To_View.Presenter_To_View_Data;
public class Presenter_To_View_Queue extends LinkedBlockingQueue<Presenter_To_View_Data> {
}

View File

@@ -0,0 +1,9 @@
package queues.src;
import java.util.concurrent.ConcurrentLinkedQueue;
import viewEventManager.src.events.I_ViewEvent;
public class ViewEventManager_To_Controller_Queue extends ConcurrentLinkedQueue<I_ViewEvent> {
}

View File

@@ -0,0 +1,9 @@
package queues.src;
import java.util.concurrent.ConcurrentLinkedQueue;
import viewEventManager.src.events.I_ViewEvent;
public class ViewEventManager_To_Presenter_Queue extends ConcurrentLinkedQueue<I_ViewEvent> {
}

View File

@@ -1,23 +0,0 @@
/**
* @author Aaron Moser
* @date 04.12.2023
*/
package queues.src;
import java.util.concurrent.ConcurrentLinkedQueue;
import data.src.ViewToController.ViewToControllerData;
/**
*
*/
public class ViewToControllerQueue extends ConcurrentLinkedQueue<ViewToControllerData> {
private static ViewToControllerQueue viewToControllerQueueInstance;
public static ViewToControllerQueue getInstance() {
if (null == viewToControllerQueueInstance) {
viewToControllerQueueInstance = new ViewToControllerQueue();
}
return viewToControllerQueueInstance;
}
}

View File

@@ -0,0 +1,9 @@
package queues.src;
import java.util.concurrent.LinkedBlockingQueue;
import viewEventManager.src.events.I_ViewEvent;
public class View_To_ViewEventManager_Queue extends LinkedBlockingQueue<I_ViewEvent>{
}

View File

@@ -0,0 +1,44 @@
package viewEventManager.src;
import queues.src.ViewEventManager_To_Controller_Queue;
import queues.src.ViewEventManager_To_Presenter_Queue;
import queues.src.View_To_ViewEventManager_Queue;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
import viewEventManager.src.events.ZZ_General.ZZ_EmptyViewEvent;
import viewEventManager.src.interfaces.I_ViewEventManager;
public final class ViewEventManagerThread extends Thread implements I_ViewEventManager {
ViewEventManager_To_Controller_Queue viewEventManager_To_Controller_Queue = null;
ViewEventManager_To_Presenter_Queue viewEventManager_To_Presenter_Queue = null;
View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue = null;
public ViewEventManagerThread(
ViewEventManager_To_Controller_Queue viewEventManager_To_Controller_Queue,
ViewEventManager_To_Presenter_Queue viewEventManager_To_Presenter_Queue,
View_To_ViewEventManager_Queue view_To_ViewEventManager_Queue) {
this.viewEventManager_To_Controller_Queue = viewEventManager_To_Controller_Queue;
this.viewEventManager_To_Presenter_Queue = viewEventManager_To_Presenter_Queue;
this.view_To_ViewEventManager_Queue = view_To_ViewEventManager_Queue;
}
@Override
public void run() {
I_ViewEvent event = new ZZ_EmptyViewEvent();
while (event.getEventType() != E_ViewEvent.ZZ_ExitApplication) {
try {
I_ViewEvent newEvent = this.view_To_ViewEventManager_Queue.take();
viewEventManager_To_Controller_Queue.add(newEvent);
viewEventManager_To_Presenter_Queue.add(newEvent);
event = newEvent;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

View File

@@ -0,0 +1,10 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
*/
package viewEventManager.src.data.AH_RuleData;
public final record AH_RuleData(int id) {
}

View File

@@ -0,0 +1,16 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AA_ConnectToServerPanelEvents;
import viewEventManager.src.data.AA_ConnectToServerData.AA_ConnectToServerData;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AA_ConnectToServerButtonGotPressed(AA_ConnectToServerData connectToServerData) implements I_ViewEvent {
public E_ViewEvent getEventType() {
return E_ViewEvent.AA_ConnectToServerButtonGotPressed;
}
}

View File

@@ -1,17 +1,17 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AB_StatusPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AB_GoToControllingPanelButtonGotPressed() implements ViewEvent {
public final record AB_GoToControllingPanelButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AB_GoToControllingPanelButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AB_GoToControllingPanelButtonGotPressed;
}
}

View File

@@ -1,17 +1,17 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AB_StatusPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AB_GoToMonitoringPanelButtonGotPressed() implements ViewEvent {
public final record AB_GoToMonitoringPanelButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AB_GoToMonitoringPanelButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AB_GoToMonitoringPanelButtonGotPressed;
}
}

View File

@@ -1,17 +1,17 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AB_StatusPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AB_GoToNextPanelButtonGotPressed() implements ViewEvent {
public final record AB_GoToNextPanelButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AB_GoToNextPanelButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AB_GoToNextPanelButtonGotPressed;
}
}

View File

@@ -1,17 +1,17 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AB_StatusPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AB_GoToPreviousPanelButtonGotPressed() implements ViewEvent {
public final record AB_GoToPreviousPanelButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AB_GoToPreviousPanelButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AB_GoToPreviousPanelButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AC_MonitoringPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AC_ActiveConnectionsPanelWasClicked() implements ViewEvent {
public final record AC_ActiveConnectionsPanelWasClicked() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AC_ActiveConnectionsPanelWasClicked;
public E_ViewEvent getEventType() {
return E_ViewEvent.AC_ActiveConnectionsPanelWasClicked;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AC_MonitoringPanelEvents;
import viewEventManager.src.data.AC_AlarmData.AC_AlarmData;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AC_AlarmIDxGotPressed(AC_AlarmData alarmData) implements ViewEvent {
public final record AC_AlarmIDxGotPressed(AC_AlarmData alarmData) implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AC_AlarmIDxGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AC_AlarmIDxGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AC_MonitoringPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AC_LogsButtonGotPressed() implements ViewEvent {
public final record AC_LogsButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AC_LogsButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AC_LogsButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AC_MonitoringPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AC_RequestsPanelWasClicked() implements ViewEvent {
public final record AC_RequestsPanelWasClicked() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AC_RequestsPanelWasClicked;
public E_ViewEvent getEventType() {
return E_ViewEvent.AC_RequestsPanelWasClicked;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AC_MonitoringPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AC_SystemInformationPanelWasClicked() implements ViewEvent {
public final record AC_SystemInformationPanelWasClicked() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AC_SystemInformationPanelWasClicked;
public E_ViewEvent getEventType() {
return E_ViewEvent.AC_SystemInformationPanelWasClicked;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AC_MonitoringPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AC_TopProtocolsCakePanelWasClicked() implements ViewEvent {
public final record AC_TopProtocolsCakePanelWasClicked() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AC_TopProtocolsCakePanelWasClicked;
public E_ViewEvent getEventType() {
return E_ViewEvent.AC_TopProtocolsCakePanelWasClicked;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AD_ControllingPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AD_AddNewPortButoonGotPressed() implements ViewEvent {
public final record AD_AddNewPortButoonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AD_AddNewPortButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AD_AddNewPortButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AD_ControllingPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AD_NFTablesButtonGotPressed() implements ViewEvent {
public final record AD_NFTablesButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AD_NFTablesButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AD_NFTablesButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AE_NFTablesFamilyPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AE_DownloadConfigurationButtonGotPressed() implements ViewEvent {
public final record AE_DownloadConfigurationButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AE_DownloadConfigurationButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AE_DownloadConfigurationButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AE_NFTablesFamilyPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AE_IPv4FamilyButtonGotPressed() implements ViewEvent {
public final record AE_IPv4FamilyButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AE_IPv4FamilyButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AE_IPv4FamilyButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AE_NFTablesFamilyPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AE_IPv6FamilyButtonGotPressed() implements ViewEvent {
public final record AE_IPv6FamilyButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AE_IPv6FamilyButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AE_IPv6FamilyButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AE_NFTablesFamilyPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AE_InetFamilyButtonGotPressed() implements ViewEvent {
public final record AE_InetFamilyButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AE_InetFamilyButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AE_InetFamilyButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AF_NFTablesTablesPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AF_DownloadTablesButtonGotPressed() implements ViewEvent {
public final record AF_DownloadTablesButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AF_DownloadTablesButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AF_DownloadTablesButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AF_NFTablesTablesPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AF_IPv4FamilyButtonGotPressed() implements ViewEvent {
public final record AF_IPv4FamilyButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AF_IPv4FamilyButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AF_IPv4FamilyButtonGotPressed;
}
}

View File

@@ -1,18 +1,18 @@
/**
* @author Aaron Moser
* @date 05.01.2024
* @lastChange 05.01.2024
* @lastChange 07.01.2024
*/
package viewEventManager.src.events.AF_NFTablesTablesPanelEvents;
import viewEventManager.src.events.EViewEvent;
import viewEventManager.src.events.ViewEvent;
import viewEventManager.src.events.E_ViewEvent;
import viewEventManager.src.events.I_ViewEvent;
public final record AF_IPv6FamilyButtonGotPressed() implements ViewEvent {
public final record AF_IPv6FamilyButtonGotPressed() implements I_ViewEvent {
@Override
public EViewEvent getEventType() {
return EViewEvent.AF_IPv6FamilyButtonGotPressed;
public E_ViewEvent getEventType() {
return E_ViewEvent.AF_IPv6FamilyButtonGotPressed;
}
}

Some files were not shown because too many files have changed in this diff Show More