Skip to content

Commit

Permalink
Merge pull request #9 from DarraghClarke/basic
Browse files Browse the repository at this point in the history
Dockerisation nation
  • Loading branch information
DarraghClarke committed Dec 23, 2019
2 parents 8a8772a + aa593b2 commit e1e0566
Show file tree
Hide file tree
Showing 12 changed files with 191 additions and 75 deletions.
8 changes: 8 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
cd core
mvn install
cd ../gateway
mvn clean package
cd ../load-balancer
mvn clean package
cd ../session
mvn clean package
4 changes: 0 additions & 4 deletions client/Dockerfile

This file was deleted.

37 changes: 37 additions & 0 deletions client/src/main/java/service/client/chatwindow/CellRenderer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package service.client.chatwindow;

import javafx.geometry.Pos;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
import javafx.util.Callback;
import message.SessionMessage;

class CellRenderer implements Callback<ListView<SessionMessage>, ListCell<SessionMessage>> {
@Override
public ListCell<SessionMessage> call(ListView<SessionMessage> p) {

ListCell<SessionMessage> cell =
new ListCell<SessionMessage>() {

@Override
protected void updateItem(SessionMessage user, boolean bln) {
super.updateItem(user, bln);
setGraphic(null);
setText(null);
if (user != null) {
HBox hBox = new HBox();

Text username = new Text(user.getUsername());//atm just adds user name

hBox.getChildren().add(username);
hBox.setAlignment(Pos.CENTER_LEFT);

setGraphic(hBox);
}
}
};
return cell;
}
}
19 changes: 16 additions & 3 deletions client/src/main/java/service/client/chatwindow/Client.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package service.client.chatwindow;

