diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/AbstractHandler.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/AbstractHandler.java deleted file mode 100644 index 54aa02601c0..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/AbstractHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.sap.sailing.gwt.ui.server.dispatch; - -import java.lang.reflect.ParameterizedType; - -import com.sap.sailing.gwt.ui.shared.dispatch.Action; -import com.sap.sailing.gwt.ui.shared.dispatch.Result; - -public abstract class AbstractHandler> implements Handler { - private Class type; - - @SuppressWarnings("unchecked") - protected AbstractHandler() { - type = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1]; - } - - @Override - public final Class getType() { - return type; - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/AbstractSailingHandler.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/AbstractSailingHandler.java deleted file mode 100644 index 1a3949322eb..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/AbstractSailingHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sap.sailing.gwt.ui.server.dispatch; - -import org.osgi.util.tracker.ServiceTracker; - -import com.sap.sailing.gwt.ui.shared.dispatch.Action; -import com.sap.sailing.gwt.ui.shared.dispatch.Result; -import com.sap.sailing.server.RacingEventService; - -public abstract class AbstractSailingHandler> extends AbstractHandler { - private final ServiceTracker racingEventServiceTracker; - - public AbstractSailingHandler(ServiceTracker racingEventServiceTracker) { - this.racingEventServiceTracker = racingEventServiceTracker; - } - - public RacingEventService getService() { - return racingEventServiceTracker.getService(); - } -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/DispatchContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/DispatchContext.java deleted file mode 100644 index 65004c509ec..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/DispatchContext.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sailing.gwt.ui.server.dispatch; - -import com.sap.sailing.gwt.ui.shared.dispatch.Action; -import com.sap.sailing.gwt.ui.shared.dispatch.DispatchException; -import com.sap.sailing.gwt.ui.shared.dispatch.Result; - -public interface DispatchContext { - - public > R execute(A action) throws DispatchException; - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/DispatchRPCImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/DispatchRPCImpl.java index 248ff5f8eae..db5e44047b0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/DispatchRPCImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/DispatchRPCImpl.java @@ -1,95 +1,26 @@ package com.sap.sailing.gwt.ui.server.dispatch; -import java.text.MessageFormat; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.osgi.framework.BundleContext; -import org.osgi.util.tracker.ServiceTracker; - -import com.sap.sailing.gwt.ui.server.Activator; import com.sap.sailing.gwt.ui.server.ProxiedRemoteServiceServlet; -import com.sap.sailing.gwt.ui.server.dispatch.handlers.BatchActionHandler; -import com.sap.sailing.gwt.ui.server.dispatch.handlers.GetLiveRacesActionHandler; -import com.sap.sailing.gwt.ui.server.dispatch.handlers.OtherActionHandler; import com.sap.sailing.gwt.ui.shared.dispatch.Action; +import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; +import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContextImpl; import com.sap.sailing.gwt.ui.shared.dispatch.DispatchException; import com.sap.sailing.gwt.ui.shared.dispatch.Result; import com.sap.sailing.gwt.ui.shared.dispatch.rpc.DispatchRPC; -import com.sap.sailing.server.RacingEventService; -import com.sap.sse.util.ServiceTrackerFactory; public class DispatchRPCImpl extends ProxiedRemoteServiceServlet implements DispatchRPC { private static final long serialVersionUID = -245230476512348999L; - private final ServiceTracker racingEventServiceTracker; - private final Map>, Handler>> handlers = new HashMap<>(); + private final DispatchContext ctx; public DispatchRPCImpl() { - BundleContext context = Activator.getDefault(); - Activator activator = Activator.getInstance(); - if (context != null) { - // TODO - // activator.setSailingService(this); // register so this service is informed when the bundle shuts down - } - racingEventServiceTracker = ServiceTrackerFactory.createAndOpen(context, RacingEventService.class); - - addHandlers(); - } - - private void addHandlers() { - addHandler(new BatchActionHandler()); - addHandler(new GetLiveRacesActionHandler(racingEventServiceTracker)); - addHandler(new OtherActionHandler(racingEventServiceTracker)); - - } - - private > void addHandler(Handler handler) { - Class actionType = handler.getType(); - if (handlers.containsKey(actionType)) { - String errorMessage = MessageFormat.format( - "A handler for Action {0} is already registered. Registered handler: {1}, new handler: {2}", - actionType.getName(), handlers.get(actionType).getClass().getName(), handler.getClass().getName()); - throw new IllegalStateException(errorMessage); - } - handlers.put(actionType, handler); + ctx = new DispatchContextImpl(); } @Override public > R execute(A action) throws DispatchException { - return execute(action, new DispatchContextImpl(getThreadLocalRequest(), getThreadLocalResponse())); - } - - @SuppressWarnings({ "unchecked" }) - public > R execute(A action, DispatchContext context) throws DispatchException { - Class actionType = (Class) action.getClass(); - - Handler handler = (Handler) handlers.get(actionType); - if (handler != null) { - return handler.execute(action, context); - } - String errorMessage = MessageFormat.format("No handler found for Action {0}", actionType.getName()); - throw new IllegalStateException(errorMessage); - } - - private class DispatchContextImpl implements DispatchContext { - @SuppressWarnings("unused") - private final HttpServletRequest req; - @SuppressWarnings("unused") - private final HttpServletResponse resp; - - public DispatchContextImpl(HttpServletRequest req, HttpServletResponse resp) { - this.req = req; - this.resp = resp; - } - - public > R execute(A action) throws DispatchException { - return DispatchRPCImpl.this.execute(action, this); - } + return action.execute(ctx); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/Handler.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/Handler.java deleted file mode 100644 index cbb66500081..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/Handler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sap.sailing.gwt.ui.server.dispatch; - -import com.sap.sailing.gwt.ui.shared.dispatch.Action; -import com.sap.sailing.gwt.ui.shared.dispatch.Result; - -public interface Handler> { - Class getType(); - - R execute(A action, DispatchContext context); -} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/BatchActionHandler.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/BatchActionHandler.java deleted file mode 100644 index c879a304700..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/BatchActionHandler.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.sap.sailing.gwt.ui.server.dispatch.handlers; - -import java.util.ArrayList; - -import com.sap.sailing.gwt.ui.server.dispatch.AbstractHandler; -import com.sap.sailing.gwt.ui.server.dispatch.DispatchContext; -import com.sap.sailing.gwt.ui.shared.dispatch.Action; -import com.sap.sailing.gwt.ui.shared.dispatch.BatchAction; -import com.sap.sailing.gwt.ui.shared.dispatch.BatchResult; -import com.sap.sailing.gwt.ui.shared.dispatch.DispatchException; -import com.sap.sailing.gwt.ui.shared.dispatch.Result; - -public class BatchActionHandler extends AbstractHandler { - - @Override - public BatchResult execute(BatchAction action, DispatchContext context) throws DispatchException { - final int nrOfActions = action.getActions().length; - final ArrayList results = new ArrayList(nrOfActions); - final ArrayList exceptions = new ArrayList(nrOfActions); - for (Action a : action.getActions()) { - final String actionName = a.getClass().getSimpleName(); -// TODO LOG.trace("Found action {} in batch", actionName); - Result result = null; - try { - result = context.execute(a); - exceptions.add(null); - } catch (Throwable e) { - DispatchException e2 = this.handleException(e); - exceptions.add(e2); - } - results.add(result); - } - return new BatchResult(results, exceptions); - } - - /** - * Throw exception to terminate Batch, return Exception to add to list - * - * @param e - * @return - */ - protected DispatchException handleException(Throwable e) { - return new DispatchException(e.getLocalizedMessage()); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/GetLiveRacesActionHandler.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/GetLiveRacesActionHandler.java deleted file mode 100644 index 55aaabe4557..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/GetLiveRacesActionHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sap.sailing.gwt.ui.server.dispatch.handlers; - -import org.osgi.util.tracker.ServiceTracker; - -import com.sap.sailing.domain.base.Event; -import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.domain.tracking.TrackedRace; -import com.sap.sailing.gwt.ui.server.dispatch.AbstractSailingHandler; -import com.sap.sailing.gwt.ui.server.dispatch.DispatchContext; -import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; -import com.sap.sailing.gwt.ui.shared.dispatch.event.GetLiveRacesAction; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRaceDTO; -import com.sap.sailing.gwt.ui.shared.dispatch.event.LiveRacesDTO; -import com.sap.sailing.server.RacingEventService; -import com.sap.sse.common.impl.MillisecondsTimePoint; - -public class GetLiveRacesActionHandler extends AbstractSailingHandler, GetLiveRacesAction> { - - public GetLiveRacesActionHandler(ServiceTracker racingEventServiceTracker) { - super(racingEventServiceTracker); - } - - @Override - public ResultWithTTL execute(GetLiveRacesAction action, DispatchContext context) { - MillisecondsTimePoint now = MillisecondsTimePoint.now(); - LiveRacesDTO result = new LiveRacesDTO(); - - Event event = getService().getEvent(action.getEventId()); - for (LeaderboardGroup lg : event.getLeaderboardGroups()) { - for (Leaderboard lb : lg.getLeaderboards()) { -// Regatta regatta = getService().getRegattaByName(lb.getName()); - for (TrackedRace trackedRace : lb.getTrackedRaces()) { -// trackedRace.getMarks() - if(trackedRace.getStartOfRace().before(now) && trackedRace.getEndOfRace().after(now)) { - result.addRace(new LiveRaceDTO(trackedRace.getRace().getName())); - } - } -// for (RaceDefinition rd : regatta.getAllRaces()) { -// rd. -// } - } - } - return new ResultWithTTL(5000, result); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/OtherActionHandler.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/OtherActionHandler.java deleted file mode 100644 index b564a1ad168..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/dispatch/handlers/OtherActionHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sap.sailing.gwt.ui.server.dispatch.handlers; - -import org.osgi.util.tracker.ServiceTracker; - -import com.sap.sailing.gwt.ui.server.dispatch.AbstractSailingHandler; -import com.sap.sailing.gwt.ui.server.dispatch.DispatchContext; -import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; -import com.sap.sailing.gwt.ui.shared.dispatch.event.OtherAction; -import com.sap.sailing.gwt.ui.shared.dispatch.event.OtherDTO; -import com.sap.sailing.server.RacingEventService; - -public class OtherActionHandler extends AbstractSailingHandler, OtherAction> { - - public OtherActionHandler(ServiceTracker racingEventServiceTracker) { - super(racingEventServiceTracker); - } - - @Override - public ResultWithTTL execute(OtherAction action, DispatchContext context) { - return new ResultWithTTL<>(3000, new OtherDTO()); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/Action.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/Action.java index 7b0aeb6e8a2..aa577ee0d87 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/Action.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/Action.java @@ -1,7 +1,11 @@ package com.sap.sailing.gwt.ui.shared.dispatch; +import com.google.gwt.core.shared.GwtIncompatible; import com.google.gwt.user.client.rpc.IsSerializable; public interface Action extends IsSerializable { -} + @GwtIncompatible + R execute(DispatchContext ctx) throws DispatchException; + +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/BatchAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/BatchAction.java index 13357f92a67..c612cf05827 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/BatchAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/BatchAction.java @@ -1,5 +1,9 @@ package com.sap.sailing.gwt.ui.shared.dispatch; +import java.util.ArrayList; + +import com.google.gwt.core.shared.GwtIncompatible; + public class BatchAction implements Action { private Action[] actions; @@ -14,4 +18,32 @@ public class BatchAction implements Action { public Action[] getActions() { return actions; } + + @Override + @GwtIncompatible + public BatchResult execute(DispatchContext ctx) throws DispatchException { + + final int nrOfActions = getActions().length; + final ArrayList results = new ArrayList(nrOfActions); + final ArrayList exceptions = new ArrayList(nrOfActions); + for (Action a : getActions()) { + final String actionName = a.getClass().getSimpleName(); + // TODO LOG.trace("Found action {} in batch", actionName); + Result result = null; + try { + result = a.execute(ctx); + exceptions.add(null); + } catch (Throwable e) { + DispatchException e2 = handleException(e); + exceptions.add(e2); + } + results.add(result); + } + return new BatchResult(results, exceptions); + } + + @GwtIncompatible + protected DispatchException handleException(Throwable e) { + return new DispatchException(e.getLocalizedMessage()); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/DispatchContext.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/DispatchContext.java new file mode 100644 index 00000000000..3bfb8049378 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/DispatchContext.java @@ -0,0 +1,10 @@ +package com.sap.sailing.gwt.ui.shared.dispatch; + +import com.google.gwt.thirdparty.guava.common.annotations.GwtCompatible; +import com.sap.sailing.server.RacingEventService; + +@GwtCompatible +public interface DispatchContext { + + RacingEventService getRacingEventService(); +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/DispatchContextImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/DispatchContextImpl.java new file mode 100644 index 00000000000..92cc1c284b2 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/DispatchContextImpl.java @@ -0,0 +1,26 @@ +package com.sap.sailing.gwt.ui.shared.dispatch; + +import org.osgi.framework.BundleContext; +import org.osgi.util.tracker.ServiceTracker; + +import com.sap.sailing.gwt.ui.server.Activator; +import com.sap.sailing.server.RacingEventService; +import com.sap.sse.util.ServiceTrackerFactory; + + +public class DispatchContextImpl implements DispatchContext { + + private final ServiceTracker racingEventServiceTracker; + + public DispatchContextImpl() { + final BundleContext context = Activator.getDefault(); + final Activator activator = Activator.getInstance(); + + racingEventServiceTracker = ServiceTrackerFactory.createAndOpen(context, RacingEventService.class); + } + + @Override + public RacingEventService getRacingEventService() { + return racingEventServiceTracker.getService(); + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesAction.java index ed19911f54b..39f8b04205f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/GetLiveRacesAction.java @@ -2,8 +2,15 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; import java.util.UUID; +import com.google.gwt.core.shared.GwtIncompatible; +import com.sap.sailing.domain.base.Event; +import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.gwt.ui.shared.dispatch.Action; +import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; +import com.sap.sse.common.impl.MillisecondsTimePoint; public class GetLiveRacesAction implements Action> { @@ -19,4 +26,28 @@ public class GetLiveRacesAction implements Action> { public UUID getEventId() { return eventId; } + + @Override + @GwtIncompatible + public ResultWithTTL execute(DispatchContext context) { + MillisecondsTimePoint now = MillisecondsTimePoint.now(); + LiveRacesDTO result = new LiveRacesDTO(); + + Event event = context.getRacingEventService().getEvent(getEventId()); + for (LeaderboardGroup lg : event.getLeaderboardGroups()) { + for (Leaderboard lb : lg.getLeaderboards()) { + // Regatta regatta = getService().getRegattaByName(lb.getName()); + for (TrackedRace trackedRace : lb.getTrackedRaces()) { + // trackedRace.getMarks() + if (trackedRace.getStartOfRace().before(now) && trackedRace.getEndOfRace().after(now)) { + result.addRace(new LiveRaceDTO(trackedRace.getRace().getName())); + } + } + // for (RaceDefinition rd : regatta.getAllRaces()) { + // rd. + // } + } + } + return new ResultWithTTL(5000, result); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/OtherAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/OtherAction.java index d85e95a533a..0b02a0d9104 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/OtherAction.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/dispatch/event/OtherAction.java @@ -1,8 +1,16 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event; +import com.google.gwt.core.shared.GwtIncompatible; import com.sap.sailing.gwt.ui.shared.dispatch.Action; +import com.sap.sailing.gwt.ui.shared.dispatch.DispatchContext; import com.sap.sailing.gwt.ui.shared.dispatch.ResultWithTTL; public class OtherAction implements Action> { + @Override + @GwtIncompatible + public ResultWithTTL execute(DispatchContext context) { + return new ResultWithTTL<>(3000, new OtherDTO()); + } + }