Upload project.
This commit is contained in:
parent
d40edb5e0f
commit
df77876206
183
.gitignore
vendored
Normal file
183
.gitignore
vendored
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
### Java ###
|
||||||
|
# Compiled class file
|
||||||
|
*.class
|
||||||
|
|
||||||
|
# Log file
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# BlueJ files
|
||||||
|
*.ctxt
|
||||||
|
|
||||||
|
# Mobile Tools for Java (J2ME)
|
||||||
|
.mtj.tmp/
|
||||||
|
|
||||||
|
# Package Files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.nar
|
||||||
|
*.ear
|
||||||
|
*.zip
|
||||||
|
*.tar.gz
|
||||||
|
*.rar
|
||||||
|
|
||||||
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
### Maven ###
|
||||||
|
target/
|
||||||
|
pom.xml.tag
|
||||||
|
pom.xml.releaseBackup
|
||||||
|
pom.xml.versionsBackup
|
||||||
|
pom.xml.next
|
||||||
|
release.properties
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
buildNumber.properties
|
||||||
|
.mvn/timing.properties
|
||||||
|
.mvn/wrapper/maven-wrapper.jar
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
nbproject/private/
|
||||||
|
build/
|
||||||
|
nbbuild/
|
||||||
|
dist/
|
||||||
|
nbdist/
|
||||||
|
.nb-gradle/
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
|
||||||
|
.metadata
|
||||||
|
bin/
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*~.nib
|
||||||
|
local.properties
|
||||||
|
.settings/
|
||||||
|
.loadpath
|
||||||
|
.recommenders
|
||||||
|
|
||||||
|
# External tool builders
|
||||||
|
.externalToolBuilders/
|
||||||
|
|
||||||
|
# Locally stored "Eclipse launch configurations"
|
||||||
|
*.launch
|
||||||
|
|
||||||
|
# PyDev specific (Python IDE for Eclipse)
|
||||||
|
*.pydevproject
|
||||||
|
|
||||||
|
# CDT-specific (C/C++ Development Tooling)
|
||||||
|
.cproject
|
||||||
|
|
||||||
|
# CDT- autotools
|
||||||
|
.autotools
|
||||||
|
|
||||||
|
# Java annotation processor (APT)
|
||||||
|
.factorypath
|
||||||
|
|
||||||
|
# PDT-specific (PHP Development Tools)
|
||||||
|
.buildpath
|
||||||
|
|
||||||
|
# sbteclipse plugin
|
||||||
|
.target
|
||||||
|
|
||||||
|
# Tern plugin
|
||||||
|
.tern-project
|
||||||
|
|
||||||
|
# TeXlipse plugin
|
||||||
|
.texlipse
|
||||||
|
|
||||||
|
# STS (Spring Tool Suite)
|
||||||
|
.springBeans
|
||||||
|
|
||||||
|
# Code Recommenders
|
||||||
|
.recommenders/
|
||||||
|
|
||||||
|
# Annotation Processing
|
||||||
|
.apt_generated/
|
||||||
|
|
||||||
|
# Scala IDE specific (Scala & Java development for Eclipse)
|
||||||
|
.cache-main
|
||||||
|
.scala_dependencies
|
||||||
|
.worksheet
|
||||||
|
|
||||||
|
# Eclipse Core
|
||||||
|
.project
|
||||||
|
|
||||||
|
# JDT-specific (Eclipse Java Development Tools)
|
||||||
|
.classpath
|
||||||
|
|
||||||
|
# Annotation Processing
|
||||||
|
.apt_generated
|
||||||
|
|
||||||
|
.sts4-cache/
|
||||||
|
|
||||||
|
### Intellij ###
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
|
# Sonarlint plugin
|
||||||
|
.idea/sonarlint
|
73
build.xml
Normal file
73
build.xml
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- You may freely edit this file. See commented blocks below for -->
|
||||||
|
<!-- some examples of how to customize the build. -->
|
||||||
|
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||||
|
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||||
|
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||||
|
<!-- the Compile on Save feature is turned off for the project. -->
|
||||||
|
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
|
||||||
|
<!-- in the project's Project Properties dialog box.-->
|
||||||
|
<project name="Middleware" default="default" basedir=".">
|
||||||
|
<description>Builds, tests, and runs the project Middleware.</description>
|
||||||
|
<import file="nbproject/build-impl.xml"/>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
There exist several targets which are by default empty and which can be
|
||||||
|
used for execution of your tasks. These targets are usually executed
|
||||||
|
before and after some main targets. They are:
|
||||||
|
|
||||||
|
-pre-init: called before initialization of project properties
|
||||||
|
-post-init: called after initialization of project properties
|
||||||
|
-pre-compile: called before javac compilation
|
||||||
|
-post-compile: called after javac compilation
|
||||||
|
-pre-compile-single: called before javac compilation of single file
|
||||||
|
-post-compile-single: called after javac compilation of single file
|
||||||
|
-pre-compile-test: called before javac compilation of JUnit tests
|
||||||
|
-post-compile-test: called after javac compilation of JUnit tests
|
||||||
|
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||||
|
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||||
|
-pre-jar: called before JAR building
|
||||||
|
-post-jar: called after JAR building
|
||||||
|
-post-clean: called after cleaning build products
|
||||||
|
|
||||||
|
(Targets beginning with '-' are not intended to be called on their own.)
|
||||||
|
|
||||||
|
Example of inserting an obfuscator after compilation could look like this:
|
||||||
|
|
||||||
|
<target name="-post-compile">
|
||||||
|
<obfuscate>
|
||||||
|
<fileset dir="${build.classes.dir}"/>
|
||||||
|
</obfuscate>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
For list of available properties check the imported
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
|
||||||
|
Another way to customize the build is by overriding existing main targets.
|
||||||
|
The targets of interest are:
|
||||||
|
|
||||||
|
-init-macrodef-javac: defines macro for javac compilation
|
||||||
|
-init-macrodef-junit: defines macro for junit execution
|
||||||
|
-init-macrodef-debug: defines macro for class debugging
|
||||||
|
-init-macrodef-java: defines macro for class execution
|
||||||
|
-do-jar: JAR building
|
||||||
|
run: execution of project
|
||||||
|
-javadoc-build: Javadoc generation
|
||||||
|
test-report: JUnit report generation
|
||||||
|
|
||||||
|
An example of overriding the target for project execution could look like this:
|
||||||
|
|
||||||
|
<target name="run" depends="Middleware-impl.jar">
|
||||||
|
<exec dir="bin" executable="launcher.exe">
|
||||||
|
<arg file="${dist.jar}"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
Notice that the overridden target depends on the jar target and not only on
|
||||||
|
the compile target as the regular run target does. Again, for a list of available
|
||||||
|
properties which you can use, check the target you are overriding in the
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
-->
|
||||||
|
</project>
|
3
manifest.mf
Normal file
3
manifest.mf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
X-COMMENT: Main-Class will be added automatically by build
|
||||||
|
|
30
src/middleware/Main.java
Normal file
30
src/middleware/Main.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package middleware;
|
||||||
|
|
||||||
|
import middleware.components.main.MainUI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main
|
||||||
|
*
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public class Main
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args the command line arguments
|
||||||
|
*/
|
||||||
|
public static void main(String[] args)
|
||||||
|
{
|
||||||
|
MainUI main = new MainUI();
|
||||||
|
|
||||||
|
// UserAgent A = new UserAgent("A");
|
||||||
|
// UserAgent B = new UserAgent("B");
|
||||||
|
// Portal P = new Portal(10);
|
||||||
|
// P.addAgent(A);
|
||||||
|
// P.addAgent(B);
|
||||||
|
// P.start();
|
||||||
|
// UserAgentUI Aform = new UserAgentUI(A);
|
||||||
|
// UserAgentUI Bform = new UserAgentUI(B);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
90
src/middleware/StressTest.java
Normal file
90
src/middleware/StressTest.java
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
package middleware;
|
||||||
|
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import middleware.agents.MsgListener;
|
||||||
|
import middleware.agents.Portal;
|
||||||
|
import middleware.agents.Router;
|
||||||
|
import middleware.agents.UserAgent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public class StressTest
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void main(String[] args) throws UnknownHostException
|
||||||
|
{
|
||||||
|
Router r1 = new Router(10000, "1.0.0", 50);
|
||||||
|
Portal p1r1 = new Portal(10000, "1.1.0");
|
||||||
|
Portal p2r1 = new Portal(10000, "1.2.0");
|
||||||
|
UserAgent u1p1r1 = new UserAgent("1.1.1");
|
||||||
|
UserAgent u2p1r1 = new UserAgent("1.1.2");
|
||||||
|
UserAgent u1p2r1 = new UserAgent("1.2.1");
|
||||||
|
r1.addAgent(p1r1);
|
||||||
|
r1.addAgent(p2r1);
|
||||||
|
r1.start();
|
||||||
|
//p1r1.addAgent(p2r1);
|
||||||
|
p1r1.addAgent(u1p1r1);
|
||||||
|
p1r1.addAgent(u2p1r1);
|
||||||
|
p1r1.start();
|
||||||
|
p2r1.addAgent(u1p2r1);
|
||||||
|
p2r1.start();
|
||||||
|
u1p1r1.addListener(new MsgListener() {
|
||||||
|
@Override
|
||||||
|
public void UserAgentMsg(String sender, String msg)
|
||||||
|
{
|
||||||
|
LocalDateTime dateTimeMsg = LocalDateTime.parse(msg);
|
||||||
|
LocalDateTime dateTimeNow = LocalDateTime.now();
|
||||||
|
System.out.println(dateTimeMsg
|
||||||
|
+ " "
|
||||||
|
+ dateTimeNow
|
||||||
|
+ " "
|
||||||
|
+ Duration.between(dateTimeMsg, dateTimeNow).toMillis());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 1 Portal 2 Useragents
|
||||||
|
|
||||||
|
int SENDMSGCOUNT = 1000;
|
||||||
|
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < SENDMSGCOUNT; i++)
|
||||||
|
{
|
||||||
|
u2p1r1.sendMsg(u2p1r1.getAddress(), "1.1.1", LocalDateTime.now().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
for (int i = 0; i < SENDMSGCOUNT; i++)
|
||||||
|
{
|
||||||
|
u2p1r1.sendMsg(u2p1r1.getAddress(), "1.1.1", LocalDateTime.now().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 2 Portals 2 Useragents
|
||||||
|
|
||||||
|
// new Thread(new Runnable() {
|
||||||
|
// @Override
|
||||||
|
// public void run()
|
||||||
|
// {
|
||||||
|
// for (int i = 0; i < SENDMSGCOUNT; i++)
|
||||||
|
// {
|
||||||
|
// u1p2r1.sendMsg(u1p2r1.getAddress(), "1.1.1", LocalDateTime.now().toString());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }).start();
|
||||||
|
//
|
||||||
|
// for (int i = 0; i < SENDMSGCOUNT; i++)
|
||||||
|
// {
|
||||||
|
// u1p2r1.sendMsg(u1p2r1.getAddress(), "1.1.1", LocalDateTime.now().toString());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
48
src/middleware/StressTestSendMsgServer.java
Normal file
48
src/middleware/StressTestSendMsgServer.java
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package middleware;
|
||||||
|
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import middleware.agents.Portal;
|
||||||
|
import middleware.agents.Router;
|
||||||
|
import middleware.agents.UserAgent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public class StressTestSendMsgServer
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void main(String[] args) throws UnknownHostException
|
||||||
|
{
|
||||||
|
Router r2 = new Router(10000, "2.0.0", 100);
|
||||||
|
Portal p1r2 = new Portal(10000, "2.1.0");
|
||||||
|
UserAgent u1p1r2 = new UserAgent("2.1.1");
|
||||||
|
r2.addAgent(p1r2);
|
||||||
|
r2.start();
|
||||||
|
//p1r1.addAgent(p2r1);
|
||||||
|
p1r2.addAgent(u1p1r2);
|
||||||
|
p1r2.start();
|
||||||
|
|
||||||
|
r2.connect("1.0.0", "127.0.0.1", 50);
|
||||||
|
|
||||||
|
int SENDMSGCOUNT = 1000;
|
||||||
|
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < SENDMSGCOUNT; i++)
|
||||||
|
{
|
||||||
|
u1p1r2.sendMsg(u1p1r2.getAddress(), "1.1.1", LocalDateTime.now().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
// for (int i = 0; i < SENDMSGCOUNT; i++)
|
||||||
|
// {
|
||||||
|
// u2p1r1.sendMsg(u2p1r1.getAddress(), "1.1.1", LocalDateTime.now().toString());
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
141
src/middleware/agents/AgentAddress.java
Normal file
141
src/middleware/agents/AgentAddress.java
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
package middleware.agents;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.security.InvalidParameterException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Agent Address
|
||||||
|
* Addresses for metaAgents
|
||||||
|
*
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public final class AgentAddress implements Serializable
|
||||||
|
{
|
||||||
|
|
||||||
|
private int[] address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of AgentAddress
|
||||||
|
* @param sections no. of sections in address
|
||||||
|
* @param addressString address
|
||||||
|
*/
|
||||||
|
public AgentAddress(int sections, String addressString)
|
||||||
|
{
|
||||||
|
address = new int[sections];
|
||||||
|
setAddress(addressString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of AgentAddress
|
||||||
|
* @param sections no. of sections in address
|
||||||
|
*/
|
||||||
|
public AgentAddress(int sections)
|
||||||
|
{
|
||||||
|
this(sections, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of AgentAddress
|
||||||
|
* Default of 3 sections
|
||||||
|
* @param addressString address string
|
||||||
|
*/
|
||||||
|
public AgentAddress(String addressString)
|
||||||
|
{
|
||||||
|
this(3, addressString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates instance of AgentAddress with a 3 section address
|
||||||
|
*/
|
||||||
|
public AgentAddress()
|
||||||
|
{
|
||||||
|
this(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets valid address based off of given string
|
||||||
|
* @param addressString addressString
|
||||||
|
*/
|
||||||
|
public void setAddress(String addressString)
|
||||||
|
{
|
||||||
|
if (addressString != null)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int section = 0;
|
||||||
|
while (i < addressString.length())
|
||||||
|
{
|
||||||
|
int dot = addressString.indexOf('.', i);
|
||||||
|
if (dot != -1)
|
||||||
|
{
|
||||||
|
address[section++] = Integer.parseInt(addressString.substring(i, dot));
|
||||||
|
i = dot + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
address[section] = Integer.parseInt(addressString.substring(i, addressString.length()));
|
||||||
|
i = addressString.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets Address
|
||||||
|
* @return address
|
||||||
|
*/
|
||||||
|
public String getAddress()
|
||||||
|
{
|
||||||
|
return toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes value of address at given section
|
||||||
|
* @param section specified section
|
||||||
|
* @param value new value
|
||||||
|
*/
|
||||||
|
public void setSection(int section, int value)
|
||||||
|
{
|
||||||
|
if (inSectionRange(section))
|
||||||
|
{
|
||||||
|
address[section - 1] = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new InvalidParameterException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean inSectionRange(int section)
|
||||||
|
{
|
||||||
|
return (section > 0 && section <= address.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param section
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int getSection(int section)
|
||||||
|
{
|
||||||
|
if (inSectionRange(section))
|
||||||
|
{
|
||||||
|
return address[section - 1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new InvalidParameterException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String result = "";
|
||||||
|
for (int i = 0; i < address.length; i++)
|
||||||
|
{
|
||||||
|
result += address[i] + ((address.length == i + 1 ? "" : "."));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
209
src/middleware/agents/MetaAgent.java
Normal file
209
src/middleware/agents/MetaAgent.java
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
package middleware.agents;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
import middleware.message.SystemErrorMessage;
|
||||||
|
import middleware.message.wrapper.MetaAgentWrapper;
|
||||||
|
import middleware.observer.Observer;
|
||||||
|
import middleware.observer.Subject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MetaAgent
|
||||||
|
*
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public abstract class MetaAgent extends LinkedBlockingQueue implements Runnable, Subject
|
||||||
|
{
|
||||||
|
|
||||||
|
private AgentAddress address;
|
||||||
|
private Thread thread;
|
||||||
|
private boolean running = true;
|
||||||
|
private ArrayList<MetaAgent> metaAgent = new ArrayList();
|
||||||
|
private List<Observer> listOfObservers = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a <i>MetaAgent</i> with specified properties
|
||||||
|
* @param queueSize the size of the blocking queue
|
||||||
|
* @param addressString address of the MetaAgent
|
||||||
|
*/
|
||||||
|
public MetaAgent(int queueSize, String addressString)
|
||||||
|
{
|
||||||
|
super(queueSize);
|
||||||
|
this.address = new AgentAddress(addressString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs the MessageHandler once thread is started
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
while (running)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
msgHandler(super.take());
|
||||||
|
}
|
||||||
|
catch (InterruptedException ex)
|
||||||
|
{
|
||||||
|
System.out.println("Exiting");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts thread
|
||||||
|
*/
|
||||||
|
public void start()
|
||||||
|
{
|
||||||
|
if (thread == null)
|
||||||
|
{
|
||||||
|
running = true;
|
||||||
|
thread = new Thread(this);
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops thread
|
||||||
|
*/
|
||||||
|
public void stop()
|
||||||
|
{
|
||||||
|
if (thread != null)
|
||||||
|
{
|
||||||
|
running = false;
|
||||||
|
thread.interrupt();
|
||||||
|
thread = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets <i>MetaAgent</i>'s address
|
||||||
|
* @return MetaAgent's Address
|
||||||
|
*/
|
||||||
|
public AgentAddress getAddress()
|
||||||
|
{
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets <i>MetaAgent</i>'s address
|
||||||
|
* @param addressString MetaAgent's Address
|
||||||
|
*/
|
||||||
|
public void setAddress(String addressString)
|
||||||
|
{
|
||||||
|
this.address = new AgentAddress(addressString);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches an observer to the MetaAgent
|
||||||
|
* @param observer observer to be attached (e.g. NodeListener)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void attach(Observer observer) {
|
||||||
|
listOfObservers.add(observer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detaches an observer from the MetaAgent (if it is attached)
|
||||||
|
* @param observer observer to be detached
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void detach(Observer observer) {
|
||||||
|
if(listOfObservers.contains(observer)){
|
||||||
|
listOfObservers.remove(observer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates attached observers with a message
|
||||||
|
* @param msg the message to be sent to the observers
|
||||||
|
* @return whether observers were successfully updated
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean updateObservers(Object msg) {
|
||||||
|
boolean result = false;
|
||||||
|
for (Observer o : listOfObservers){
|
||||||
|
result = o.update(msg);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows for communication between MetaAgents
|
||||||
|
* Adds a MetaAgent
|
||||||
|
* @param agent
|
||||||
|
*/
|
||||||
|
public void addAgent(MetaAgent agent)
|
||||||
|
{
|
||||||
|
// TODO Generate random address
|
||||||
|
if (!metaAgent.contains(agent))
|
||||||
|
{
|
||||||
|
metaAgent.add(agent);
|
||||||
|
agent.addAgent(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles message objects passed to it
|
||||||
|
* @param data message
|
||||||
|
*/
|
||||||
|
public void msgHandler(Object data)
|
||||||
|
{
|
||||||
|
if (data instanceof MetaAgentMessage)
|
||||||
|
{
|
||||||
|
if (getAddress().getSection(1) != ((MetaAgentMessage) data).getMessage().getRecipient().getSection(1))
|
||||||
|
{
|
||||||
|
boolean sent = false;
|
||||||
|
for (int i = 0; i < metaAgent.size() && !sent; i++)
|
||||||
|
{
|
||||||
|
if (metaAgent.get(i).getAddress().toString().equals(this.getAddress().getSection(1) + ".0.0"))
|
||||||
|
{
|
||||||
|
metaAgent.get(i).add(data);
|
||||||
|
sent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!sent)
|
||||||
|
{
|
||||||
|
if (!((MetaAgentMessage) data).getMessage().getSender().getAddress().equals("0.0.0"))
|
||||||
|
{
|
||||||
|
add(MetaAgentWrapper.wrap(new SystemErrorMessage(((MetaAgentMessage) data).getMessage().getRecipient() + " Does not exist?", ((MetaAgentMessage) data).getMessage().getSender().getAddress()), 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boolean sent = false;
|
||||||
|
for (int i = 0; i < metaAgent.size() && !sent; i++)
|
||||||
|
{
|
||||||
|
if (metaAgent.get(i).getAddress().getSection(2) == ((MetaAgentMessage) data).getMessage().getRecipient().getSection(2) && metaAgent.get(i).getAddress().getSection(1) == ((MetaAgentMessage) data).getMessage().getRecipient().getSection(1))
|
||||||
|
{
|
||||||
|
metaAgent.get(i).add(data);
|
||||||
|
sent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!sent)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < metaAgent.size() && !sent; i++)
|
||||||
|
{
|
||||||
|
if (metaAgent.get(i).getAddress().getSection(1) == this.getAddress().getSection(1))
|
||||||
|
{
|
||||||
|
metaAgent.get(i).add(data);
|
||||||
|
sent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!sent)
|
||||||
|
{
|
||||||
|
if (!((MetaAgentMessage) data).getMessage().getSender().getAddress().equals("0.0.0"))
|
||||||
|
{
|
||||||
|
add(MetaAgentWrapper.wrap(new SystemErrorMessage(((MetaAgentMessage) data).getMessage().getRecipient() + " Does not exist?", ((MetaAgentMessage) data).getMessage().getSender().getAddress()), 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
src/middleware/agents/MsgListener.java
Normal file
16
src/middleware/agents/MsgListener.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package middleware.agents;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public interface MsgListener
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param sender
|
||||||
|
* @param msg
|
||||||
|
*/
|
||||||
|
void UserAgentMsg(String sender, String msg);
|
||||||
|
|
||||||
|
}
|
110
src/middleware/agents/Portal.java
Normal file
110
src/middleware/agents/Portal.java
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
package middleware.agents;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
import middleware.message.SystemErrorMessage;
|
||||||
|
import middleware.message.UserMessage;
|
||||||
|
import middleware.message.wrapper.MetaAgentWrapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MetaAgent Portal, for allowing connection between UserAgents and portals
|
||||||
|
*
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public class Portal extends MetaAgent
|
||||||
|
{
|
||||||
|
|
||||||
|
private HashMap<String, UserAgent> routingTable = new HashMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates instance of Portal with specified properties
|
||||||
|
* @param queueSize size of blocking queue
|
||||||
|
* @param address address of MetaAgent
|
||||||
|
*/
|
||||||
|
public Portal(int queueSize, String address)
|
||||||
|
{
|
||||||
|
super(queueSize, address);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a message to the queue
|
||||||
|
* @param e message
|
||||||
|
* @return success
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean add(Object e)
|
||||||
|
{
|
||||||
|
if (e instanceof UserMessage)
|
||||||
|
{
|
||||||
|
return super.add(MetaAgentWrapper.wrap((UserMessage) e, 15));
|
||||||
|
}
|
||||||
|
else if (e instanceof MetaAgentMessage)
|
||||||
|
{
|
||||||
|
return super.add(e);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message handler - handles messages passed to it
|
||||||
|
* @param data the passed message
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void msgHandler(Object data)
|
||||||
|
{
|
||||||
|
if (data instanceof MetaAgentMessage)
|
||||||
|
{
|
||||||
|
MetaAgentMessage MAM = (MetaAgentMessage) data;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
routingTable.get(MAM.getMessage().getRecipient().getAddress()).recieveMsg(MetaAgentWrapper.unwrap((MetaAgentMessage) data));
|
||||||
|
super.updateObservers(data);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
if (MAM.timeToLive > 0)
|
||||||
|
{
|
||||||
|
MAM.decreaseTimeToLive();
|
||||||
|
MAM.increaseHops();
|
||||||
|
super.msgHandler(MAM);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!MAM.getMessage().getSender().getAddress().equals("0.0.0"))
|
||||||
|
{
|
||||||
|
super.msgHandler(MetaAgentWrapper.wrap(new SystemErrorMessage(MAM.getMessage().getRecipient().getAddress() + " Does not exist?", MAM.getMessage().getSender().getAddress()), 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when requested user agent is not found
|
||||||
|
* @param agent message without valid recipient
|
||||||
|
*/
|
||||||
|
private void NoUserAgentFound(MetaAgentMessage agent)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
routingTable.get(agent.getMessage().getSender()).recieveMsg(new SystemErrorMessage(agent.getMessage().getRecipient() + " Does not exist?", agent.getMessage().getSender().getAddress()));
|
||||||
|
}
|
||||||
|
catch (Exception e2)
|
||||||
|
{
|
||||||
|
super.msgHandler(MetaAgentWrapper.wrap(new SystemErrorMessage(agent.getMessage().getRecipient() + " Does not exist?", agent.getMessage().getSender().getAddress()), Integer.MAX_VALUE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows for communication between MetaAgents
|
||||||
|
* Adds a MetaAgent
|
||||||
|
* @param agent
|
||||||
|
*/
|
||||||
|
public void addAgent(UserAgent agent)
|
||||||
|
{
|
||||||
|
// TODO Generate random address
|
||||||
|
routingTable.put(agent.getAddress(), agent);
|
||||||
|
agent.setMetaAgent(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
123
src/middleware/agents/Router.java
Normal file
123
src/middleware/agents/Router.java
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
package middleware.agents;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.Inet4Address;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
import middleware.message.SystemErrorMessage;
|
||||||
|
import middleware.message.UserMessage;
|
||||||
|
import middleware.message.wrapper.MetaAgentWrapper;
|
||||||
|
import middleware.socket.Client;
|
||||||
|
import middleware.socket.Server;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MetaAgent for Routers allowing for communication between different routers
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Router extends MetaAgent {
|
||||||
|
|
||||||
|
int port;
|
||||||
|
Inet4Address ipAddress;
|
||||||
|
private Server listener;
|
||||||
|
private HashMap<String, Client> sender = new HashMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of MetaAgent Router with given properties
|
||||||
|
* @param queueSize size of blocking queue
|
||||||
|
* @param address router address
|
||||||
|
* @param ipAddressIn ip address
|
||||||
|
* @param portIn port
|
||||||
|
* @throws java.net.UnknownHostException
|
||||||
|
*/
|
||||||
|
public Router(int queueSize, String address, int portIn) throws UnknownHostException {
|
||||||
|
super(queueSize, address);
|
||||||
|
ipAddress = (Inet4Address) Inet4Address.getByName(address);
|
||||||
|
port = portIn;
|
||||||
|
listener = new Server(portIn, this);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
listener.create();
|
||||||
|
listener.enableListening();
|
||||||
|
} catch (IOException ex)
|
||||||
|
{
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a message to the queue
|
||||||
|
* @param e message
|
||||||
|
* @return success
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean add(Object e)
|
||||||
|
{
|
||||||
|
if (e instanceof UserMessage)
|
||||||
|
{
|
||||||
|
return super.add(MetaAgentWrapper.wrap((UserMessage) e, 15));
|
||||||
|
}
|
||||||
|
else if (e instanceof MetaAgentMessage)
|
||||||
|
{
|
||||||
|
return super.add(e);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a connection using specified parameters
|
||||||
|
* @param addressString
|
||||||
|
* @param address
|
||||||
|
* @param port
|
||||||
|
*/
|
||||||
|
public void connect(String addressString, String address, int port)
|
||||||
|
{
|
||||||
|
Client client = new Client(address, port);
|
||||||
|
System.out.println(address + " + " + port);
|
||||||
|
sender.put(addressString, client);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.connect();
|
||||||
|
} catch (IOException ex)
|
||||||
|
{
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles message objects passed to it
|
||||||
|
* @param data message
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void msgHandler(Object data)
|
||||||
|
{
|
||||||
|
if (data instanceof MetaAgentMessage)
|
||||||
|
{
|
||||||
|
MetaAgentMessage MAM = (MetaAgentMessage) data;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
sender.get(MAM.getMessage().getRecipient().getSection(1) + ".0.0").send((MetaAgentMessage) data);
|
||||||
|
super.updateObservers(data);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
if (MAM.timeToLive > 0)
|
||||||
|
{
|
||||||
|
MAM.decreaseTimeToLive();
|
||||||
|
MAM.increaseHops();
|
||||||
|
super.msgHandler(MAM);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!MAM.getMessage().getSender().getAddress().equals("0.0.0"))
|
||||||
|
{
|
||||||
|
super.msgHandler(MetaAgentWrapper.wrap(new SystemErrorMessage(MAM.getMessage().getRecipient().getAddress() + " Does not exist?", MAM.getMessage().getSender().getAddress()), 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
76
src/middleware/agents/UserAgent.java
Normal file
76
src/middleware/agents/UserAgent.java
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package middleware.agents;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import middleware.message.Message;
|
||||||
|
import middleware.message.UserMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Agent for a user/node/endpoint
|
||||||
|
* @author JLScott1999
|
||||||
|
*/
|
||||||
|
public class UserAgent
|
||||||
|
{
|
||||||
|
private String address;
|
||||||
|
private MetaAgent metaAgent;
|
||||||
|
private ArrayList<MsgListener> listeners = new ArrayList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of UserAgent with a specified address
|
||||||
|
* @param address Specified address
|
||||||
|
*/
|
||||||
|
public UserAgent(String address)
|
||||||
|
{
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the UserAgent's address
|
||||||
|
* @return address
|
||||||
|
*/
|
||||||
|
public String getAddress()
|
||||||
|
{
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to wrap and send a message to a recipient
|
||||||
|
* @param sender the sender
|
||||||
|
* @param recipient the message recipient
|
||||||
|
* @param message the message content to be sent
|
||||||
|
*/
|
||||||
|
public void sendMsg(String sender, String recipient, String message)
|
||||||
|
{
|
||||||
|
metaAgent.add(new UserMessage(message, recipient, sender, false, "???", "0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set's the UserAgent's MetaAgent (e.g. the portal it belongs to)
|
||||||
|
* @param metaAgent metaAgent to be assigned
|
||||||
|
*/
|
||||||
|
public void setMetaAgent(MetaAgent metaAgent)
|
||||||
|
{
|
||||||
|
this.metaAgent = metaAgent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by msgHandler to receive message
|
||||||
|
* @param data message received
|
||||||
|
*/
|
||||||
|
public void recieveMsg(Message data)
|
||||||
|
{
|
||||||
|
for (MsgListener listener : listeners)
|
||||||
|
{
|
||||||
|
listener.UserAgentMsg(data.getSender().getAddress().toString(), data.getMessage().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a message listener to the UserAgent
|
||||||
|
* @param listener Message Listener
|
||||||
|
*/
|
||||||
|
public void addListener(MsgListener listener)
|
||||||
|
{
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
src/middleware/agents/package-info.java
Normal file
4
src/middleware/agents/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains classes for the Middleware agents
|
||||||
|
*/
|
||||||
|
package middleware.agents;
|
51
src/middleware/components/main/MainUI.java
Normal file
51
src/middleware/components/main/MainUI.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package middleware.components.main;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import middleware.components.main.nodelistener.NodeListener;
|
||||||
|
import middleware.components.main.nodeview.NodeView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Main GUI form
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class MainUI extends JFrame {
|
||||||
|
|
||||||
|
NodeView nodeView;
|
||||||
|
|
||||||
|
NodeListener nodeListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the Main UI
|
||||||
|
*/
|
||||||
|
public MainUI() {
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up all GUI components for the main GUI
|
||||||
|
*/
|
||||||
|
private void setUpComponent() {
|
||||||
|
nodeListener = new NodeListener();
|
||||||
|
|
||||||
|
nodeView = new NodeView(nodeListener);
|
||||||
|
add(nodeView, BorderLayout.WEST);
|
||||||
|
|
||||||
|
JScrollPane nodeListenerScroller = new JScrollPane(nodeListener);
|
||||||
|
nodeListenerScroller.setPreferredSize(new Dimension(880,200));
|
||||||
|
|
||||||
|
add(nodeListenerScroller,BorderLayout.EAST);
|
||||||
|
|
||||||
|
setTitle("Middleware");
|
||||||
|
|
||||||
|
setResizable(false);
|
||||||
|
|
||||||
|
setDefaultCloseOperation(3);
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}
|
||||||
|
}
|
101
src/middleware/components/main/nodelistener/NodeListener.java
Normal file
101
src/middleware/components/main/nodelistener/NodeListener.java
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
|
||||||
|
package middleware.components.main.nodelistener;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import javax.swing.JTable;
|
||||||
|
import javax.swing.table.DefaultTableModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to display output from a NodeMonitor
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class NodeListener extends JTable {
|
||||||
|
DefaultTableModel model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up GUI components for NodeListener
|
||||||
|
*/
|
||||||
|
public NodeListener() {
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
//TTL: Time to live
|
||||||
|
String[] headings = {"Time sent/received","Sender","Receiver","Message","TTL","Hops"};
|
||||||
|
|
||||||
|
model = new DefaultTableModel(headings,0) {
|
||||||
|
@Override
|
||||||
|
public boolean isCellEditable(int row, int column) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
setModel(model);
|
||||||
|
|
||||||
|
setFocusable(false);
|
||||||
|
setRowSelectionAllowed(false);
|
||||||
|
|
||||||
|
getColumnModel().getColumn(0).setPreferredWidth(130);
|
||||||
|
getColumnModel().getColumn(0).setMaxWidth(130);
|
||||||
|
getColumnModel().getColumn(0).setMinWidth(130);
|
||||||
|
getColumnModel().getColumn(0).setResizable(false);
|
||||||
|
|
||||||
|
getColumnModel().getColumn(1).setPreferredWidth(100);
|
||||||
|
getColumnModel().getColumn(1).setMaxWidth(100);
|
||||||
|
getColumnModel().getColumn(1).setMinWidth(100);
|
||||||
|
getColumnModel().getColumn(1).setResizable(false);
|
||||||
|
|
||||||
|
getColumnModel().getColumn(2).setPreferredWidth(100);
|
||||||
|
getColumnModel().getColumn(2).setMaxWidth(100);
|
||||||
|
getColumnModel().getColumn(2).setMinWidth(100);
|
||||||
|
getColumnModel().getColumn(2).setResizable(false);
|
||||||
|
|
||||||
|
getColumnModel().getColumn(3).setMinWidth(450);
|
||||||
|
getColumnModel().getColumn(3).setResizable(true);
|
||||||
|
|
||||||
|
getColumnModel().getColumn(4).setPreferredWidth(50);
|
||||||
|
getColumnModel().getColumn(4).setMaxWidth(50);
|
||||||
|
getColumnModel().getColumn(4).setMinWidth(50);
|
||||||
|
getColumnModel().getColumn(4).setResizable(false);
|
||||||
|
|
||||||
|
getColumnModel().getColumn(5).setPreferredWidth(50);
|
||||||
|
getColumnModel().getColumn(5).setMaxWidth(50);
|
||||||
|
getColumnModel().getColumn(5).setMinWidth(50);
|
||||||
|
getColumnModel().getColumn(5).setResizable(false);
|
||||||
|
|
||||||
|
setRowHeight(20);
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
setOpaque(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a row to the NodeListener Table, using unwrapped message parameters
|
||||||
|
* @param message message content
|
||||||
|
* @param sender sender
|
||||||
|
* @param recipient recipient
|
||||||
|
* @param ttl Time To Live (TTL)
|
||||||
|
* @param hops message hops
|
||||||
|
*/
|
||||||
|
public void addRow(String message, String sender, String recipient, int ttl, int hops) {
|
||||||
|
Object[] tableRow = new Object[6];
|
||||||
|
|
||||||
|
tableRow[0] = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
|
||||||
|
tableRow[1] = sender;
|
||||||
|
tableRow[2] = recipient;
|
||||||
|
tableRow[3] = message;
|
||||||
|
tableRow[4] = ttl;
|
||||||
|
tableRow[5] = hops;
|
||||||
|
|
||||||
|
model.addRow(tableRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears NodeListenerTable
|
||||||
|
*/
|
||||||
|
public void clear() {
|
||||||
|
model.setRowCount(0);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the classes for the NodeListener
|
||||||
|
*/
|
||||||
|
package middleware.components.main.nodelistener;
|
207
src/middleware/components/main/nodeview/NodeTree.java
Normal file
207
src/middleware/components/main/nodeview/NodeTree.java
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
|
||||||
|
package middleware.components.main.nodeview;
|
||||||
|
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.event.MouseListener;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import javax.swing.JTree;
|
||||||
|
import javax.swing.tree.DefaultMutableTreeNode;
|
||||||
|
import javax.swing.tree.DefaultTreeModel;
|
||||||
|
import middleware.agents.MetaAgent;
|
||||||
|
import middleware.agents.Portal;
|
||||||
|
import middleware.agents.Router;
|
||||||
|
import middleware.agents.UserAgent;
|
||||||
|
import middleware.components.main.nodelistener.NodeListener;
|
||||||
|
import middleware.components.useragents.UserAgentUI;
|
||||||
|
import middleware.nodemonitor.NodeMonitor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GUI for NodeTrees
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class NodeTree extends JTree implements MouseListener {
|
||||||
|
|
||||||
|
DefaultTreeModel model;
|
||||||
|
DefaultMutableTreeNode rootNode;
|
||||||
|
NodeListener nodeListener;
|
||||||
|
|
||||||
|
NodeMonitor nm;
|
||||||
|
MetaAgent nmMetaAgent;
|
||||||
|
|
||||||
|
HashMap<String, MetaAgent> MetaAgentMap = new HashMap();
|
||||||
|
HashMap<String, UserAgent> UserAgentMap = new HashMap();
|
||||||
|
|
||||||
|
int id = 1;
|
||||||
|
Router router = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up a NodeTree GUI for given NodeListener
|
||||||
|
* @param nodeListenerIn NodeListener
|
||||||
|
*/
|
||||||
|
public NodeTree(NodeListener nodeListenerIn) {
|
||||||
|
nodeListener = nodeListenerIn;
|
||||||
|
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
rootNode = new DefaultMutableTreeNode("Agents");
|
||||||
|
model = new DefaultTreeModel(rootNode);
|
||||||
|
|
||||||
|
addPortal();
|
||||||
|
|
||||||
|
setModel(model);
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
this.addMouseListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a Router to the nodetree
|
||||||
|
* @param ipAddress ip address of router
|
||||||
|
* @param port router port
|
||||||
|
* @return index of new router
|
||||||
|
* @throws UnknownHostException
|
||||||
|
*/
|
||||||
|
public int addRouter(int id, String ipAddress, int port) throws UnknownHostException {
|
||||||
|
DefaultMutableTreeNode routerNode = new DefaultMutableTreeNode();
|
||||||
|
rootNode.add(routerNode);
|
||||||
|
|
||||||
|
if (router == null)
|
||||||
|
{
|
||||||
|
router = new Router(10, (rootNode.getIndex(routerNode) + id) + ".0.0", port);
|
||||||
|
router.start();
|
||||||
|
MetaAgentMap.put(router.getAddress().getAddress(), router);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
router.connect(id + ".0.0", ipAddress, port);
|
||||||
|
}
|
||||||
|
this.id = id;
|
||||||
|
routerNode.setUserObject("Router (" + id + ".0.0)");
|
||||||
|
updateUI();
|
||||||
|
|
||||||
|
return rootNode.getIndex(routerNode) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new portal to the NodeTree
|
||||||
|
* @return index of the new portal
|
||||||
|
*/
|
||||||
|
public int addPortal() {
|
||||||
|
if (getSelectionPath() == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DefaultMutableTreeNode selectedNode =
|
||||||
|
(DefaultMutableTreeNode) getSelectionPath().getLastPathComponent();
|
||||||
|
|
||||||
|
String nodeName = (String) selectedNode.getUserObject();
|
||||||
|
|
||||||
|
if (selectedNode.isRoot() || !nodeName.contains("Router"))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DefaultMutableTreeNode portalNode = new DefaultMutableTreeNode();
|
||||||
|
selectedNode.add(portalNode);
|
||||||
|
|
||||||
|
// Add Portals Here
|
||||||
|
Portal p = new Portal(10, id + "." + (selectedNode.getIndex(portalNode) + 1) + ".0");
|
||||||
|
p.start();
|
||||||
|
MetaAgentMap.get(String.valueOf(id + ".0.0")).addAgent(p);
|
||||||
|
MetaAgentMap.values().forEach((metaAgent) -> {
|
||||||
|
if (metaAgent instanceof Portal)
|
||||||
|
{
|
||||||
|
metaAgent.addAgent(p);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
MetaAgentMap.put(p.getAddress().getAddress(), p);
|
||||||
|
portalNode.setUserObject("Portal (" + p.getAddress() + ")");
|
||||||
|
|
||||||
|
updateUI();
|
||||||
|
|
||||||
|
return rootNode.getIndex(portalNode) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new user agent to the NodeTree
|
||||||
|
* @return index of new UserAgent
|
||||||
|
*/
|
||||||
|
public int addUserAgent() {
|
||||||
|
if (getSelectionPath() == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DefaultMutableTreeNode selectedNode =
|
||||||
|
(DefaultMutableTreeNode) getSelectionPath().getLastPathComponent();
|
||||||
|
|
||||||
|
String nodeName = (String) selectedNode.getUserObject();
|
||||||
|
|
||||||
|
if (selectedNode.isRoot() || !nodeName.contains("Portal"))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DefaultMutableTreeNode userAgentNode = new DefaultMutableTreeNode();
|
||||||
|
selectedNode.add(userAgentNode);
|
||||||
|
|
||||||
|
UserAgent userAgent = new UserAgent((id) + "."
|
||||||
|
+ (selectedNode.getParent().getIndex(selectedNode) + 1) + "."
|
||||||
|
+ (selectedNode.getIndex(userAgentNode) + 1));
|
||||||
|
((Portal) MetaAgentMap.get(id + "."
|
||||||
|
+ (selectedNode.getParent().getIndex(selectedNode)+ 1)
|
||||||
|
+ ".0")).addAgent(userAgent);
|
||||||
|
UserAgentMap.put(userAgent.getAddress(), userAgent);
|
||||||
|
|
||||||
|
userAgentNode.setUserObject("User Agent (" + userAgent.getAddress() + ")" );
|
||||||
|
|
||||||
|
updateUI();
|
||||||
|
|
||||||
|
return rootNode.getIndex(userAgentNode) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseClicked(MouseEvent e) {
|
||||||
|
if (e.getClickCount()==2 && getSelectionPath() != null) {
|
||||||
|
DefaultMutableTreeNode selectedNode =
|
||||||
|
(DefaultMutableTreeNode) getSelectionPath().getLastPathComponent();
|
||||||
|
|
||||||
|
String nodeName = (String) selectedNode.getUserObject();
|
||||||
|
|
||||||
|
if (nodeName.contains("Router") || nodeName.contains("Portal")) {
|
||||||
|
if (nm != null && nmMetaAgent != null)
|
||||||
|
{
|
||||||
|
nmMetaAgent.detach(nm);
|
||||||
|
}
|
||||||
|
|
||||||
|
nodeListener.clear();
|
||||||
|
//Get Portal
|
||||||
|
MetaAgent metaAgent = MetaAgentMap.get(nodeName.substring(nodeName.indexOf("(") + 1, nodeName.length() - 1));
|
||||||
|
//Attach NodeMonitor
|
||||||
|
nm = new NodeMonitor(nodeListener);
|
||||||
|
metaAgent.attach(nm);
|
||||||
|
nmMetaAgent = metaAgent;
|
||||||
|
} else if (nodeName.contains("User Agent")) {
|
||||||
|
new UserAgentUI(UserAgentMap.get(nodeName.substring(nodeName.indexOf("(") + 1, nodeName.length()-1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent e) {
|
||||||
|
//Useless.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
//Useless.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseEntered(MouseEvent e) {
|
||||||
|
//Useless.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseExited(MouseEvent e) {
|
||||||
|
//Useless.
|
||||||
|
}
|
||||||
|
}
|
41
src/middleware/components/main/nodeview/NodeView.java
Normal file
41
src/middleware/components/main/nodeview/NodeView.java
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package middleware.components.main.nodeview;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import javax.swing.BoxLayout;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import middleware.components.main.nodelistener.NodeListener;
|
||||||
|
import middleware.components.main.nodeview.controls.ControlPane;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NodeView
|
||||||
|
* Used to display the NodeTree
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class NodeView extends JPanel {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of NodeView, with an attached NodeListener
|
||||||
|
* @param nodeListenerIn nodelistener used to feed data to the view
|
||||||
|
*/
|
||||||
|
public NodeView(NodeListener nodeListenerIn) {
|
||||||
|
setUpComponent(nodeListenerIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent(NodeListener nodeListenerIn) {
|
||||||
|
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
|
||||||
|
|
||||||
|
NodeTree nodeTree = new NodeTree(nodeListenerIn);
|
||||||
|
JScrollPane nodeTreePane = new JScrollPane (nodeTree);
|
||||||
|
nodeTreePane.setPreferredSize(new Dimension(200,400));
|
||||||
|
|
||||||
|
add(nodeTreePane);
|
||||||
|
|
||||||
|
ControlPane controlPane = new ControlPane(nodeTree);
|
||||||
|
|
||||||
|
add(controlPane);
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package middleware.components.main.nodeview.controls;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import middleware.components.main.nodeview.NodeTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Control Pane
|
||||||
|
* Handles GUI components for controls of the Node Tree
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class ControlPane extends JPanel {
|
||||||
|
|
||||||
|
RouterButton routerButton;
|
||||||
|
|
||||||
|
PortalButton portalButton;
|
||||||
|
|
||||||
|
UserAgentButton userAgentButton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of ControlPane, attached to a NodeTree
|
||||||
|
* @param nodeTreeIn nodetree which the controls control
|
||||||
|
*/
|
||||||
|
public ControlPane(NodeTree nodeTreeIn) {
|
||||||
|
routerButton = new RouterButton(nodeTreeIn);
|
||||||
|
|
||||||
|
portalButton = new PortalButton(nodeTreeIn);
|
||||||
|
|
||||||
|
userAgentButton = new UserAgentButton(nodeTreeIn);
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
add(routerButton);
|
||||||
|
|
||||||
|
add(portalButton);
|
||||||
|
|
||||||
|
add(userAgentButton);
|
||||||
|
|
||||||
|
setPreferredSize(new Dimension(200,80));
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package middleware.components.main.nodeview.controls;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import middleware.components.main.nodeview.NodeTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PortalButton
|
||||||
|
* Button used to create portals and add them to the NodeTree
|
||||||
|
*/
|
||||||
|
public class PortalButton extends JButton implements ActionListener {
|
||||||
|
|
||||||
|
NodeTree nodeTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of PortalButton and sets up its components
|
||||||
|
* @param nodeTreeIn attached nodeTree
|
||||||
|
*/
|
||||||
|
public PortalButton(NodeTree nodeTreeIn) {
|
||||||
|
nodeTree = nodeTreeIn;
|
||||||
|
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
setText("Add Portal");
|
||||||
|
|
||||||
|
setPreferredSize(new Dimension(190,20));
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
addActionListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if (e.getSource() == this)
|
||||||
|
nodeTree.addPortal();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package middleware.components.main.nodeview.controls;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
import middleware.components.main.nodeview.NodeTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RouterButton
|
||||||
|
* Button used to create and add routers to a NodeTree
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class RouterButton extends JButton implements ActionListener {
|
||||||
|
|
||||||
|
NodeTree nodeTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and sets up button, attached to specified NodeTree
|
||||||
|
* @param nodeTreeIn NodeTree
|
||||||
|
*/
|
||||||
|
public RouterButton(NodeTree nodeTreeIn) {
|
||||||
|
nodeTree = nodeTreeIn;
|
||||||
|
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
setText("Add Router");
|
||||||
|
|
||||||
|
setPreferredSize(new Dimension(190,20));
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
addActionListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if (e.getSource() == this) {
|
||||||
|
String id = (String) JOptionPane.showInputDialog(null, "Router ID", "Set Router ID", JOptionPane.PLAIN_MESSAGE, null, null, "");
|
||||||
|
String ipAddress = (String) JOptionPane.showInputDialog(null, "IP Address", "Add Router", JOptionPane.PLAIN_MESSAGE, null, null, "");
|
||||||
|
String port = (String) JOptionPane.showInputDialog(null, "Port", "Add Router", JOptionPane.PLAIN_MESSAGE, null, null, "");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
nodeTree.addRouter(Integer.parseInt(id), ipAddress, Integer.parseInt(port));
|
||||||
|
//nodeTree.addRouter(Integer.parseInt(id), ipAddress, Integer.parseInt(port));
|
||||||
|
}
|
||||||
|
catch (UnknownHostException | NumberFormatException ex)
|
||||||
|
{
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
package middleware.components.main.nodeview.controls;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import middleware.components.main.nodeview.NodeTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UserAgentButton
|
||||||
|
* Creates and adds user agents to a node tree
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class UserAgentButton extends JButton implements ActionListener{
|
||||||
|
|
||||||
|
NodeTree nodeTree;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates button to add User Agents to a node tree
|
||||||
|
* @param nodeTreeIn
|
||||||
|
*/
|
||||||
|
public UserAgentButton(NodeTree nodeTreeIn) {
|
||||||
|
nodeTree = nodeTreeIn;
|
||||||
|
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
setText("Add User Agent");
|
||||||
|
|
||||||
|
setPreferredSize(new Dimension(190,20));
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
addActionListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When an action is performed, adds useragent to nodetree
|
||||||
|
* @param e
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if (e.getSource() == this)
|
||||||
|
nodeTree.addUserAgent();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the controls for the nodeview GUI
|
||||||
|
*/
|
||||||
|
package middleware.components.main.nodeview.controls;
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the classes for the NodeView GUI
|
||||||
|
*/
|
||||||
|
package middleware.components.main.nodeview;
|
4
src/middleware/components/main/package-info.java
Normal file
4
src/middleware/components/main/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* The main interface for the Middleware project
|
||||||
|
*/
|
||||||
|
package middleware.components.main;
|
68
src/middleware/components/useragents/UserAgentUI.java
Normal file
68
src/middleware/components/useragents/UserAgentUI.java
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
package middleware.components.useragents;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JScrollPane;
|
||||||
|
import middleware.agents.MsgListener;
|
||||||
|
import middleware.agents.UserAgent;
|
||||||
|
import middleware.components.useragents.messagefeed.MessageFeed;
|
||||||
|
import middleware.components.useragents.messagesending.MessageSender;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The GUI for UserAgents
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class UserAgentUI extends JFrame implements MsgListener
|
||||||
|
{
|
||||||
|
|
||||||
|
private final MessageSender messageSender;
|
||||||
|
private final MessageFeed messageFeed;
|
||||||
|
private final UserAgent userAgent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up GUI for a UserAgent
|
||||||
|
* @param userAgent specified UserAgent
|
||||||
|
*/
|
||||||
|
public UserAgentUI(UserAgent userAgent) {
|
||||||
|
messageFeed = new MessageFeed();
|
||||||
|
this.userAgent = userAgent;
|
||||||
|
messageSender = new MessageSender(userAgent, messageFeed);
|
||||||
|
userAgent.addListener(this);
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
setTitle("User Agent - " + userAgent.getAddress().toUpperCase());
|
||||||
|
|
||||||
|
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
JPanel padding1 = new JPanel();
|
||||||
|
padding1.setPreferredSize(new Dimension(10,0));
|
||||||
|
|
||||||
|
JPanel padding2 = new JPanel();
|
||||||
|
padding2.setPreferredSize(new Dimension(10,0));
|
||||||
|
|
||||||
|
add(padding1, BorderLayout.WEST);
|
||||||
|
add(padding2, BorderLayout.EAST);
|
||||||
|
|
||||||
|
JScrollPane messageFeedScroller = new JScrollPane(messageFeed);
|
||||||
|
messageFeedScroller.setPreferredSize(new Dimension(780,200));
|
||||||
|
|
||||||
|
add(messageFeedScroller, BorderLayout.CENTER);
|
||||||
|
add(messageSender, BorderLayout.SOUTH);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
setMinimumSize(getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void UserAgentMsg(String sender, String msg)
|
||||||
|
{
|
||||||
|
messageFeed.addRow(msg, sender.toUpperCase(), userAgent.getAddress().toUpperCase());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package middleware.components.useragents.messagefeed;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import javax.swing.JTable;
|
||||||
|
import javax.swing.table.DefaultTableModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageFeed for UserAgents
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class MessageFeed extends JTable {
|
||||||
|
|
||||||
|
DefaultTableModel model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up GUI for MessageFeed
|
||||||
|
*/
|
||||||
|
public MessageFeed() {
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
String[] headings = {"Time sent/received","Sender","Receiver","Message"};
|
||||||
|
|
||||||
|
model = new DefaultTableModel(headings,0) {
|
||||||
|
@Override
|
||||||
|
public boolean isCellEditable(int row, int column) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
setModel(model);
|
||||||
|
|
||||||
|
setFocusable(false);
|
||||||
|
setRowSelectionAllowed(false);
|
||||||
|
|
||||||
|
getColumnModel().getColumn(0).setPreferredWidth(130);
|
||||||
|
getColumnModel().getColumn(0).setMaxWidth(130);
|
||||||
|
getColumnModel().getColumn(0).setMinWidth(130);
|
||||||
|
getColumnModel().getColumn(0).setResizable(false);
|
||||||
|
getColumnModel().getColumn(0).setHeaderValue("Time sent/received");
|
||||||
|
|
||||||
|
getColumnModel().getColumn(1).setPreferredWidth(100);
|
||||||
|
getColumnModel().getColumn(1).setMaxWidth(100);
|
||||||
|
getColumnModel().getColumn(1).setMinWidth(100);
|
||||||
|
getColumnModel().getColumn(1).setResizable(false);
|
||||||
|
getColumnModel().getColumn(1).setHeaderValue("Sender");
|
||||||
|
|
||||||
|
getColumnModel().getColumn(2).setPreferredWidth(100);
|
||||||
|
getColumnModel().getColumn(2).setMaxWidth(100);
|
||||||
|
getColumnModel().getColumn(2).setMinWidth(100);
|
||||||
|
getColumnModel().getColumn(2).setResizable(false);
|
||||||
|
getColumnModel().getColumn(2).setHeaderValue("Receiver");
|
||||||
|
|
||||||
|
getColumnModel().getColumn(3).setMinWidth(450);
|
||||||
|
getColumnModel().getColumn(3).setResizable(true);
|
||||||
|
getColumnModel().getColumn(3).setHeaderValue("Message");
|
||||||
|
|
||||||
|
setRowHeight(20);
|
||||||
|
|
||||||
|
setVisible(true);
|
||||||
|
setOpaque(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a row to the table containing specified data
|
||||||
|
* @param message message content
|
||||||
|
* @param sender sender agent address
|
||||||
|
* @param recipient recipient agent address
|
||||||
|
*/
|
||||||
|
public void addRow(String message, String sender, String recipient) {
|
||||||
|
Object[] tableRow = new Object[4];
|
||||||
|
|
||||||
|
tableRow[0] = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
|
||||||
|
tableRow[1] = sender;
|
||||||
|
tableRow[2] = recipient;
|
||||||
|
tableRow[3] = message;
|
||||||
|
|
||||||
|
model.addRow(tableRow);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the MessageFeed for the UserAgents GUI
|
||||||
|
*/
|
||||||
|
package middleware.components.useragents.messagefeed;
|
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
package middleware.components.useragents.messagesending;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageBox. A text field used to type a string message, with the intend to
|
||||||
|
* send that message to another user.
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class MessageBox extends JTextField implements ActionListener {
|
||||||
|
|
||||||
|
RecipientBox recipientBox;
|
||||||
|
|
||||||
|
SendButton sendButton;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
public MessageBox(RecipientBox recipientBoxIn) {
|
||||||
|
recipientBox = recipientBoxIn;
|
||||||
|
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
setPreferredSize(new Dimension(500,20));
|
||||||
|
setVisible(true);
|
||||||
|
setOpaque(true);
|
||||||
|
|
||||||
|
addActionListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if (!getText().equals("") && !recipientBox.getText().equals(""))
|
||||||
|
sendButton.sendMessage();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
package middleware.components.useragents.messagesending;
|
||||||
|
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import middleware.agents.UserAgent;
|
||||||
|
import middleware.components.useragents.messagefeed.MessageFeed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageSender.
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class MessageSender extends JPanel {
|
||||||
|
|
||||||
|
final RecipientBox recipientBox;
|
||||||
|
|
||||||
|
final MessageBox messageBox;
|
||||||
|
|
||||||
|
final SendButton sendButton;
|
||||||
|
|
||||||
|
public MessageSender(UserAgent userAgent, MessageFeed messageFeedIn) {
|
||||||
|
recipientBox = new RecipientBox();
|
||||||
|
messageBox = new MessageBox(recipientBox);
|
||||||
|
sendButton = new SendButton(userAgent, recipientBox,messageBox,messageFeedIn);
|
||||||
|
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
add(recipientBox);
|
||||||
|
add(messageBox);
|
||||||
|
add(sendButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
package middleware.components.useragents.messagesending;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RecipientBox.
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class RecipientBox extends JTextField {
|
||||||
|
|
||||||
|
public RecipientBox() {
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
setPreferredSize(new Dimension(170,20));
|
||||||
|
setVisible(true);
|
||||||
|
setOpaque(true);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
package middleware.components.useragents.messagesending;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import middleware.agents.UserAgent;
|
||||||
|
import middleware.components.useragents.messagefeed.MessageFeed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SendButton.
|
||||||
|
*
|
||||||
|
* @author Dan Lawrence
|
||||||
|
*/
|
||||||
|
public class SendButton extends JButton implements ActionListener
|
||||||
|
{
|
||||||
|
|
||||||
|
final RecipientBox recipientBox;
|
||||||
|
|
||||||
|
final MessageBox messageBox;
|
||||||
|
|
||||||
|
final MessageFeed messageFeed;
|
||||||
|
|
||||||
|
private final UserAgent userAgent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param userAgent
|
||||||
|
* @param recipientBoxIn
|
||||||
|
* @param messageBoxIn
|
||||||
|
* @param messageFeedIn
|
||||||
|
*/
|
||||||
|
public SendButton(UserAgent userAgent, RecipientBox recipientBoxIn, MessageBox messageBoxIn, MessageFeed messageFeedIn) {
|
||||||
|
this.userAgent = userAgent;
|
||||||
|
recipientBox = recipientBoxIn;
|
||||||
|
messageBox = messageBoxIn;
|
||||||
|
messageFeed = messageFeedIn;
|
||||||
|
|
||||||
|
setUpComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUpComponent() {
|
||||||
|
messageBox.sendButton = this;
|
||||||
|
|
||||||
|
setPreferredSize(new Dimension(100, 20));
|
||||||
|
setVisible(true);
|
||||||
|
setOpaque(true);
|
||||||
|
setText("Send");
|
||||||
|
|
||||||
|
addActionListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if ((e.getSource() == this) && !messageBox.getText().equals("") && !recipientBox.getText().equals("")) {
|
||||||
|
sendMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendMessage() {
|
||||||
|
String sender = userAgent.getAddress();
|
||||||
|
String recipient = recipientBox.getText();
|
||||||
|
String message = messageBox.getText();
|
||||||
|
|
||||||
|
userAgent.sendMsg(sender, recipient, message);
|
||||||
|
|
||||||
|
messageFeed.addRow(message,sender,recipient);
|
||||||
|
|
||||||
|
recipientBox.setText("");
|
||||||
|
messageBox.setText("");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the MessageSending GUI classes for UserAgents GUI
|
||||||
|
*/
|
||||||
|
package middleware.components.useragents.messagesending;
|
4
src/middleware/components/useragents/package-info.java
Normal file
4
src/middleware/components/useragents/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the GUI for the UserAgents
|
||||||
|
*/
|
||||||
|
package middleware.components.useragents;
|
49
src/middleware/message/Message.java
Normal file
49
src/middleware/message/Message.java
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package middleware.message;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import middleware.agents.AgentAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message - sent between nodes
|
||||||
|
* Containing information
|
||||||
|
*/
|
||||||
|
public abstract class Message implements Serializable
|
||||||
|
{
|
||||||
|
private final Object message; //These can be objects
|
||||||
|
private final AgentAddress recipient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of Message
|
||||||
|
* @param m Message Content
|
||||||
|
* @param r Recipient
|
||||||
|
*/
|
||||||
|
public Message(Object m, String r)
|
||||||
|
{
|
||||||
|
message = m;
|
||||||
|
recipient = new AgentAddress(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets message content
|
||||||
|
* @return message content
|
||||||
|
*/
|
||||||
|
public Object getMessage()
|
||||||
|
{
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets message recipient
|
||||||
|
* @return recipient
|
||||||
|
*/
|
||||||
|
public AgentAddress getRecipient()
|
||||||
|
{
|
||||||
|
return recipient;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets sender
|
||||||
|
* @return sender
|
||||||
|
*/
|
||||||
|
public abstract AgentAddress getSender();
|
||||||
|
}
|
77
src/middleware/message/MetaAgentMessage.java
Normal file
77
src/middleware/message/MetaAgentMessage.java
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package middleware.message;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Type of message used for communications between MetaAgents
|
||||||
|
*/
|
||||||
|
public class MetaAgentMessage implements Serializable
|
||||||
|
{
|
||||||
|
private final Message message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum amount of hops a message can take before it is stopped
|
||||||
|
*/
|
||||||
|
public int timeToLive;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of hops a message has taken
|
||||||
|
*/
|
||||||
|
public int hops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of MetaAgentMessage
|
||||||
|
* Wraps an already created message
|
||||||
|
* @param um message
|
||||||
|
* @param ttl time to live
|
||||||
|
*/
|
||||||
|
public MetaAgentMessage(Message um, int ttl)
|
||||||
|
{
|
||||||
|
hops = 0;
|
||||||
|
message = um;
|
||||||
|
timeToLive = ttl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets message
|
||||||
|
* @return message
|
||||||
|
*/
|
||||||
|
public Message getMessage()
|
||||||
|
{
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets message's TTL
|
||||||
|
* @return TimeToLive
|
||||||
|
*/
|
||||||
|
public int getTimeToLive()
|
||||||
|
{
|
||||||
|
return timeToLive;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets no. of hops MetaAgentMessage has taken
|
||||||
|
* @return hops
|
||||||
|
*/
|
||||||
|
public int getHops()
|
||||||
|
{
|
||||||
|
return hops;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrements TTL
|
||||||
|
*/
|
||||||
|
public void decreaseTimeToLive()
|
||||||
|
{
|
||||||
|
timeToLive -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increments TTL
|
||||||
|
*/
|
||||||
|
public void increaseHops()
|
||||||
|
{
|
||||||
|
hops += 1;
|
||||||
|
}
|
||||||
|
}
|
17
src/middleware/message/SystemErrorMessage.java
Normal file
17
src/middleware/message/SystemErrorMessage.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package middleware.message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type of message for system error communication
|
||||||
|
*/
|
||||||
|
public class SystemErrorMessage extends SystemMessage
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates an instance of SystemErrorMessage
|
||||||
|
* @param message message content
|
||||||
|
* @param recipient recipient
|
||||||
|
*/
|
||||||
|
public SystemErrorMessage(String message, String recipient)
|
||||||
|
{
|
||||||
|
super(message, recipient);
|
||||||
|
}
|
||||||
|
}
|
32
src/middleware/message/SystemMessage.java
Normal file
32
src/middleware/message/SystemMessage.java
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package middleware.message;
|
||||||
|
|
||||||
|
import middleware.agents.AgentAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type of message for system communication
|
||||||
|
*/
|
||||||
|
public class SystemMessage extends Message
|
||||||
|
{
|
||||||
|
|
||||||
|
private final static AgentAddress SYSTEMADDRESS = new AgentAddress("0.0.0");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of System message
|
||||||
|
* @param m message content
|
||||||
|
* @param r recipient
|
||||||
|
*/
|
||||||
|
public SystemMessage(Object m, String r)
|
||||||
|
{
|
||||||
|
super(m, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets sender
|
||||||
|
* @return always "System"
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AgentAddress getSender()
|
||||||
|
{
|
||||||
|
return SYSTEMADDRESS;
|
||||||
|
}
|
||||||
|
}
|
70
src/middleware/message/UserMessage.java
Normal file
70
src/middleware/message/UserMessage.java
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
package middleware.message;
|
||||||
|
|
||||||
|
import middleware.agents.AgentAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User message
|
||||||
|
* A type of message used between Portals (MetaAgent) and UserAgents
|
||||||
|
*/
|
||||||
|
public class UserMessage extends Message
|
||||||
|
{
|
||||||
|
private final AgentAddress sender; //Can be object
|
||||||
|
private final boolean needsResponse;
|
||||||
|
private final String response; //Can be object
|
||||||
|
private final String messageID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs an instance of UserMessage with specified properties
|
||||||
|
* @param m message content
|
||||||
|
* @param r recipient
|
||||||
|
* @param s sender
|
||||||
|
* @param n needs response?
|
||||||
|
* @param res response content
|
||||||
|
* @param id message ID
|
||||||
|
*/
|
||||||
|
public UserMessage(Object m, String r, String s, boolean n, String res, String id)
|
||||||
|
{
|
||||||
|
super(m,r);
|
||||||
|
sender = new AgentAddress(s);
|
||||||
|
needsResponse = n;
|
||||||
|
response = res;
|
||||||
|
messageID = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a <i>UserMessage</i>'s sender
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public AgentAddress getSender()
|
||||||
|
{
|
||||||
|
return sender;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets whether <i>UserMessage</i> requires response
|
||||||
|
* @return boolean, if needs response
|
||||||
|
*/
|
||||||
|
public boolean getNeedsResponse()
|
||||||
|
{
|
||||||
|
return needsResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the response for a <i>UserMessage</i>
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
public String getResponse()
|
||||||
|
{
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the message ID
|
||||||
|
* @return message ID
|
||||||
|
*/
|
||||||
|
public String getMessageID()
|
||||||
|
{
|
||||||
|
return messageID;
|
||||||
|
}
|
||||||
|
}
|
4
src/middleware/message/package-info.java
Normal file
4
src/middleware/message/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the message classes used for communication in the middleware
|
||||||
|
*/
|
||||||
|
package middleware.message;
|
31
src/middleware/message/wrapper/MetaAgentWrapper.java
Normal file
31
src/middleware/message/wrapper/MetaAgentWrapper.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package middleware.message.wrapper;
|
||||||
|
|
||||||
|
import middleware.message.Message;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps given data into a <i>MetaAgentMessage</i>
|
||||||
|
*/
|
||||||
|
public class MetaAgentWrapper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates a new <i>MetaAgentMessage</i> from given properties
|
||||||
|
* @param m message content
|
||||||
|
* @param ttl time to live (TTL)
|
||||||
|
* @return wrapped <i>MetaAgentMessage</i>
|
||||||
|
*/
|
||||||
|
public static MetaAgentMessage wrap(Message m, int ttl)
|
||||||
|
{
|
||||||
|
return new MetaAgentMessage(m, ttl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unwraps a given message
|
||||||
|
* @param m MetaAgentMessage to be unwrapped
|
||||||
|
* @return message content
|
||||||
|
*/
|
||||||
|
public static Message unwrap(MetaAgentMessage m)
|
||||||
|
{
|
||||||
|
return m.getMessage();
|
||||||
|
}
|
||||||
|
}
|
34
src/middleware/message/wrapper/UserAgentWrapper.java
Normal file
34
src/middleware/message/wrapper/UserAgentWrapper.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package middleware.message.wrapper;
|
||||||
|
|
||||||
|
import middleware.message.UserMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps given parameters into a UserMessage
|
||||||
|
*/
|
||||||
|
public class UserAgentWrapper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Creates a new UserMessage with given properties
|
||||||
|
* @param m message content
|
||||||
|
* @param r recipient
|
||||||
|
* @param sender sender
|
||||||
|
* @param n requires response?
|
||||||
|
* @param res response content
|
||||||
|
* @param id message id
|
||||||
|
* @return Created UserMessage
|
||||||
|
*/
|
||||||
|
public static UserMessage wrap(Object m, String r, String sender, boolean n, String res, String id)
|
||||||
|
{
|
||||||
|
return new UserMessage(m, r, sender, n, res, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unwraps a specified user message
|
||||||
|
* @param m user message
|
||||||
|
* @return message content
|
||||||
|
*/
|
||||||
|
public static Object unwrap(UserMessage m)
|
||||||
|
{
|
||||||
|
return m.getMessage();
|
||||||
|
}
|
||||||
|
}
|
4
src/middleware/message/wrapper/package-info.java
Normal file
4
src/middleware/message/wrapper/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* The main interface for the Middleware project
|
||||||
|
*/
|
||||||
|
package middleware.message.wrapper;
|
43
src/middleware/nodemonitor/NodeMonitor.java
Normal file
43
src/middleware/nodemonitor/NodeMonitor.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
package middleware.nodemonitor;
|
||||||
|
|
||||||
|
import middleware.components.main.nodelistener.NodeListener;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
import middleware.observer.Observer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NodeMonitor created to read messages received by a node (e.g. meta agent, agent) and add them to the GUI
|
||||||
|
*
|
||||||
|
* @author Dylan Currey
|
||||||
|
* @since 12/12/18
|
||||||
|
*/
|
||||||
|
public class NodeMonitor implements Observer{
|
||||||
|
|
||||||
|
|
||||||
|
private NodeListener nodeListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance, using a passed GUI component
|
||||||
|
* @param nodeListener a GUI component, to be updated by NodeMonitor
|
||||||
|
*/
|
||||||
|
public NodeMonitor(NodeListener nodeListener)
|
||||||
|
{
|
||||||
|
this.nodeListener = nodeListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses and updates GUI from received message
|
||||||
|
* @param msg the message object received by the attached subject
|
||||||
|
* @return whether operation was successful
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean update(Object msg) {
|
||||||
|
if(msg instanceof MetaAgentMessage)
|
||||||
|
{
|
||||||
|
MetaAgentMessage MAM = (MetaAgentMessage) msg;
|
||||||
|
nodeListener.addRow(MAM.getMessage().getMessage().toString(), MAM.getMessage().getSender().getAddress(), MAM.getMessage().getRecipient().getAddress(), MAM.getTimeToLive(), MAM.getHops());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
src/middleware/nodemonitor/package-info.java
Normal file
4
src/middleware/nodemonitor/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains the NodeMonitor classes which can be attached to MetaAgents
|
||||||
|
*/
|
||||||
|
package middleware.nodemonitor;
|
19
src/middleware/observer/Observer.java
Normal file
19
src/middleware/observer/Observer.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package middleware.observer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An Observer interface created to facilitate the implementation of the Observer design pattern between UserAgents and NodeMonitors.
|
||||||
|
*
|
||||||
|
* @author Dylan Currey
|
||||||
|
* @since 12/12/18
|
||||||
|
*/
|
||||||
|
public interface Observer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the Observer with the specified command
|
||||||
|
* @param msg
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean update(Object msg);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
31
src/middleware/observer/Subject.java
Normal file
31
src/middleware/observer/Subject.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package middleware.observer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Subject interface created to facilitate the implementation of the Observer design pattern between UserAgents and NodeMonitors
|
||||||
|
*
|
||||||
|
* @author Dylan Currey
|
||||||
|
* @since 12/12/18
|
||||||
|
*/
|
||||||
|
public interface Subject
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches observers to the subject.
|
||||||
|
* @param observer the <i>Observer</i> object to be attached.
|
||||||
|
*/
|
||||||
|
public void attach(Observer observer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detaches observers from the subject
|
||||||
|
* @param observer the <i>Observer</i> object to be detached
|
||||||
|
*/
|
||||||
|
public void detach (Observer observer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates all observers in <i>listOfObservers</i> with a command.
|
||||||
|
* @param msg
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean updateObservers(Object msg);
|
||||||
|
|
||||||
|
}
|
4
src/middleware/observer/package-info.java
Normal file
4
src/middleware/observer/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* Contains classes for implementing the Observer pattern
|
||||||
|
*/
|
||||||
|
package middleware.observer;
|
4
src/middleware/package-info.java
Normal file
4
src/middleware/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
* The main interface for the Middleware project
|
||||||
|
*/
|
||||||
|
package middleware;
|
81
src/middleware/socket/Client.java
Normal file
81
src/middleware/socket/Client.java
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
package middleware.socket;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.Socket;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Client
|
||||||
|
* Acts as client in client-server relationship
|
||||||
|
*/
|
||||||
|
public class Client
|
||||||
|
{
|
||||||
|
//Socket variables (for connection)
|
||||||
|
private Socket socket;
|
||||||
|
private String address;
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
//Socket input and output variables
|
||||||
|
private PrintWriter writer;
|
||||||
|
private ObjectOutputStream objOut;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of Client
|
||||||
|
* @param a address
|
||||||
|
* @param p port
|
||||||
|
*/
|
||||||
|
public Client(String a, int p)
|
||||||
|
{
|
||||||
|
address = a;
|
||||||
|
port = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a connection with a socket and output stream
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void connect() throws IOException
|
||||||
|
{
|
||||||
|
//Create new socket
|
||||||
|
socket = new Socket(address, port);
|
||||||
|
|
||||||
|
//Declare the output stream
|
||||||
|
//writer = new PrintWriter(socket.getOutputStream());
|
||||||
|
objOut = new ObjectOutputStream(socket.getOutputStream());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a String to a socket, may be used when communicating with other languages
|
||||||
|
* @param s string to be sent
|
||||||
|
*/
|
||||||
|
public void sendString(String s)
|
||||||
|
{
|
||||||
|
//TODO maybe?
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends serialisable objects (e.g. messages, in this case) to a socket
|
||||||
|
* @param message message, serialisable to be sent
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void send(MetaAgentMessage message) throws IOException
|
||||||
|
{
|
||||||
|
//Write the object/message to the stream
|
||||||
|
objOut.writeObject((MetaAgentMessage) message);
|
||||||
|
//Flush the stream, is nice to have
|
||||||
|
objOut.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes all connections
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
//Close all connections and writers
|
||||||
|
socket.close();
|
||||||
|
writer.close();
|
||||||
|
}
|
||||||
|
}
|
53
src/middleware/socket/ClientInstance.java
Normal file
53
src/middleware/socket/ClientInstance.java
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package middleware.socket;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import middleware.message.Message;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
import middleware.message.UserMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs an instance of Client
|
||||||
|
*/
|
||||||
|
public class ClientInstance
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param args
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws IOException
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
//Input message stuff
|
||||||
|
System.out.println("Client");
|
||||||
|
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
System.out.print("Please input the server IP: ");
|
||||||
|
String ip = sc.nextLine();
|
||||||
|
System.out.print("Please input the port: ");
|
||||||
|
int port = sc.nextInt();
|
||||||
|
|
||||||
|
Client client = new Client(ip, port);
|
||||||
|
client.connect();
|
||||||
|
|
||||||
|
sc.nextLine();
|
||||||
|
|
||||||
|
|
||||||
|
String message, target;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
System.out.print("Please enter target address: ");
|
||||||
|
target = sc.nextLine();
|
||||||
|
System.out.print("Please enter message: ");
|
||||||
|
message = sc.nextLine();
|
||||||
|
|
||||||
|
//Meta agent stuff
|
||||||
|
MetaAgentMessage metaAgentMessage = new MetaAgentMessage(new UserMessage(message, target, "3", false, "", "MID"), 1000);
|
||||||
|
|
||||||
|
client.send(metaAgentMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
102
src/middleware/socket/Server.java
Normal file
102
src/middleware/socket/Server.java
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
package middleware.socket;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import middleware.agents.Router;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Server acts as server in Client-Server Communications
|
||||||
|
*/
|
||||||
|
public class Server
|
||||||
|
{
|
||||||
|
private ServerSocket serverSocket;
|
||||||
|
private Socket socket;
|
||||||
|
private int port;
|
||||||
|
private InetAddress address;
|
||||||
|
|
||||||
|
private Router router;
|
||||||
|
|
||||||
|
private boolean listening;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of <i>Server</i> with given properties
|
||||||
|
* @param p port
|
||||||
|
*/
|
||||||
|
public Server(int p, Router r)
|
||||||
|
{
|
||||||
|
//address = a;
|
||||||
|
port = p;
|
||||||
|
router = r;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new server socket on <i>Server</i>'s port
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void create() throws IOException
|
||||||
|
{
|
||||||
|
//serverSocket = new ServerSocket(port, 50, address);
|
||||||
|
serverSocket = new ServerSocket(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts input from socket
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private void listen() throws IOException
|
||||||
|
{
|
||||||
|
final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
|
||||||
|
|
||||||
|
Runnable serverTask = new Runnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
socket = serverSocket.accept();
|
||||||
|
new ServerThread(socket, router).start();
|
||||||
|
System.out.println("Connected: " + socket.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Thread serverThread = new Thread(serverTask);
|
||||||
|
serverThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <i>Server</i> starts listening to socket input
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void enableListening() throws IOException
|
||||||
|
{
|
||||||
|
if (!listening)
|
||||||
|
{
|
||||||
|
listening = true;
|
||||||
|
listen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops <i>Server</i> listening to socket
|
||||||
|
*/
|
||||||
|
public void disableListening()
|
||||||
|
{
|
||||||
|
listening = false;
|
||||||
|
}
|
||||||
|
}
|
26
src/middleware/socket/ServerInstance.java
Normal file
26
src/middleware/socket/ServerInstance.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package middleware.socket;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs an instance of Server
|
||||||
|
*/
|
||||||
|
public class ServerInstance
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param args
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws IOException
|
||||||
|
{
|
||||||
|
System.out.println("Server");
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
System.out.print("Please input a port: ");
|
||||||
|
int port = sc.nextInt();
|
||||||
|
Server server = new Server(port, null);
|
||||||
|
server.create();
|
||||||
|
server.enableListening();
|
||||||
|
}
|
||||||
|
}
|
76
src/middleware/socket/ServerThread.java
Normal file
76
src/middleware/socket/ServerThread.java
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package middleware.socket;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.net.Socket;
|
||||||
|
import middleware.agents.Router;
|
||||||
|
import middleware.message.MetaAgentMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type of thread for running <i>Server</i> objects
|
||||||
|
*/
|
||||||
|
public class ServerThread extends Thread
|
||||||
|
{
|
||||||
|
private Socket socket;
|
||||||
|
private Router router;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an instance of ServerThread with given property
|
||||||
|
* @param client client socket
|
||||||
|
*/
|
||||||
|
public ServerThread (Socket client, Router r)
|
||||||
|
{
|
||||||
|
socket = client;
|
||||||
|
router = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes connection
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void close() throws IOException
|
||||||
|
{
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs thread
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
ObjectInputStream objIn = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
objIn = new ObjectInputStream(socket.getInputStream());
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Object input;
|
||||||
|
MetaAgentMessage input;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
input = (MetaAgentMessage) objIn.readObject();
|
||||||
|
//out.flush();
|
||||||
|
System.out.println("Object is of type: " + input.getClass().getSimpleName());
|
||||||
|
System.out.println(input);
|
||||||
|
|
||||||
|
if (router != null)
|
||||||
|
router.add(input);
|
||||||
|
//INPUT IS THE MESSAGE HERE
|
||||||
|
//SHOULD STICK AT THE readLine CODE UNTIL A LINE IS DETECTED
|
||||||
|
//CAN USE RETURN TO BREAK OUT OF LOOP IF NEEDED
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
src/middleware/socket/package-info.java
Normal file
4
src/middleware/socket/package-info.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package middleware.socket;
|
Loading…
Reference in New Issue
Block a user