import java.io.*;
import java.lang.reflect.Type;
import java.net.URI;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import message.SessionMessage;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import service.client.login.LoginController;
Expand Down Expand Up @@ -40,8 +45,16 @@ public void onClose(int code, String reason, boolean remote) {
@Override
public void onMessage(String message) {
Gson gson = new Gson();
Message msg = gson.fromJson(message, Message.class);
controller.addToChat(msg);
//this is meant to be a logic to sort different types of messages, though for testing right now it only takes the user lists
// if (message.contains("message")){
// Message msg = gson.fromJson(message, Message.class);
// controller.addToChat(msg);
// }// else if (message.contains("sessionMessage")){
Type collectionType = new TypeToken<ArrayList<SessionMessage>>(){}.getType();
ArrayList<SessionMessage> msg = (ArrayList<SessionMessage>) gson.fromJson( message , collectionType);
System.out.println("wow?");
controller.setOnline(msg);
//}
}

@Override
Expand All @@ -50,7 +63,7 @@ public void onError(Exception ex) {
}


public void sendMessage(String msg) throws IOException {
public void sendMessage(String msg) {
Message createMessage = new Message();
createMessage.setSender(username);
createMessage.setTime(Instant.now());
Expand Down
19 changes: 19 additions & 0 deletions client/src/main/java/service/client/chatwindow/Controller.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package service.client.chatwindow;

import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
Expand All @@ -12,13 +17,16 @@
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import message.Message;
import message.SessionMessage;
import service.client.messages.bubble.BubbleSpec;
import service.client.messages.bubble.BubbledLabel;

import java.io.IOException;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;


Expand Down Expand Up @@ -89,6 +97,17 @@ public HBox call() {
}
}

public void setOnline(ArrayList<SessionMessage> allUsers) {
Platform.runLater(() -> {
ObservableList<SessionMessage> users = FXCollections.observableList(allUsers);
userList.setItems(users);
userList.setCellFactory(new CellRenderer());
userList.getSelectionModel().selectedItemProperty().addListener((ChangeListener<SessionMessage>)
(observable, oldValue, newValue) -> System.out.println("Selected item: " + newValue.getUsername()));
});

}

public void setUsername(String username) {
this.username = username;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@


import java.io.IOException;
import java.net.Inet4Address;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
Expand Down Expand Up @@ -47,7 +48,7 @@ public void loginButtonAction() throws IOException, URISyntaxException {
//this gets the gateway from the load balancer
RestTemplate restTemplate = new RestTemplate();
String temp = restTemplate.getForObject("http://localhost:8081/getGateway", String.class);
Client client = new Client(new URI("ws://" + temp + "/"), username, controller);
Client client = new Client(new URI("ws://localhost:8080/"), username, controller);
Thread x = new Thread(client);
x.start();
}
Expand Down
31 changes: 19 additions & 12 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,36 @@ version: "3"
services:
# client:
# build: client
# #image: "client:latest"
# depends_on:
# - gateway
# gateway:
# build: gateway
# ports:
# - "8080:8080"
gateway:
build: gateway
ports:
- "8080:8080"
depends_on:
- load-balancer
load-balancer:
build: load-balancer
ports:
- "8081:8081"
depends_on:
- session
session:
build: session
depends_on:
- mongo
- activemq
session-test-client:
build: session-test-client
depends_on:
- mongo
- activemq
- session
activemq:
image: rmohr/activemq:latest
container_name: activemq
ports:
- "8161:8161"
- "61616:61616"
mongo:
image: mongo:4.0.4
image: mongo:4.0.4
# session-test-client:
# build: session-test-client
# depends_on:
# - mongo
# - activemq
# - session
99 changes: 70 additions & 29 deletions gateway/src/main/java/service/gateway/ChatEndpoint.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.net.*;
import java.nio.ByteBuffer;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
Expand All @@ -12,16 +14,17 @@
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import javax.jms.*;

//based on the sample implementation provided here: https://github.com/TooTallNate/Java-WebSocket/wiki#server-example

public class ChatEndpoint extends WebSocketServer {
MessageProducer producer;
Session session;

public ChatEndpoint(InetSocketAddress address) {
super(address);
Expand All @@ -45,22 +48,63 @@ public void onMessage(WebSocket conn, String message) {
System.out.println("received message from " + conn.getRemoteSocketAddress() + ": " + message);

try {
ConnectionFactory factory = new ActiveMQConnectionFactory("failover://tcp://activemq:61616");
Connection connection = factory.createConnection();
connection.setClientID("gateway");
Session session = connection.createSession(false, javax.jms.Session.CLIENT_ACKNOWLEDGE);
connection.start();

SessionMessage sessionMessage = new SessionMessage(msg.getTime().getEpochSecond(), msg.getSender(), getAddress().toString());

Queue requestsQueue = session.createQueue("SESSIONS");
MessageProducer producer = session.createProducer(requestsQueue);
producer.send(session.createObjectMessage(sessionMessage));

producer.close();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}

//sample code
Message Response = new Message();
Response.setMessage("returning message: "+msg.getMessage());
Response.setSender("Gateway");
Response.setReciever(msg.getSender());
Response.setTime(Instant.now());

Gson builder = new GsonBuilder().setPrettyPrinting().create();
String jsonStr = builder.toJson(Response);
conn.send(jsonStr);
// Message Response = new Message();
// Response.setMessage("returning message: "+msg.getMessage());
// Response.setSender("Gateway");
// Response.setReciever(msg.getSender());
// Response.setTime(Instant.now());
// long timestamp, String username, String gateway
//
// List<SessionMessage> Response = new ArrayList<>();
// Response.add(new SessionMessage(19l,"big Tom","this gateway idk"));
// Response.add(new SessionMessage(29l,"GIT","this gateway idk"));
try {
// SessionMessage sessionMessage = new SessionMessage(Instant.now().getEpochSecond(), "oisinq-baby", InetAddress.getLocalHost().toString()); // (msg.getTime().getEpochSecond(), msg.getSender(), getAddress().toString()
// System.out.println("Sending message...");
// producer.send(session.createObjectMessage(sessionMessage));
// System.out.println("sent message");

Thread.sleep(3000);

System.out.println("rest time...");
RestTemplate restTemplate = new RestTemplate();

ResponseEntity<List<SessionMessage>> rateResponse =
restTemplate.exchange("http://session:8080/sessions",
HttpMethod.GET, null, new ParameterizedTypeReference<List<SessionMessage>>() {
});
System.out.println("Code: " + rateResponse.getStatusCodeValue());
List<SessionMessage> response = rateResponse.getBody();
System.out.println("There are " + response.size() + " messages. Neat.");
for (SessionMessage message2 : response) {
System.out.println("Content: " + message2.getTimestamp() + " - " + message2.getUsername() + " - " + message2.getGateway());
}
Gson builder = new GsonBuilder().setPrettyPrinting().create();
String jsonStr = builder.toJson(response);
conn.send(jsonStr);
} catch (Exception ex) {
System.out.println("hi");
}
}

@Override
Expand All @@ -75,37 +119,34 @@ public void onError(WebSocket conn, Exception ex) {

@Override
public void onStart() {
connectToLoadBalancer();
System.out.println("server started successfully");

String host = "localhost";

try {
ConnectionFactory factory = new ActiveMQConnectionFactory("failover://tcp://" + host + ":61616");
Connection connection = factory.createConnection();
connection.setClientID("sessions");
session = connection.createSession(false, javax.jms.Session.CLIENT_ACKNOWLEDGE);
connection.start();

Queue requestsQueue = session.createQueue("SESSIONS");
producer = session.createProducer(requestsQueue);
} catch (JMSException e) {
connectToLoadBalancer();
} catch (UnknownHostException e) {
e.printStackTrace();
}
System.out.println("server started successfully");
}

public void connectToLoadBalancer() {
public void connectToLoadBalancer() throws UnknownHostException {
RestTemplate restTemplate = new RestTemplate();
String gatewayAddress = getAddress().getHostString() + ":" + getAddress().getPort();
HttpEntity<String> request = new HttpEntity<>(gatewayAddress);

restTemplate.postForObject("http://localhost:8081/addGateway", request, String.class);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}

restTemplate.postForObject("http://load-balancer:8081/addGateway", request, String.class);
System.out.println("I've posted! go me!");
}

public static void main(String[] args) {
String host = "localhost";
public static void main(String[] args) throws UnknownHostException {
String host = Inet4Address.getLocalHost().getHostAddress();
int port = 8080;

System.out.println("waiting");
WebSocketServer server = new ChatEndpoint(new InetSocketAddress(host, port));
server.run();
}
Expand Down
7 changes: 7 additions & 0 deletions load-balancer/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM openjdk:8-jre-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","service.balancer.Application", "mongo"]
Loading

0 comments on commit e1e0566

Please sign in to comment.