/* * 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 org.pieShare.pieShareServer.tasks; import java.net.InetSocketAddress; import org.pieShare.pieTools.piePlate.model.message.loopHoleMessages.LoopHoleConnectionMessage; import org.pieShare.pieTools.piePlate.model.message.loopHoleMessages.RegisterMessage; import org.pieShare.pieTools.pieUtilities.service.pieExecutorService.api.task.IPieEventTask; import org.pieShare.pieShareServer.services.loopHoleService.api.ILoopHoleService; import org.pieShare.pieShareServer.services.loopHoleService.api.IUserPersistanceService; import org.pieShare.pieShareServer.services.model.Client; import org.pieShare.pieShareServer.services.model.SubClient; import org.pieShare.pieShareServer.services.model.User; import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger; /** * * @author Richard */ public class RegisterTask implements IPieEventTask<RegisterMessage> { private RegisterMessage msg; private IUserPersistanceService userPersistanceService; private ILoopHoleService loopHoleService; public void setLoopHoleService(ILoopHoleService loopHoleService) { this.loopHoleService = loopHoleService; } public void setUserPersistanceService(IUserPersistanceService userPersistanceService) { this.userPersistanceService = userPersistanceService; } @Override public void setEvent(RegisterMessage msg) { this.msg = msg; } @Override public void run() { User newUser = userPersistanceService.getByID(msg.getName()); if (newUser == null) { newUser = new User(); newUser.setIdName(msg.getName()); userPersistanceService.addUser(newUser); } Client client = newUser.getClients().get(msg.getSenderID()); if (client == null) { client = new Client(); client.setId(msg.getSenderID()); newUser.getClients().put(msg.getSenderID(), client); } SubClient subClient = client.getSubClients().get(msg.getLocalLoopID()); if (subClient == null) { subClient = new SubClient(); client.getSubClients().put(msg.getLocalLoopID(), subClient); } InetSocketAddress privateAddress = new InetSocketAddress(msg.getPrivateHost(), msg.getPrivatePort()); subClient.setPrivateAddress(privateAddress); subClient.setPublicAddress(msg.getSenderAddress()); subClient.setLoopHoleID(msg.getLocalLoopID()); client.getSubClients().put(subClient.getLoopHoleID(), subClient); PieLogger.info(this.getClass(), String.format("User: %s with SubUD: %s Registered Sucessfully.", newUser.getIdName(), msg.getLocalLoopID())); PieLogger.info(this.getClass(), String.format("PublicHost: %s, PublicPort: %s", subClient.getPublicAddress().getAddress().getHostAddress(), subClient.getPublicAddress().getPort())); PieLogger.info(this.getClass(), String.format("PrivateHost: %s, PrivatePort: %s", subClient.getPrivateAddress().getAddress().getHostAddress(), subClient.getPrivateAddress().getPort())); LoopHoleConnectionMessage connectionMessageToReceiver = new LoopHoleConnectionMessage(); connectionMessageToReceiver.setClientPrivateIP(subClient.getPrivateAddress().getAddress().getHostAddress()); connectionMessageToReceiver.setClientPrivatePort(subClient.getPrivateAddress().getPort()); connectionMessageToReceiver.setClientPublicIP(subClient.getPublicAddress().getAddress().getHostAddress()); connectionMessageToReceiver.setClientPublicPort(subClient.getPublicAddress().getPort()); connectionMessageToReceiver.setFromId(client.getId()); for (Client cl : newUser.getClients().values()) { if (cl.getId().equals(msg.getSenderID())) { continue; } SubClient subToUse = null; for (SubClient sub : cl.getSubClients().values()) { if (sub.getConnectedTo() == null) { subToUse = sub; } if (sub.getConnectedTo() != null && sub.getConnectedTo().equals(msg.getSenderID())) { subToUse = null; break; } } if (subToUse != null) { LoopHoleConnectionMessage connectionMessageToSender = new LoopHoleConnectionMessage(); connectionMessageToSender.setClientPrivateIP(subToUse.getPrivateAddress().getAddress().getHostAddress()); connectionMessageToSender.setClientPrivatePort(subToUse.getPrivateAddress().getPort()); connectionMessageToSender.setClientPublicIP(subToUse.getPublicAddress().getAddress().getHostAddress()); connectionMessageToSender.setClientPublicPort(subToUse.getPublicAddress().getPort()); connectionMessageToSender.setFromId(cl.getId()); connectionMessageToSender.setSenderID(msg.getSenderID()); connectionMessageToSender.setLocalLoopID(msg.getLocalLoopID()); connectionMessageToSender.setClientLocalLoopID(subToUse.getLoopHoleID()); loopHoleService.send(connectionMessageToSender, msg.getSenderAddress()); connectionMessageToReceiver.setSenderID(cl.getId()); connectionMessageToReceiver.setLocalLoopID(subToUse.getLoopHoleID()); connectionMessageToReceiver.setClientLocalLoopID(msg.getLocalLoopID()); loopHoleService.send(connectionMessageToReceiver, subToUse.getPublicAddress()); subClient.setConnectedTo(cl.getId()); //userPersistanceService.mergeUser(user); subToUse.setConnectedTo(client.getId()); break; } } /* HashMap<String, User> notConnectedUsers = userPersistanceService.getNonConnectedUsersByName(msg.getName()); for (User user : notConnectedUsers.values()) { PieLogger.info(this.getClass(), String.format("Found non connected users. Count: %s", notConnectedUsers.size())); if (!msg.getSenderID().equals(user.getId())) { LoopHoleConnectionMessage connectionMessageToSender = new LoopHoleConnectionMessage(); connectionMessageToSender.setClientPrivateIP(subClient.getPrivateAddress().getHost()); connectionMessageToSender.setClientPrivatePort(subClient.getPrivateAddress().getPort()); connectionMessageToSender.setClientPublicIP(subClient.getPublicAddress().getHost()); connectionMessageToSender.setClientPublicPort(subClient.getPublicAddress().getPort()); connectionMessageToSender.setFromId(user.getId()); connectionMessageToSender.setSenderID(msg.getSenderID()); connectionMessageToSender.setLocalLoopID(msg.getLocalLoopID()); connectionMessageToSender.setClientLocalLoopID(subClient.getLoopHoleID()); loopHoleService.send(connectionMessageToSender, msg.getSenderAddress()); connectionMessageToReceiver.setSenderID(user.getId()); connectionMessageToReceiver.setLocalLoopID(subClient.getLoopHoleID()); connectionMessageToReceiver.setClientLocalLoopID(msg.getLocalLoopID()); loopHoleService.send(connectionMessageToReceiver, subClient.getPublicAddress()); subClient.setConnectedTo(msg.getLocalLoopID()); userPersistanceService.mergeUser(user); subClient.setConnectedTo(subClient.getLoopHoleID()); break; } } userPersistanceService.addUser(newUser); /* for (User user : notConnectedUsers.values()) { if (!msg.getSenderID().equals(user.getId())) { LoopHoleConnectionMessage connectionMessageToSender = new LoopHoleConnectionMessage(); connectionMessageToSender.setClientPrivateIP(user.getPrivateAddress().getHost()); connectionMessageToSender.setClientPrivatePort(user.getPrivateAddress().getPort()); connectionMessageToSender.setClientPublicIP(user.getPublicAddress().getHost()); connectionMessageToSender.setClientPublicPort(user.getPublicAddress().getPort()); connectionMessageToSender.setFromId(user.getId()); connectionMessageToSender.setSenderID(msg.getSenderID()); loopHoleService.send(connectionMessageToSender, msg.getSenderAddress()); } connectionMessageToReceiver.setSenderID(user.getId()); loopHoleService.send(connectionMessageToReceiver, user.getPublicAddress()); }*/ } }