Issue #697 Added support for procedure loading which magically made swapping appear to work too

Change-Id: I86c69781514709df4c6a23bdabfb63a2c103a9ed

Former-commit-id: e1bf6a3b576da036478cd1415856a64ebc606640
This commit is contained in:
Max Schenkelberg 2012-06-06 15:57:16 -05:00
parent ed0b70501f
commit 0776af95e7
7 changed files with 182 additions and 78 deletions

View file

@ -25,7 +25,6 @@ import java.util.List;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Event;
import org.hibernate.InstantiationException;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.IUFStatusHandler;
@ -37,7 +36,9 @@ import com.raytheon.uf.viz.collaboration.comm.identity.event.IVenueParticipantEv
import com.raytheon.uf.viz.collaboration.comm.identity.event.ParticipantEventType; import com.raytheon.uf.viz.collaboration.comm.identity.event.ParticipantEventType;
import com.raytheon.uf.viz.collaboration.comm.identity.user.SharedDisplayRole; import com.raytheon.uf.viz.collaboration.comm.identity.user.SharedDisplayRole;
import com.raytheon.uf.viz.collaboration.comm.provider.TransferRoleCommand; import com.raytheon.uf.viz.collaboration.comm.provider.TransferRoleCommand;
import com.raytheon.uf.viz.collaboration.display.editor.ReprojectEditor;
import com.raytheon.uf.viz.collaboration.display.editor.SharedEditorData; import com.raytheon.uf.viz.collaboration.display.editor.SharedEditorData;
import com.raytheon.uf.viz.collaboration.ui.Activator;
import com.raytheon.uf.viz.collaboration.ui.ColorChangeEvent; import com.raytheon.uf.viz.collaboration.ui.ColorChangeEvent;
import com.raytheon.uf.viz.collaboration.ui.SessionColorManager; import com.raytheon.uf.viz.collaboration.ui.SessionColorManager;
import com.raytheon.uf.viz.collaboration.ui.data.SessionContainer; import com.raytheon.uf.viz.collaboration.ui.data.SessionContainer;
@ -50,6 +51,7 @@ import com.raytheon.uf.viz.collaboration.ui.rsc.CollaborationWrapperResource;
import com.raytheon.uf.viz.collaboration.ui.rsc.CollaborationWrapperResourceData; import com.raytheon.uf.viz.collaboration.ui.rsc.CollaborationWrapperResourceData;
import com.raytheon.uf.viz.collaboration.ui.rsc.DataProviderRscData; import com.raytheon.uf.viz.collaboration.ui.rsc.DataProviderRscData;
import com.raytheon.uf.viz.core.IDisplayPane; import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.IRenderableDisplayChangedListener;
import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.uf.viz.core.drawables.IRenderableDisplay; import com.raytheon.uf.viz.core.drawables.IRenderableDisplay;
import com.raytheon.uf.viz.core.drawables.ResourcePair; import com.raytheon.uf.viz.core.drawables.ResourcePair;
@ -66,6 +68,8 @@ import com.raytheon.viz.ui.EditorUtil;
import com.raytheon.viz.ui.editor.AbstractEditor; import com.raytheon.viz.ui.editor.AbstractEditor;
/** /**
* TODO: This class is in severe need of a refactor!
*
* Handles the events of a session that are specific to the Data Provider role. * Handles the events of a session that are specific to the Data Provider role.
* *
* *
@ -83,13 +87,31 @@ import com.raytheon.viz.ui.editor.AbstractEditor;
* @version 1.0 * @version 1.0
*/ */
public class DataProviderEventController extends AbstractRoleEventController { public class DataProviderEventController extends AbstractRoleEventController
implements IRenderableDisplayChangedListener {
private static final transient IUFStatusHandler statusHandler = UFStatus private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(DataProviderEventController.class); .getHandler(DataProviderEventController.class);
private ResourceWrapperListener wrappingListener; private ResourceWrapperListener wrappingListener;
private DispatcherFactory factory = new DispatcherFactory() {
@Override
public Dispatcher createNewDispatcher(IRenderableDisplay display)
throws InstantiationException {
try {
CollaborationDispatcher dispatcher = new CollaborationDispatcher(
session, display);
dispatchers.add(dispatcher);
return dispatcher;
} catch (CollaborationException e) {
throw new InstantiationException(
"Error constructing collaboration dispatcher: "
+ e.getLocalizedMessage());
}
}
};
private List<CollaborationDispatcher> dispatchers = new LinkedList<CollaborationDispatcher>(); private List<CollaborationDispatcher> dispatchers = new LinkedList<CollaborationDispatcher>();
public DataProviderEventController(ISharedDisplaySession session) { public DataProviderEventController(ISharedDisplaySession session) {
@ -249,6 +271,35 @@ public class DataProviderEventController extends AbstractRoleEventController {
// Replace pane resources that will be shared with // Replace pane resources that will be shared with
// CollaborationWrapperResource objects // CollaborationWrapperResource objects
for (IDisplayPane pane : editor.getDisplayPanes()) { for (IDisplayPane pane : editor.getDisplayPanes()) {
handleNewDisplay(pane);
setActiveDisplay(pane.getRenderableDisplay());
}
editor.addRenderableDisplayChangedListener(this);
}
}
private void setActiveDisplay(IRenderableDisplay display) {
for (CollaborationDispatcher dispatcher : dispatchers) {
dispatcher.setActiveDisplay(display);
}
ReprojectEditor event = new ReprojectEditor();
event.setTargetGeometry(display.getDescriptor().getGridGeometry());
try {
session.sendObjectToVenue(event);
} catch (CollaborationException e) {
Activator.statusHandler.handle(
Priority.PROBLEM,
"Error sending reprojection event: "
+ e.getLocalizedMessage(), e);
}
}
private void handleNewDisplay(IDisplayPane pane) {
try {
if (DispatchingGraphicsFactory.injectRemoteFunctionality(pane,
factory)) {
// If we injected successfully, do resource management
ResourceList list = pane.getDescriptor().getResourceList(); ResourceList list = pane.getDescriptor().getResourceList();
for (ResourcePair rp : pane.getDescriptor().getResourceList()) { for (ResourcePair rp : pane.getDescriptor().getResourceList()) {
wrapResourcePair(rp); wrapResourcePair(rp);
@ -256,26 +307,8 @@ public class DataProviderEventController extends AbstractRoleEventController {
list.addPreAddListener(wrappingListener); list.addPreAddListener(wrappingListener);
list.addPostRemoveListener(wrappingListener); list.addPostRemoveListener(wrappingListener);
} }
} catch (InstantiationException e) {
// Inject remote graphics functionality in container statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
DispatchingGraphicsFactory.injectRemoteFunctionality(editor,
new DispatcherFactory() {
@Override
public Dispatcher createNewDispatcher(
IRenderableDisplay display)
throws InstantiationException {
try {
CollaborationDispatcher dispatcher = new CollaborationDispatcher(
session, display);
dispatchers.add(dispatcher);
return dispatcher;
} catch (CollaborationException e) {
throw new InstantiationException(
"Error creation collaboration dispatcher",
CollaborationDispatcher.class, e);
}
}
});
} }
} }
@ -383,10 +416,10 @@ public class DataProviderEventController extends AbstractRoleEventController {
list.removePreAddListener(wrappingListener); list.removePreAddListener(wrappingListener);
list.removePostRemoveListener(wrappingListener); list.removePostRemoveListener(wrappingListener);
} }
DispatchingGraphicsFactory.extractRemoteFunctionality(editor);
} }
} }
// Dispatchers created are responsible for display extraction
for (CollaborationDispatcher dispatcher : dispatchers) { for (CollaborationDispatcher dispatcher : dispatchers) {
dispatcher.dispose(); dispatcher.dispose();
} }
@ -410,4 +443,22 @@ public class DataProviderEventController extends AbstractRoleEventController {
} }
} }
} }
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.IRenderableDisplayChangedListener#
* renderableDisplayChanged(com.raytheon.uf.viz.core.IDisplayPane,
* com.raytheon.uf.viz.core.drawables.IRenderableDisplay,
* com.raytheon.uf.viz
* .core.IRenderableDisplayChangedListener.DisplayChangeType)
*/
@Override
public void renderableDisplayChanged(IDisplayPane pane,
IRenderableDisplay newRenderableDisplay, DisplayChangeType type) {
if (type == DisplayChangeType.ADD) {
handleNewDisplay(pane);
setActiveDisplay(newRenderableDisplay);
}
}
} }

