package krasa.frameswitcher.networking;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.IdeFrame;
import krasa.frameswitcher.FrameSwitchAction;
import krasa.frameswitcher.FrameSwitcherUtils;
import krasa.frameswitcher.networking.dto.*;
import org.jgroups.JChannel;
import org.jgroups.Message;
import java.util.List;
import java.util.UUID;
/**
* @author Vojtech Krasa
*/
public class RemoteSenderImpl implements RemoteSender {
private final Logger LOG = Logger.getInstance("#" + getClass().getCanonicalName());
private UUID uuid;
private JChannel channel;
public RemoteSenderImpl(UUID uuid, final Receiver r) throws Exception {
this.uuid = uuid;
channel = new JChannel("frameswitcher-fast-local.xml");
// channel = new JChannel("tcp.xml");
channel.setReceiver(r);
channel.connect("MyCluster");
sendInstanceStarted();
}
@java.lang.Override
public void sendInstanceStarted() {
List<IdeFrame> ideFrames = new FrameSwitchAction().getIdeFrames();
final AnAction[] recentProjectsActions = FrameSwitcherUtils.getRecentProjectsManagerBase().getRecentProjectsActions(false);
LOG.info("sending InstanceStarted");
send(new Message(null, new InstanceStarted(uuid, recentProjectsActions, ideFrames)));
}
@java.lang.Override
public void sendProjectsState() {
List<IdeFrame> ideFrames = new FrameSwitchAction().getIdeFrames();
final AnAction[] recentProjectsActions = FrameSwitcherUtils.getRecentProjectsManagerBase().getRecentProjectsActions(false);
LOG.info("sending ProjectsState");
final Message msg = new Message(null, new ProjectsState(uuid, recentProjectsActions, ideFrames));
send(msg);
}
@java.lang.Override
public void close() {
LOG.info("sending InstanceClosed");
send(new Message(null, new InstanceClosed(uuid)));
channel.close();
}
@java.lang.Override
public void pingRemote() {
LOG.info("sending Ping");
send(new Message(null, new Ping(uuid)));
}
@java.lang.Override
public void projectOpened(Project project) {
LOG.info("sending ProjectOpened");
send(new Message(null, new ProjectOpened(project.getName(), project.getBasePath(), uuid)));
}
@java.lang.Override
public void sendProjectClosed(Project project) {
LOG.info("sending ProjectClosed");
send(new Message(null, new ProjectClosed(project.getName(), project.getBasePath(), uuid)));
}
@java.lang.Override
public void openProject(UUID target, RemoteProject remoteProject) {
final OpenProject openProject = new OpenProject(uuid, target, remoteProject);
LOG.info("sending openProject");
send(new Message(null, openProject));
}
@java.lang.Override
public void sendPingResponse(Message msg) {
LOG.info("sending PingResponse");
send(new Message(msg.getSrc(), new PingResponse(uuid)));
}
private void send(Message msg) {
try {
channel.send(msg);
} catch (Throwable e) {
LOG.warn(e);
}
}
public JChannel getChannel() {
return channel;
}
}