blob: 579060d7cb90471b8429811a0bad742407e5b724 [file] [log] [blame]
package org.eclipse.osee.ote.internal.endpoint;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.HashMap;
import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
import org.eclipse.osee.ote.endpoint.EndpointDataProcessor;
import org.eclipse.osee.ote.endpoint.OteEndpointSender;
import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
import org.eclipse.osee.ote.endpoint.OteUdpEndpointInlineSender;
import org.eclipse.osee.ote.endpoint.OteUdpEndpointReceiverImpl;
import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
import org.eclipse.osee.ote.properties.OtePropertiesCore;
public class EndpointComponent implements OteUdpEndpoint {
private OteUdpEndpointReceiverImpl receiver;
private HashMap<InetSocketAddress, OteUdpEndpointSender> senders = new HashMap<>();
private CopyOnWriteNoIteratorList<OteUdpEndpointSender> broadcastThreaded = new CopyOnWriteNoIteratorList<>(OteUdpEndpointSender.class);//for backwards compatibility
private boolean debug = false;
public EndpointComponent(){
int port;
try {
String strPort = OtePropertiesCore.endpointPort.getValue(Integer.toString(PortUtil.getInstance().getValidPort()));
try{
port = Integer.parseInt(strPort);
} catch (Throwable th){
port = PortUtil.getInstance().getValidPort();
}
receiver = new OteUdpEndpointReceiverImpl(new InetSocketAddress(InetAddress.getLocalHost(), port));
} catch (IOException e) {
e.printStackTrace();
}
}
public void start(){
receiver.start();
setDebugOutput(false);
}
public synchronized void stop(){
receiver.stop();
for(OteEndpointSender sender: senders.values()){
try {
sender.stop();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
@Override
public void setDebugOutput(boolean debug) {
String ioRedirect = OtePropertiesCore.ioRedirect.getValue();
if(ioRedirect != null){
if(Boolean.parseBoolean(ioRedirect)){
this.debug = false;
System.out.println("Unable to enable Endpoint debug because -Dote.io.redirect is enabled.");
return;
}
}
this.debug = debug;
receiver.setDebugOutput(debug);
for(OteUdpEndpointSender sender: senders.values()){
sender.setDebug(debug);
}
}
@Override
public InetSocketAddress getLocalEndpoint() {
return receiver.getEndpoint();
}
@Override
public synchronized OteUdpEndpointSender getOteEndpointThreadedSender(InetSocketAddress address) {
OteUdpEndpointSender sender = senders.get(address);
if(sender == null || (sender != null && sender.isClosed())){
sender = new OteUdpEndpointSender(address);
sender.setDebug(debug);
sender.start();
senders.put(address, sender);
}
return sender;
}
@Override
public OteUdpEndpointInlineSender getOteEndpointInlineSender(InetSocketAddress address) {
return new OteUdpEndpointInlineSender(address);
}
@Override
public synchronized OteUdpEndpointSender getOteEndpointSender(InetSocketAddress address) {
return getOteEndpointThreadedSender(address);
}
@Override
public void addBroadcast(OteUdpEndpointSender sender) {
if(!isAlreadyInBroadcastThreadedList(sender) && sender instanceof OteUdpEndpointSender){
broadcastThreaded.add((OteUdpEndpointSender)sender);
}
}
private boolean isAlreadyInBroadcastThreadedList(OteEndpointSender sender) {
OteEndpointSender[] oteUdpEndpointSenders = broadcastThreaded.get();
for(int i = 0; i < oteUdpEndpointSenders.length; i++) {
if(oteUdpEndpointSenders[i].getAddress().getPort() == sender.getAddress().getPort()){
if(oteUdpEndpointSenders[i].getAddress().getAddress().equals(sender.getAddress().getAddress())){
return true;
}
}
}
return false;
}
@Override
public CopyOnWriteNoIteratorList<OteUdpEndpointSender> getBroadcastSenders() {
return broadcastThreaded;
}
@Override
public void addDataProcessor(EndpointDataProcessor processor) {
receiver.addDataProcessor(processor);
}
@Override
public void removeDataProcessor(EndpointDataProcessor processor) {
receiver.removeDataProcessor(processor);
}
@Override
public void removeBroadcast(OteUdpEndpointSender sender) {
if(sender == null){
broadcastThreaded.clear();
} else {
broadcastThreaded.remove(sender);
}
}
// @Override
// public void clearBroadcast() {
// broadcastThreaded.clear();
// }
}