View file

@ -33,7 +33,6 @@ import com.raytheon.uf.viz.collaboration.ui.data.SessionContainer;
import com.raytheon.uf.viz.collaboration.ui.data.SharedDisplaySessionMgr; import com.raytheon.uf.viz.collaboration.ui.data.SharedDisplaySessionMgr;
import com.raytheon.uf.viz.collaboration.ui.editor.EditorSetup; import com.raytheon.uf.viz.collaboration.ui.editor.EditorSetup;
import com.raytheon.uf.viz.collaboration.ui.editor.SharedResource; import com.raytheon.uf.viz.collaboration.ui.editor.SharedResource;
import com.raytheon.uf.viz.collaboration.ui.rsc.CollaborationResource;
import com.raytheon.uf.viz.collaboration.ui.rsc.CollaborationResourceData; import com.raytheon.uf.viz.collaboration.ui.rsc.CollaborationResourceData;
import com.raytheon.uf.viz.core.IDisplayPane; import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.VizApp;
@ -65,8 +64,6 @@ public class ParticipantEventController extends AbstractRoleEventController {
private static final transient IUFStatusHandler statusHandler = UFStatus private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ParticipantEventController.class); .getHandler(ParticipantEventController.class);
private CollaborationResource collabRsc;
public ParticipantEventController(ISharedDisplaySession session) { public ParticipantEventController(ISharedDisplaySession session) {
super(session); super(session);
} }
@ -111,21 +108,25 @@ public class ParticipantEventController extends AbstractRoleEventController {
CollaborationEditor editor = SharedDisplaySessionMgr CollaborationEditor editor = SharedDisplaySessionMgr
.getSessionContainer(session.getSessionId()) .getSessionContainer(session.getSessionId())
.getCollaborationEditor(); .getCollaborationEditor();
for (IDisplayPane pane : editor.getDisplayPanes()) { if (editor != null) {
IDescriptor desc = pane.getDescriptor(); // Only reproject if editor has been created
if (desc instanceof AbstractDescriptor) { for (IDisplayPane pane : editor.getDisplayPanes()) {
try { IDescriptor desc = pane.getDescriptor();
((AbstractDescriptor) desc).setGridGeometry(event if (desc instanceof AbstractDescriptor) {
.getTargetGeometry()); try {
} catch (VizException e) { ((AbstractDescriptor) desc)
statusHandler.handle(Priority.PROBLEM, .setGridGeometry(event
"Error reprojecting collaboration display: " .getTargetGeometry());
+ e.getLocalizedMessage(), e); } catch (VizException e) {
statusHandler.handle(Priority.PROBLEM,
"Error reprojecting collaboration display: "
+ e.getLocalizedMessage(), e);
}
} }
pane.setZoomLevel(1.0);
pane.scaleToClientArea();
pane.refresh();
} }
pane.setZoomLevel(1.0);
pane.scaleToClientArea();
pane.refresh();
} }
} }
}); });
@ -169,8 +170,6 @@ public class ParticipantEventController extends AbstractRoleEventController {
ResourcePair rp = ResourcePair.constructSystemResourcePair(crd); ResourcePair rp = ResourcePair.constructSystemResourcePair(crd);
desc.getResourceList().add(rp); desc.getResourceList().add(rp);
desc.getResourceList().instantiateResources(desc, true); desc.getResourceList().instantiateResources(desc, true);
collabRsc = (CollaborationResource) rp.getResource();
this.session.registerEventHandler(collabRsc);
} }
/* /*
@ -188,9 +187,6 @@ public class ParticipantEventController extends AbstractRoleEventController {
if (container != null) { if (container != null) {
super.deactivateResources(container.getCollaborationEditor()); super.deactivateResources(container.getCollaborationEditor());
} }
if (this.collabRsc != null) {
this.session.unRegisterEventHandler(collabRsc);
}
} }
@Subscribe @Subscribe

View file

@ -44,6 +44,7 @@ import com.raytheon.uf.viz.core.drawables.IRenderableDisplay;
import com.raytheon.uf.viz.core.jobs.JobPool; import com.raytheon.uf.viz.core.jobs.JobPool;
import com.raytheon.uf.viz.core.rsc.IInputHandler; import com.raytheon.uf.viz.core.rsc.IInputHandler;
import com.raytheon.uf.viz.remote.graphics.Dispatcher; import com.raytheon.uf.viz.remote.graphics.Dispatcher;
import com.raytheon.uf.viz.remote.graphics.DispatchingGraphicsFactory;
import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent; import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
import com.raytheon.uf.viz.remote.graphics.events.AbstractRemoteGraphicsEvent; import com.raytheon.uf.viz.remote.graphics.events.AbstractRemoteGraphicsEvent;
import com.raytheon.uf.viz.remote.graphics.events.ICreationEvent; import com.raytheon.uf.viz.remote.graphics.events.ICreationEvent;
@ -126,6 +127,8 @@ public class CollaborationDispatcher extends Dispatcher {
private IRenderableDisplay display; private IRenderableDisplay display;
private IRenderableDisplay activeDisplay;
public CollaborationDispatcher(ISharedDisplaySession session, public CollaborationDispatcher(ISharedDisplaySession session,
IRenderableDisplay display) throws CollaborationException { IRenderableDisplay display) throws CollaborationException {
this.session = session; this.session = session;
@ -139,6 +142,28 @@ public class CollaborationDispatcher extends Dispatcher {
// display.getContainer().registerMouseHandler(mouseCapturer); // display.getContainer().registerMouseHandler(mouseCapturer);
} }
/**
* Update the active display to render for
*
* @param display
*/
public void setActiveDisplay(IRenderableDisplay active) {
if (display != active) {
disposeFrames();
}
this.activeDisplay = active;
display.refresh();
}
/**
* Returns the IRenderableDisplay this dispatcher is dispatching for
*
* @return
*/
public IRenderableDisplay getDisplay() {
return display;
}
@Subscribe @Subscribe
public void handleNeedsRenderFrameEvent(RenderFrameNeededEvent event) { public void handleNeedsRenderFrameEvent(RenderFrameNeededEvent event) {
synchronized (previousFrames) { synchronized (previousFrames) {
@ -173,7 +198,10 @@ public class CollaborationDispatcher extends Dispatcher {
@Override @Override
public void dispatch(AbstractRemoteGraphicsEvent eventObject) { public void dispatch(AbstractRemoteGraphicsEvent eventObject) {
if (eventObject instanceof IRenderFrameEvent) { if (eventObject instanceof IRenderFrameEvent) {
send(eventObject); if (activeDisplay == display) {
// Only dispatch render frame events IF we are active
send(eventObject);
}
return; return;
} }
// Set PERSISTENCE to true if testing persisting capabilities // Set PERSISTENCE to true if testing persisting capabilities
@ -291,10 +319,21 @@ public class CollaborationDispatcher extends Dispatcher {
Activator.statusHandler.handle(Priority.PROBLEM, Activator.statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e); e.getLocalizedMessage(), e);
} }
disposeFrames();
session.unRegisterEventHandler(this);
// Extract the remote functionality
for (IDisplayPane pane : display.getContainer().getDisplayPanes()) {
if (pane.getRenderableDisplay() == display) {
DispatchingGraphicsFactory.extractRemoteFunctionality(pane);
}
}
}
private void disposeFrames() {
for (RenderFrame frame : previousFrames) { for (RenderFrame frame : previousFrames) {
frame.dispose(); frame.dispose();
} }
previousFrames.clear(); previousFrames.clear();
session.unRegisterEventHandler(this);
} }
} }

View file

@ -308,7 +308,7 @@ public class CollaborationObjectEventStorage implements
}; };
mkcol.setURI(folderPath); mkcol.setURI(folderPath);
HttpClientResponse rsp = executeRequest(mkcol); HttpClientResponse rsp = executeRequest(mkcol);
if (isSuccess(rsp.code) == false) { if (isSuccess(rsp.code) == false && isDirExists(rsp.code) == false) {
throw new CollaborationException("Folder creation failed for " throw new CollaborationException("Folder creation failed for "
+ folderPath + ": " + new String(rsp.data)); + folderPath + ": " + new String(rsp.data));
} }
@ -340,6 +340,10 @@ public class CollaborationObjectEventStorage implements
return code == 404 || code == 410; return code == 404 || code == 410;
} }
private boolean isDirExists(int code) {
return code == 405 || code == 301;
}
@DynamicSerialize @DynamicSerialize
public static class CollaborationHttpPersistedObject { public static class CollaborationHttpPersistedObject {

View file

@ -144,6 +144,7 @@ public class CollaborationResource extends
@Override @Override
protected void disposeInternal() { protected void disposeInternal() {
resourceData.getSession().unRegisterEventHandler(this);
dataManager.dispose(); dataManager.dispose();
renderingRouter = null; renderingRouter = null;
} }
@ -221,6 +222,7 @@ public class CollaborationResource extends
ParticipantInitializedEvent event = new ParticipantInitializedEvent(); ParticipantInitializedEvent event = new ParticipantInitializedEvent();
event.setUserId(session.getUserID().getFQName()); event.setUserId(session.getUserID().getFQName());
try { try {
session.registerEventHandler(this);
session.sendObjectToPeer(session.getCurrentDataProvider(), event); session.sendObjectToPeer(session.getCurrentDataProvider(), event);
} catch (CollaborationException e) { } catch (CollaborationException e) {
Activator.statusHandler.handle(Priority.PROBLEM, Activator.statusHandler.handle(Priority.PROBLEM,

View file

@ -238,9 +238,11 @@ public class CollaborationDrawingResource extends
*/ */
@Override @Override
public void project(CoordinateReferenceSystem crs) throws VizException { public void project(CoordinateReferenceSystem crs) throws VizException {
synchronized (layerMap) { if (layerMap != null) {
for (DrawingToolLayer layer : layerMap.values()) { synchronized (layerMap) {
layer.reproject(descriptor.getGridGeometry()); for (DrawingToolLayer layer : layerMap.values()) {
layer.reproject(descriptor.getGridGeometry());
}
} }
} }
} }

View file

@ -27,7 +27,6 @@ import org.opengis.coverage.grid.GridEnvelope;
import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.AbstractGraphicsFactoryAdapter; import com.raytheon.uf.viz.core.AbstractGraphicsFactoryAdapter;
import com.raytheon.uf.viz.core.IDisplayPane; import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.IView; import com.raytheon.uf.viz.core.IView;
@ -154,42 +153,53 @@ public class DispatchingGraphicsFactory extends AbstractGraphicsFactoryAdapter {
return delegate.constrcutCanvas(canvasComp); return delegate.constrcutCanvas(canvasComp);
} }
public static void injectRemoteFunctionality( /**
IDisplayPaneContainer container, DispatcherFactory factory) { * Injects the DispatchingGraphicsFactory into the given display
try { *
for (IDisplayPane pane : container.getDisplayPanes()) { * @param display
IRenderableDisplay display = pane.getRenderableDisplay(); * @param factory
Dispatcher dispatcher = factory.createNewDispatcher(display); * @throws InstantiationException
// Wrap the graphics adapter in dispatching one */
display.setGraphicsAdapter(new DispatchingGraphicsFactory( public static boolean injectRemoteFunctionality(IDisplayPane pane,
display.getGraphicsAdapter(), dispatcher)); DispatcherFactory factory) throws InstantiationException {
refreshPane(pane); boolean injected = false;
} IRenderableDisplay display = pane.getRenderableDisplay();
} catch (InstantiationException e) { AbstractGraphicsFactoryAdapter currAdapter = display
extractRemoteFunctionality(container); .getGraphicsAdapter();
throw new RuntimeException(e); if (currAdapter instanceof DispatchingGraphicsFactory == false) {
// Wrap the graphics adapter in dispatching one
display.setGraphicsAdapter(new DispatchingGraphicsFactory(
currAdapter, factory.createNewDispatcher(display)));
refreshPane(pane);
injected = true;
} }
return injected;
} }
/** /**
* Removes remote graphics functionality from a display pane container * Extracts the DispatchingGraphicsFactory from the given renderable display
* *
* @param container * @param display
*/ */
public static void extractRemoteFunctionality( public static boolean extractRemoteFunctionality(IDisplayPane pane) {
IDisplayPaneContainer container) { boolean extracted = false;
for (IDisplayPane pane : container.getDisplayPanes()) { IRenderableDisplay display = pane.getRenderableDisplay();
IRenderableDisplay display = pane.getRenderableDisplay(); AbstractGraphicsFactoryAdapter adapter = display.getGraphicsAdapter();
AbstractGraphicsFactoryAdapter adapter = display if (adapter instanceof DispatchingGraphicsFactory) {
.getGraphicsAdapter(); AbstractGraphicsFactoryAdapter wrapped = ((DispatchingGraphicsFactory) adapter).delegate;
if (adapter instanceof DispatchingGraphicsFactory) { display.setGraphicsAdapter(wrapped);
AbstractGraphicsFactoryAdapter wrapped = ((DispatchingGraphicsFactory) adapter).delegate; refreshPane(pane);
display.setGraphicsAdapter(wrapped); extracted = true;
refreshPane(pane);
}
} }
return extracted;
} }
/**
* Refresh the IDisplayPane and recycle the resources on the pane. Should be
* executed after graphics injection
*
* @param pane
*/
private static void refreshPane(IDisplayPane pane) { private static void refreshPane(IDisplayPane pane) {
IRenderableDisplay display = pane.getRenderableDisplay(); IRenderableDisplay display = pane.getRenderableDisplay();
IDescriptor descriptor = display.getDescriptor(); IDescriptor descriptor = display.getDescriptor();