Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Basic #9

Merged
merged 7 commits into from
Dec 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.

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")){
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we get rid of this commented out code yet?

// 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:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can get rid of client from here now

# 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();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we delete the sample code yet

// 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