package krasa.frameswitcher.networking; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.IdeFrame; import krasa.frameswitcher.FocusUtils; import krasa.frameswitcher.FrameSwitchAction; import krasa.frameswitcher.FrameSwitcherApplicationComponent; import krasa.frameswitcher.networking.dto.GeneralMessage; import krasa.frameswitcher.networking.dto.InstanceClosed; import krasa.frameswitcher.networking.dto.InstanceStarted; import krasa.frameswitcher.networking.dto.OpenProject; import krasa.frameswitcher.networking.dto.Ping; import krasa.frameswitcher.networking.dto.PingResponse; import krasa.frameswitcher.networking.dto.ProjectClosed; import krasa.frameswitcher.networking.dto.ProjectOpened; import krasa.frameswitcher.networking.dto.ProjectsState; import org.jgroups.Message; import org.jgroups.ReceiverAdapter; import java.util.List; import java.util.UUID; public class Receiver extends ReceiverAdapter { private final Logger LOG = Logger.getInstance("#" + getClass().getCanonicalName()); private UUID uuid; private FrameSwitcherApplicationComponent applicationComponent; public Receiver(UUID uuid, FrameSwitcherApplicationComponent applicationComponent) { this.uuid = uuid; this.applicationComponent = applicationComponent; } public void receive(Message msg) { Object object = msg.getObject(); if (object instanceof GeneralMessage) { if (((GeneralMessage) object).getUuid().equals(uuid)) { return; } } if (LOG.isDebugEnabled()) { LOG.debug("Received: " + object); } if (object instanceof InstanceStarted) { instanceStarted((InstanceStarted) object); } else if (object instanceof ProjectsState) { updateRemoteProjectsState((ProjectsState) object); } else if (object instanceof Ping) { ping(msg); } else if (object instanceof PingResponse) { pingResponse((PingResponse) object); } else if (object instanceof ProjectOpened) { applicationComponent.getRemoteInstancesState().projectOpened((ProjectOpened) object); } else if (object instanceof ProjectClosed) { applicationComponent.getRemoteInstancesState().projectClosed((ProjectClosed) object); } else if (object instanceof InstanceClosed) { applicationComponent.getRemoteInstancesState().instanceClosed((InstanceClosed) object); } else if (object instanceof OpenProject) { openProject((OpenProject) object); } } private void pingResponse(PingResponse object) { applicationComponent.getRemoteInstancesState().processPingResponse(object); } private void ping(Message msg) { applicationComponent.getRemoteSender().sendPingResponse(msg); } private void instanceStarted(InstanceStarted instanceStarted) { applicationComponent.getRemoteInstancesState().updateRemoteState(instanceStarted); applicationComponent.getRemoteSender().sendProjectsState(); } private void updateRemoteProjectsState(ProjectsState object) { applicationComponent.getRemoteInstancesState().updateRemoteState(object); } private void openProject(OpenProject openProject) { if (openProject.getTargetUUID().equals(uuid)) { List<IdeFrame> ideFrames = new FrameSwitchAction().getIdeFrames(); for (final IdeFrame ideFrame : ideFrames) { final Project project = ideFrame.getProject(); if (project != null && openProject.getProject().getProjectPath().equals(project.getBasePath())) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { FocusUtils.requestFocus(project, true); } }); } } } } }