Merge remote-tracking branch 'origin/master' into ribdashboard

This commit is contained in:
Alexander Ries committed 2015-09-07 10:42:55 +02:00
commit adea2c19b5
58 files changed
+721 -243

No files matched your search

@@ -16,6 +16,7 @@ public enum Permission implements com.sap.sse.security.shared.Permission {
MANAGE_STRUCTURE_IMPORT_URLS,
MANAGE_MEDIA,
MANAGE_SAILING_SERVER_INSTANCES,
MANAGE_LOCAL_SERVER_INSTANCE,
MANAGE_REPLICATION,
MANAGE_MASTERDATA_IMPORT,
MANAGE_DEVICE_CONFIGURATION,
@@ -16,6 +16,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaRegistry;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
import com.sap.sailing.domain.common.RaceIdentifier;
@@ -109,6 +110,8 @@ public interface DomainObjectFactory {
*/
void loadLeaderboardGroupLinksForEvents(EventResolver eventResolver, LeaderboardGroupResolver leaderboardGroupResolver);
SailingServerConfiguration loadServerConfiguration();
Iterable<RemoteSailingServerReference> loadAllRemoteSailingServerReferences();
Regatta loadRegatta(String name, TrackedRegattaRegistry trackedRegattaRegistry);
@@ -10,6 +10,7 @@ import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationMatcher;
@@ -93,6 +94,8 @@ public interface MongoObjectFactory {
*/
void removeEvent(Serializable id);
void storeServerConfiguration(SailingServerConfiguration serverConfiguration);
/**
* Stores a registered sailing server
* @param serves the servers to store
@@ -43,7 +43,12 @@ public enum CollectionNames {
* Stores the registered sailing servers.
*/
SAILING_SERVERS,
/**
* Stores the configuration of the server instance.
*/
SERVER_CONFIGURATION,
/**
* Stores regatta definitions including their series layout and fleets and race columns. Regattas can reference
* the event from the {@link #EVENTS} collection to which they belong.
@@ -35,11 +35,11 @@ import com.mongodb.util.JSON;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.impl.LogEventAuthorImpl;
import com.sap.sailing.domain.abstractlog.race.CompetitorResults;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventRestoreFactory;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent;
@@ -102,6 +102,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaRegistry;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.domain.base.Waypoint;
@@ -115,6 +116,7 @@ import com.sap.sailing.domain.base.impl.EventImpl;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.RemoteSailingServerReferenceImpl;
import com.sap.sailing.domain.base.impl.SailingServerConfigurationImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.impl.VenueImpl;
import com.sap.sailing.domain.base.impl.WaypointImpl;
@@ -930,8 +932,26 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
return result;
}
@Override
public SailingServerConfiguration loadServerConfiguration() {
SailingServerConfiguration result;
DBCollection serverCollection = database.getCollection(CollectionNames.SERVER_CONFIGURATION.name());
DBObject theServer = serverCollection.findOne();
if (theServer != null) {
result = loadServerConfiguration(theServer);
} else {
// create a default configuration
result = new SailingServerConfigurationImpl(false);
}
return result;
}
private RemoteSailingServerReference loadSailingSever(DBObject serverDBObject) {
private SailingServerConfiguration loadServerConfiguration(DBObject serverDBObject) {
boolean isStandaloneServer = (Boolean) serverDBObject.get(FieldNames.SERVER_IS_STANDALONE.name());
return new SailingServerConfigurationImpl(isStandaloneServer);
}
private RemoteSailingServerReference loadRemoteSailingSever(DBObject serverDBObject) {
RemoteSailingServerReference result = null;
String name = (String) serverDBObject.get(FieldNames.SERVER_NAME.name());
String urlAsString = (String) serverDBObject.get(FieldNames.SERVER_URL.name());
@@ -950,8 +970,8 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
DBCollection serverCollection = database.getCollection(CollectionNames.SAILING_SERVERS.name());
try {
for (DBObject o : serverCollection.find()) {
if (loadSailingSever(o) != null) {
result.add(loadSailingSever(o));
if (loadRemoteSailingSever(o) != null) {
result.add(loadRemoteSailingSever(o));
}
}
} catch (Exception e) {
@@ -109,10 +109,13 @@ public enum FieldNames {
REGATTA_LOG_REVOKED_REASON, REGATTA_LOG_COMPETITOR_ID, REGATTA_LOG_DEVICE_MAPPING_EVENT_ID, REGATTA_LOG_CLOSING_TIMEPOINT,
REGATTA_LOG_FROM, REGATTA_LOG_TO, REGATTA_LOG_EVENT,
// sailing server
// remote server reference fields
SERVER_NAME,
SERVER_URL,
// local server instance fields
SERVER_IS_STANDALONE,
// configurations
CONFIGURATION_MATCHER, CONFIGURATION_CONFIG, CONFIGURATION_MATCHER_ID, CONFIGURATION_MATCHER_TYPE, CONFIGURATION_MATCHER_CLIENTS,
CONFIGURATION_CONFIG_ALLOWED_COURSE_AREA_NAMES, CONFIGURATION_CONFIG_MIN_ROUNDS, CONFIGURATION_CONFIG_MAX_ROUNDS, CONFIGURATION_CONFIG_RESULTS_MAIL,
@@ -19,14 +19,14 @@ import com.mongodb.DBObject;
import com.mongodb.WriteConcern;
import com.mongodb.util.JSON;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseAreaChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogDependentStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEndOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningConfirmedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFinishPositioningListChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFixedMarkPassingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogGateLineOpeningTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogPassChangeEvent;
@@ -37,8 +37,8 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogRevokeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartOfTrackingEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartProcedureChangedEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogStartTimeEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogSuppressedMarkPassingsEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogWindFixEvent;
import com.sap.sailing.domain.abstractlog.race.scoring.RaceLogAdditionalScoringInformationEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogCloseOpenEndedDeviceMappingEvent;
import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogDefineMarkEvent;
@@ -68,6 +68,7 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Venue;
import com.sap.sailing.domain.base.Waypoint;
@@ -501,6 +502,19 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
leaderboardGroupCollection.update(query, update, /* upsert */ true, /* multi */ false, WriteConcern.SAFE);
}
@Override
public void storeServerConfiguration(SailingServerConfiguration serverConfiguration) {
DBCollection serverCollection = database.getCollection(CollectionNames.SERVER_CONFIGURATION.name());
DBObject newServerConfig = new BasicDBObject();
newServerConfig.put(FieldNames.SERVER_IS_STANDALONE.name(), serverConfiguration.isStandaloneServer());
DBObject currentServerConfig = serverCollection.findOne();
if(currentServerConfig != null) {
serverCollection.update(currentServerConfig, newServerConfig, /* upsrt */ true, /* multi */ false, WriteConcern.SAFE);
} else {
serverCollection.save(newServerConfig);
}
}
@Override
public void storeSailingServer(RemoteSailingServerReference server) {
DBCollection serverCollection = database.getCollection(CollectionNames.SAILING_SERVERS.name());
@@ -0,0 +1,15 @@
package com.sap.sailing.domain.base;
import java.io.Serializable;
/**
* Represents the configuration of an (local) instance of a sailing server.
*
* @author Frank
*
*/
public interface SailingServerConfiguration extends Serializable {
boolean isStandaloneServer();
void setStandaloneServer(boolean isStandaloneServer);
}
@@ -0,0 +1,24 @@
package com.sap.sailing.domain.base.impl;
import com.sap.sailing.domain.base.SailingServerConfiguration;
public class SailingServerConfigurationImpl implements SailingServerConfiguration {
private static final long serialVersionUID = -639945748229124558L;
/** indicates if the server is running in standalone mode or not */
private boolean isStandaloneServer;
public SailingServerConfigurationImpl(boolean isStandaloneServer) {
this.isStandaloneServer = isStandaloneServer;
}
@Override
public boolean isStandaloneServer() {
return isStandaloneServer;
}
@Override
public void setStandaloneServer(boolean isStandaloneServer) {
this.isStandaloneServer = isStandaloneServer;
}
}
@@ -63,6 +63,16 @@
<url-pattern>/service/sailing</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Server Configuration Service</display-name>
<servlet-name>ServerConfigurationService</servlet-name>
<servlet-class>com.sap.sailing.gwt.server.ServerConfigurationServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServerConfigurationService</servlet-name>
<url-pattern>/service/serverconfiguration</url-pattern>
</servlet-mapping>
<servlet>
<display-name>Dispatch Service</display-name>
<servlet-name>DispatchService</servlet-name>
@@ -1,14 +1,11 @@
package com.sap.sailing.gwt.autoplay.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayAppActivityMapper;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayAppClientFactory;
import com.sap.sailing.gwt.autoplay.client.app.AutoPlayAppHistoryMapper;
import com.sap.sailing.gwt.common.client.SharedResources;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.gwt.client.mvp.AbstractMvpEntryPoint;
public class AutoPlayEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
@@ -16,9 +13,6 @@ public class AutoPlayEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
@Override
public void doOnModuleLoad() {
AutoPlayAppClientFactory clientFactory = GWT.create(AutoPlayAppClientFactory.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) clientFactory.getSailingService(), RemoteServiceMappingConstants.sailingServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) clientFactory.getMediaService(), RemoteServiceMappingConstants.mediaServiceRemotePath);
AutoPlayAppHistoryMapper applicationHistoryMapper = GWT.create(AutoPlayAppHistoryMapper.class);
initMvp(clientFactory, applicationHistoryMapper, new AutoPlayAppActivityMapper(clientFactory));
@@ -3,14 +3,17 @@ package com.sap.sailing.gwt.autoplay.client.app;
import com.google.gwt.core.client.GWT;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.gwt.autoplay.client.place.start.StartPlace;
import com.sap.sailing.gwt.ui.client.HomeService;
import com.sap.sailing.gwt.ui.client.HomeServiceAsync;
import com.sap.sailing.gwt.ui.client.MediaService;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.security.ui.client.SecureClientFactoryImpl;
public abstract class AbstractApplicationClientFactory extends SecureClientFactoryImpl implements AutoPlayAppClientFactory {
@@ -19,12 +22,15 @@ public abstract class AbstractApplicationClientFactory extends SecureClientFacto
private final MediaServiceAsync mediaService;
private final PlaceNavigator navigator;
public AbstractApplicationClientFactory(ApplicationTopLevelView root, EventBus eventBus, PlaceController placeController) {
public AbstractApplicationClientFactory(ApplicationTopLevelView root, EventBus eventBus, PlaceController placeController, PlaceNavigator navigator) {
super(root, eventBus, placeController);
navigator = new PlaceNavigatorImpl(placeController);
this.navigator = navigator;
sailingService = GWT.create(SailingService.class);
homeService = GWT.create(HomeService.class);
mediaService = GWT.create(MediaService.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) sailingService, RemoteServiceMappingConstants.sailingServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) homeService, RemoteServiceMappingConstants.homeServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath);
}
@Override
@@ -20,9 +20,13 @@ public class DesktopApplicationClientFactory extends AbstractApplicationClientFa
}
private DesktopApplicationClientFactory(EventBus eventBus, PlaceController placeController) {
super(new DesktopApplicationView(new PlaceNavigatorImpl(placeController)), eventBus, placeController);
this(eventBus, placeController, new PlaceNavigatorImpl(placeController));
}
private DesktopApplicationClientFactory(EventBus eventBus, PlaceController placeController, PlaceNavigator navigator) {
super(new DesktopApplicationView(navigator), eventBus, placeController, navigator);
}
@Override
public StartView createStartView() {
return new DesktopStartView(getPlaceNavigator(), getEventBus());
@@ -1,6 +1,7 @@
package com.sap.sailing.gwt.home.desktop;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.sap.sailing.gwt.common.client.SharedResources;
import com.sap.sailing.gwt.home.desktop.app.DesktopActivityMapper;
@@ -8,6 +9,8 @@ import com.sap.sailing.gwt.home.desktop.app.DesktopClientFactory;
import com.sap.sailing.gwt.home.desktop.app.TabletAndDesktopApplicationClientFactory;
import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.ServerConfigurationService;
import com.sap.sailing.gwt.ui.client.ServerConfigurationServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.gwt.client.mvp.AbstractMvpEntryPoint;
@@ -20,9 +23,24 @@ public class DesktopEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
CommonControlsCSS.ensureInjected();
Highcharts.ensureInjected();
DesktopClientFactory clientFactory = new TabletAndDesktopApplicationClientFactory();
EntryPointHelper.registerASyncService((ServiceDefTarget) clientFactory.getSailingService(), RemoteServiceMappingConstants.sailingServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) clientFactory.getHomeService(), RemoteServiceMappingConstants.homeServiceRemotePath);
ServerConfigurationServiceAsync serverConfigService = GWT.create(ServerConfigurationService.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) serverConfigService, RemoteServiceMappingConstants.serverConfigurationServiceRemotePath);
serverConfigService.isStandaloneServer(new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
createDesktopApplication(result);
}
@Override
public void onFailure(Throwable caught) {
createDesktopApplication(false);
}
});
}
private void createDesktopApplication(boolean isStandaloneServer) {
DesktopClientFactory clientFactory = new TabletAndDesktopApplicationClientFactory(isStandaloneServer);
ApplicationHistoryMapper applicationHistoryMapper = GWT.create(ApplicationHistoryMapper.class);
initMvp(clientFactory, applicationHistoryMapper, new DesktopActivityMapper(clientFactory));
@@ -3,14 +3,17 @@ package com.sap.sailing.gwt.home.desktop.app;
import com.google.gwt.core.client.GWT;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.gwt.home.client.place.start.StartPlace;
import com.sap.sailing.gwt.ui.client.HomeService;
import com.sap.sailing.gwt.ui.client.HomeServiceAsync;
import com.sap.sailing.gwt.ui.client.MediaService;
import com.sap.sailing.gwt.ui.client.MediaServiceAsync;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.security.ui.client.SecureClientFactoryImpl;
public abstract class AbstractApplicationClientFactory extends
@@ -21,12 +24,15 @@ public abstract class AbstractApplicationClientFactory extends
private final DesktopPlacesNavigator navigator;
public AbstractApplicationClientFactory(ApplicationTopLevelView root, EventBus eventBus,
PlaceController placeController) {
PlaceController placeController, final DesktopPlacesNavigator navigator) {
super(root, eventBus, placeController);
navigator = new DesktopPlacesNavigator(placeController);
this.navigator = navigator;
sailingService = GWT.create(SailingService.class);
homeService = GWT.create(HomeService.class);
mediaService = GWT.create(MediaService.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) sailingService, RemoteServiceMappingConstants.sailingServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) homeService, RemoteServiceMappingConstants.homeServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) mediaService, RemoteServiceMappingConstants.mediaServiceRemotePath);
}
@Override
@@ -1,55 +0,0 @@
package com.sap.sailing.gwt.home.desktop.app;
import com.google.gwt.core.client.GWT;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigator;
public abstract class AbstractPlaceNavigator implements PlaceNavigator {
protected final PlaceController placeController;
private final ApplicationHistoryMapper mapper = GWT.create(ApplicationHistoryMapper.class);
public final static String DEFAULT_SAPSAILING_SERVER = "www.sapsailing.com";
public final static String DEFAULT_SAPSAILING_DEV_SERVER = "dev.sapsailing.com";
public final static String DEFAULT_SAPSAILING_SERVER_URL = "http://" + DEFAULT_SAPSAILING_SERVER;
protected AbstractPlaceNavigator(PlaceController placeController) {
this.placeController = placeController;
}
public <T extends Place> void goToPlace(PlaceNavigation<T> placeNavigation) {
if(placeNavigation.isRemotePlace()) {
String destinationUrl = placeNavigation.getTargetUrl();
History.newItem(History.getToken(), false);
Window.Location.replace(destinationUrl);
} else {
placeController.goTo(placeNavigation.getPlace());
}
}
protected <T extends Place> PlaceNavigation<T> createLocalPlaceNavigation(T destinationPlace) {
return new PlaceNavigation<T>(null, destinationPlace, false, this, mapper);
}
protected <T extends Place> PlaceNavigation<T> createGlobalPlaceNavigation(T destinationPlace) {
return new PlaceNavigation<T>(destinationPlace, this, mapper);
}
protected <T extends Place> PlaceNavigation<T> createPlaceNavigation(String baseUrl, boolean isOnRemoteServer,
T destinationPlace) {
return new PlaceNavigation<T>(baseUrl, destinationPlace, isOnRemoteServer, this, mapper);
}
public <T extends Place> void pushPlaceToHistoryStack(T destinationPlace) {
String placeHistoryToken = mapper.getToken(destinationPlace);
History.newItem(placeHistoryToken, false);
}
}
@@ -22,13 +22,14 @@ import com.sap.sailing.gwt.home.client.place.sponsoring.SponsoringPlace;
import com.sap.sailing.gwt.home.client.place.start.StartPlace;
import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace;
import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs;
import com.sap.sailing.gwt.home.shared.app.AbstractPlaceNavigator;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory;
public class DesktopPlacesNavigator extends AbstractPlaceNavigator {
protected DesktopPlacesNavigator(PlaceController placeController) {
super(placeController);
protected DesktopPlacesNavigator(PlaceController placeController, boolean isStandaloneServer) {
super(placeController, isStandaloneServer);
}
public PlaceNavigation<StartPlace> getHomeNavigation() {
@@ -25,16 +25,20 @@ import com.sap.sailing.gwt.home.shared.dispatch.DispatchSystemImpl;
public class TabletAndDesktopApplicationClientFactory extends AbstractApplicationClientFactory implements DesktopClientFactory {
private final DispatchSystem dispatch = new DispatchSystemImpl();
public TabletAndDesktopApplicationClientFactory() {
this(new SimpleEventBus());
public TabletAndDesktopApplicationClientFactory(boolean isStandaloneServer) {
this(new SimpleEventBus(), isStandaloneServer);
}
private TabletAndDesktopApplicationClientFactory(EventBus eventBus) {
this(eventBus, new PlaceController(eventBus));
private TabletAndDesktopApplicationClientFactory(EventBus eventBus, boolean isStandaloneServer) {
this(eventBus, new PlaceController(eventBus), isStandaloneServer);
}
private TabletAndDesktopApplicationClientFactory(EventBus eventBus, PlaceController placeController) {
super(new TabletAndDesktopApplicationView(new DesktopPlacesNavigator(placeController), eventBus), eventBus, placeController);
private TabletAndDesktopApplicationClientFactory(EventBus eventBus, PlaceController placeController, boolean isStandaloneServer) {
this(eventBus, placeController, new DesktopPlacesNavigator(placeController, isStandaloneServer));
}
private TabletAndDesktopApplicationClientFactory(EventBus eventBus, PlaceController placeController, DesktopPlacesNavigator placesNavigator) {
super(new TabletAndDesktopApplicationView(placesNavigator, eventBus), eventBus, placeController, placesNavigator);
}
@Override
@@ -1,11 +1,17 @@
package com.sap.sailing.gwt.home.mobile;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.sap.sailing.gwt.home.mobile.app.MobileActivityMapper;
import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory;
import com.sap.sailing.gwt.home.mobile.resources.SharedResources;
import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sailing.gwt.ui.client.ServerConfigurationService;
import com.sap.sailing.gwt.ui.client.ServerConfigurationServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.gwt.client.mvp.AbstractMvpEntryPoint;
public class MobileEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
@@ -16,7 +22,25 @@ public class MobileEntryPoint extends AbstractMvpEntryPoint<StringMessages> {
SharedResources sRes = GWT.create(SharedResources.class);
sRes.mediaCss().ensureInjected();
sRes.mainCss().ensureInjected();
MobileApplicationClientFactory clientFactory = new MobileApplicationClientFactory();
ServerConfigurationServiceAsync serverConfigService = GWT.create(ServerConfigurationService.class);
EntryPointHelper.registerASyncService((ServiceDefTarget) serverConfigService, RemoteServiceMappingConstants.serverConfigurationServiceRemotePath);
serverConfigService.isStandaloneServer(new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
createMobileApplication(result);
}
@Override
public void onFailure(Throwable caught) {
createMobileApplication(false);
}
});
}
private void createMobileApplication(boolean isStandaloneServer) {
MobileApplicationClientFactory clientFactory = new MobileApplicationClientFactory(isStandaloneServer);
ApplicationHistoryMapper applicationHistoryMapper = GWT.create(ApplicationHistoryMapper.class);
initMvp(clientFactory, applicationHistoryMapper, new MobileActivityMapper(clientFactory));
}
@@ -4,11 +4,10 @@ import com.google.gwt.core.client.GWT;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Widget;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.SimpleEventBus;
import com.sap.sailing.gwt.home.client.place.start.StartPlace;
import com.sap.sailing.gwt.home.desktop.app.ApplicationTopLevelView;
import com.sap.sailing.gwt.home.mobile.places.MainView;
import com.sap.sailing.gwt.home.shared.dispatch.DispatchSystem;
import com.sap.sailing.gwt.home.shared.dispatch.DispatchSystemImpl;
@@ -16,40 +15,42 @@ import com.sap.sailing.gwt.ui.client.HomeService;
import com.sap.sailing.gwt.ui.client.HomeServiceAsync;
import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants;
import com.sap.sse.gwt.client.EntryPointHelper;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.security.ui.client.SecureClientFactoryImpl;
/**
*
* @author pgtaboada
*
*/
public class MobileApplicationClientFactory implements com.sap.sse.gwt.client.mvp.ClientFactory {
public class MobileApplicationClientFactory extends SecureClientFactoryImpl {
private final HomeServiceAsync homeService;
private final PlaceController placeController;
private final MobilePlacesNavigator navigator;
private final SimpleEventBus eventBus;
private final DispatchSystem dispatch = new DispatchSystemImpl();
private MainView mainView;
public MobileApplicationClientFactory() {
this(new SimpleEventBus());
public MobileApplicationClientFactory(boolean isStandaloneServer) {
this(new SimpleEventBus(), isStandaloneServer);
}
public MobileApplicationClientFactory(SimpleEventBus eventBus) {
this(eventBus, new PlaceController(eventBus));
private MobileApplicationClientFactory(SimpleEventBus eventBus, boolean isStandaloneServer) {
this(eventBus, new PlaceController(eventBus), isStandaloneServer);
}
public MobileApplicationClientFactory(SimpleEventBus eventBus, PlaceController placeController) {
this.eventBus = eventBus;
this.placeController = placeController;
private MobileApplicationClientFactory(EventBus eventBus, PlaceController placeController, boolean isStandaloneServer) {
this(eventBus, placeController, new MobilePlacesNavigator(placeController, isStandaloneServer));
}
private MobileApplicationClientFactory(EventBus eventBus, PlaceController placeController, MobilePlacesNavigator navigator) {
this(new MainView(navigator, eventBus), eventBus, placeController, navigator);
}
public MobileApplicationClientFactory(ApplicationTopLevelView root, EventBus eventBus,
PlaceController placeController, final MobilePlacesNavigator navigator) {
super(root, eventBus, placeController);
this.navigator = navigator;
this.homeService = GWT.create(HomeService.class);
this.navigator = new MobilePlacesNavigator(placeController);
mainView = new MainView(this);
EntryPointHelper.registerASyncService((ServiceDefTarget) homeService,
RemoteServiceMappingConstants.homeServiceRemotePath);
EntryPointHelper.registerASyncService((ServiceDefTarget) homeService, RemoteServiceMappingConstants.homeServiceRemotePath);
}
public MobilePlacesNavigator getNavigator() {
return navigator;
}
@@ -58,35 +59,10 @@ public class MobileApplicationClientFactory implements com.sap.sse.gwt.client.mv
return homeService;
}
public PlaceController getPlaceController() {
return placeController;
}
public DispatchSystem getDispatch() {
return dispatch;
}
@Override
public ErrorReporter getErrorReporter() {
// TODO Auto-generated method stub
return null;
}
@Override
public EventBus getEventBus() {
return eventBus;
}
@Override
public Widget getRoot() {
return mainView;
}
@Override
public AcceptsOneWidget getContent() {
return mainView.getContent();
}
@Override
public Place getDefaultPlace() {
return new StartPlace();
@@ -18,13 +18,14 @@ import com.sap.sailing.gwt.home.client.place.start.StartPlace;
import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace;
import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace.WhatsNewNavigationTabs;
import com.sap.sailing.gwt.home.mobile.places.latestnews.LatestNewsPlace;
import com.sap.sailing.gwt.home.shared.app.AbstractPlaceNavigator;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
import com.sap.sailing.gwt.ui.shared.dispatch.news.NewsEntryDTO;
public class MobilePlacesNavigator extends AbstractPlaceNavigator {
protected MobilePlacesNavigator(PlaceController placeController) {
super(placeController);
protected MobilePlacesNavigator(PlaceController placeController, boolean isStandaloneServer) {
super(placeController, isStandaloneServer);
}
public PlaceNavigation<StartPlace> getHomeNavigation() {
@@ -26,7 +26,7 @@ import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.home.client.place.whatsnew.WhatsNewPlace;
import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory;
import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator;
import com.sap.sailing.gwt.home.shared.SwitchingEntryPoint;
import com.sap.sse.common.Util.Pair;
@@ -38,13 +38,11 @@ public class Footer extends Composite {
private String otherLanguage;
private final LocaleInfo currentLocale = LocaleInfo.getCurrentLocale();
private MobileApplicationClientFactory appContext;
private MobilePlacesNavigator placeNavigator;
@UiField Anchor changeLanguageLink;
@UiField DivElement languageSelectionDiv;
@UiField AnchorElement desktopUi;
// private final String desktopBaseUrl;
@UiField(provided = true) ValueListBox<Pair<String, String>> changeLanguageList = new ValueListBox<Pair<String,String>>(new Renderer<Pair<String, String>>() {
@Override
@@ -64,8 +62,8 @@ public class Footer extends Composite {
}
});
public Footer(final MobileApplicationClientFactory appContext) {
this.appContext = appContext;
public Footer(MobilePlacesNavigator placeNavigator) {
this.placeNavigator = placeNavigator;
FooterResources.INSTANCE.css().ensureInjected();
initWidget(uiBinder.createAndBindUi(this));
@@ -81,10 +79,8 @@ public class Footer extends Composite {
}
}
});
}
@UiHandler("changeLanguageLink")
public void changeLanguage(ClickEvent e) {
if(otherLanguage != null) {
@@ -104,10 +100,7 @@ public class Footer extends Composite {
@UiHandler("whatsNewLinkUi")
void onWhatsNew(ClickEvent e) {
appContext //
.getNavigator() //
.getWhatsNewNavigation(WhatsNewPlace.WhatsNewNavigationTabs.SailingAnalytics) //
.goToPlace();
placeNavigator.getWhatsNewNavigation(WhatsNewPlace.WhatsNewNavigationTabs.SailingAnalytics).goToPlace();
}
private void updateUI() {
@@ -16,7 +16,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.common.client.LinkUtil;
import com.sap.sailing.gwt.common.client.i18n.TextMessages;
import com.sap.sailing.gwt.home.client.shared.DropdownHandler;
import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory;
import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -38,17 +38,15 @@ public class Header extends Composite {
private static HeaderUiBinder uiBinder = GWT.create(HeaderUiBinder.class);
private DropdownHandler dropdownHandler;
// private MobileApplicationClientFactory appContext;
public Header(final MobileApplicationClientFactory appContext) {
// this.appContext = appContext;
public Header(final MobilePlacesNavigator placeNavigator) {
HeaderResources.INSTANCE.css().ensureInjected();
initWidget(uiBinder.createAndBindUi(this));
addNavigation(appContext.getNavigator().getHomeNavigation(), StringMessages.INSTANCE.home());
addNavigation(appContext.getNavigator().getEventsNavigation(), StringMessages.INSTANCE.events());
addNavigation(appContext.getNavigator().getSolutionsNavigation(), TextMessages.INSTANCE.solutions());
addNavigation(placeNavigator.getHomeNavigation(), StringMessages.INSTANCE.home());
addNavigation(placeNavigator.getEventsNavigation(), StringMessages.INSTANCE.events());
addNavigation(placeNavigator.getSolutionsNavigation(), TextMessages.INSTANCE.solutions());
dropdownHandler = new DropdownHandler(dropdownTriggerUi, dropdownContainerUi);
@@ -58,7 +56,7 @@ public class Header extends Composite {
public void onBrowserEvent(Event event) {
if(LinkUtil.handleLinkClick(event)) {
event.preventDefault();
appContext.getNavigator().getSearchResultNavigation("").goToPlace();
placeNavigator.getSearchResultNavigation("").goToPlace();
}
}
@@ -9,7 +9,9 @@ import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.home.mobile.app.MobileApplicationClientFactory;
import com.google.web.bindery.event.shared.EventBus;
import com.sap.sailing.gwt.home.desktop.app.ApplicationTopLevelView;
import com.sap.sailing.gwt.home.mobile.app.MobilePlacesNavigator;
import com.sap.sailing.gwt.home.mobile.partials.footer.Footer;
import com.sap.sailing.gwt.home.mobile.partials.header.Header;
import com.sap.sailing.gwt.home.shared.app.HasLocationTitle;
@@ -21,7 +23,7 @@ import com.sap.sse.gwt.client.ErrorReporter;
* This is the top-level view of the application. Every time another presenter wants to reveal itself,
* {@link MainView} will add its content of the target inside the {@code mainContantPanel}.
*/
public class MainView extends Composite {
public class MainView extends Composite implements ApplicationTopLevelView {
interface MyBinder extends UiBinder<Widget, MainView> {
}
@@ -38,11 +40,11 @@ public class MainView extends Composite {
@UiField
SimplePanel mainContentPanel;
public MainView(MobileApplicationClientFactory clientFactory) {
headerPanel = new Header(clientFactory);
footerPanel = new Footer(clientFactory);
public MainView(MobilePlacesNavigator placeNavigator, EventBus eventBus) {
headerPanel = new Header(placeNavigator);
footerPanel = new Footer(placeNavigator);
initWidget(uiBinder.createAndBindUi(this));
clientFactory.getEventBus().addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() {
eventBus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() {
@Override
public void onPlaceChange(PlaceChangeEvent event) {
Place newPlace = event.getNewPlace();
@@ -54,12 +56,17 @@ public class MainView extends Composite {
});
}
@Override
public AcceptsOneWidget getContent() {
return mainContentPanel;
}
@Override
public void showLoading(boolean visible) {
}
@Override
public ErrorReporter getErrorReporter() {
return errorReporter;
}
}
@@ -1,13 +1,10 @@
package com.sap.sailing.gwt.home.mobile.app;
package com.sap.sailing.gwt.home.shared.app;
import com.google.gwt.core.client.GWT;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.sap.sailing.gwt.home.shared.app.ApplicationHistoryMapper;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigation;
import com.sap.sailing.gwt.home.shared.app.PlaceNavigator;
public abstract class AbstractPlaceNavigator implements PlaceNavigator {
protected final PlaceController placeController;
@@ -15,15 +12,17 @@ public abstract class AbstractPlaceNavigator implements PlaceNavigator {
private final ApplicationHistoryMapper mapper = GWT.create(ApplicationHistoryMapper.class);
public final static String DEFAULT_SAPSAILING_SERVER = "www.sapsailing.com";
public final static String DEFAULT_SAPSAILING_DEV_SERVER = "dev.sapsailing.com";
public final static String DEFAULT_SAPSAILING_SERVER_URL = "http://" + DEFAULT_SAPSAILING_SERVER;
protected AbstractPlaceNavigator(PlaceController placeController) {
private boolean isStandaloneServer;
protected AbstractPlaceNavigator(PlaceController placeController, boolean isStandaloneServer) {
this.placeController = placeController;
this.isStandaloneServer = isStandaloneServer;
}
public <T extends Place> void goToPlace(PlaceNavigation<T> placeNavigation) {
if(placeNavigation.isRemotePlace()) {
if (placeNavigation.isRemotePlace()) {
String destinationUrl = placeNavigation.getTargetUrl();
History.newItem(History.getToken(), false);
Window.Location.replace(destinationUrl);
@@ -36,20 +35,22 @@ public abstract class AbstractPlaceNavigator implements PlaceNavigator {
return new PlaceNavigation<T>(null, destinationPlace, false, this, mapper);
}
protected <T extends Place> PlaceNavigation<T> createGlobalPlaceNavigation(T destinationPlace) {
return new PlaceNavigation<T>(destinationPlace, this, mapper);
}
protected <T extends Place> PlaceNavigation<T> createPlaceNavigation(String baseUrl, boolean isOnRemoteServer,
T destinationPlace) {
return new PlaceNavigation<T>(baseUrl, destinationPlace, isOnRemoteServer, this, mapper);
}
public <T extends Place> void pushPlaceToHistoryStack(T destinationPlace) {
String placeHistoryToken = mapper.getToken(destinationPlace);
History.newItem(placeHistoryToken, false);
}
@Override
public boolean isStandaloneServer() {
return isStandaloneServer;
}
}
@@ -9,8 +9,6 @@ import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.Window;
import com.sap.sailing.gwt.common.client.LinkUtil;
import com.sap.sailing.gwt.home.desktop.app.DesktopPlacesNavigator;
import com.sap.sailing.gwt.home.mobile.app.AbstractPlaceNavigator;
public class PlaceNavigation<T extends Place> {
private final PlaceNavigator placeNavigator;
@@ -25,7 +23,7 @@ public class PlaceNavigation<T extends Place> {
this.destinationPlace = destinationPlace;
this.mapper = mapper;
String locationURL = getLocationURL();
this.isDestinationOnRemoteServer = !(isLocationOnLocalhostOrDevServer(locationURL) || isLocationOnDefaultSapSailingServer(locationURL));
this.isDestinationOnRemoteServer = !(placeNavigator.isStandaloneServer() || isLocationOnLocalhost(locationURL) || isLocationOnDefaultSapSailingServer(locationURL));
this.baseUrl = isDestinationOnRemoteServer ? AbstractPlaceNavigator.DEFAULT_SAPSAILING_SERVER_URL : locationURL;
}
@@ -78,12 +76,11 @@ public class PlaceNavigation<T extends Place> {
}
private boolean isLocationOnDefaultSapSailingServer(String urlToCheck) {
return urlToCheck.contains(DesktopPlacesNavigator.DEFAULT_SAPSAILING_SERVER);
return urlToCheck.contains(AbstractPlaceNavigator.DEFAULT_SAPSAILING_SERVER);
}
private boolean isLocationOnLocalhostOrDevServer(String urlToCheck) {
return urlToCheck.contains("localhost") || urlToCheck.contains("127.0.0.1")
|| urlToCheck.contains(DesktopPlacesNavigator.DEFAULT_SAPSAILING_DEV_SERVER);
private boolean isLocationOnLocalhost(String urlToCheck) {
return urlToCheck.contains("localhost") || urlToCheck.contains("127.0.0.1");
}
private String getLocationURL() {
@@ -5,4 +5,6 @@ import com.google.gwt.place.shared.Place;
public interface PlaceNavigator {
<T extends Place> void goToPlace(PlaceNavigation<T> placeNavigation);
boolean isStandaloneServer();
}
@@ -66,7 +66,7 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
protected RacingEventService getService() {
return racingEventServiceTracker.getService();
}
@Override
public StartViewDTO getStartView() throws MalformedURLException {
EventStageCandidateCalculator stageCandidateCalculator = new EventStageCandidateCalculator();
@@ -0,0 +1,34 @@
package com.sap.sailing.gwt.server;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.gwt.ui.client.ServerConfigurationService;
import com.sap.sailing.gwt.ui.server.Activator;
import com.sap.sailing.gwt.ui.server.ProxiedRemoteServiceServlet;
import com.sap.sailing.server.RacingEventService;
import com.sap.sse.util.ServiceTrackerFactory;
/**
* The server side implementation of the RPC service.
*/
public class ServerConfigurationServiceImpl extends ProxiedRemoteServiceServlet implements ServerConfigurationService {
private static final long serialVersionUID = 2571063542941630865L;
private final ServiceTracker<RacingEventService, RacingEventService> racingEventServiceTracker;
public ServerConfigurationServiceImpl() {
BundleContext context = Activator.getDefault();
racingEventServiceTracker = ServiceTrackerFactory.createAndOpen(context, RacingEventService.class);
}
protected RacingEventService getService() {
return racingEventServiceTracker.getService();
}
@Override
public boolean isStandaloneServer() {
return getService().getSailingServerConfiguration().isStandaloneServer();
}
}
@@ -217,9 +217,13 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<MasterDataImportPanel>(masterDataImportPanel),
getStringMessages().masterDataImportPanel(), Permission.MANAGE_MASTERDATA_IMPORT);
RemoteSailingServerInstancesManagementPanel sailingServerInstancesManagementPanel = new RemoteSailingServerInstancesManagementPanel(sailingService, this, getStringMessages());
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<RemoteSailingServerInstancesManagementPanel>(sailingServerInstancesManagementPanel),
getStringMessages().serverInstances(), Permission.MANAGE_SAILING_SERVER_INSTANCES);
RemoteServerInstancesManagementPanel remoteServerInstancesManagementPanel = new RemoteServerInstancesManagementPanel(sailingService, this, getStringMessages());
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<RemoteServerInstancesManagementPanel>(remoteServerInstancesManagementPanel),
getStringMessages().remoteServerInstances(), Permission.MANAGE_SAILING_SERVER_INSTANCES);
LocalServerManagementPanel localServerInstancesManagementPanel = new LocalServerManagementPanel(sailingService, this, getStringMessages());
panel.addToTabPanel(advancedTabPanel, new DefaultRefreshableAdminConsolePanel<LocalServerManagementPanel>(localServerInstancesManagementPanel),
getStringMessages().localServer(), Permission.MANAGE_LOCAL_SERVER_INSTANCE);
final UserManagementPanel userManagementPanel = new UserManagementPanel(getUserService(), StringMessages.INSTANCE,
SailingPermissionsForRoleProvider.INSTANCE);
@@ -0,0 +1,138 @@
package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.ServerConfigurationDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.ServerInfoDTO;
public class LocalServerManagementPanel extends SimplePanel {
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final StringMessages stringMessages;
private final CaptionPanel serverInfoPanel;
private final CaptionPanel serverConfigurationPanel;
private CheckBox isStandaloneServerCheckbox;
private Label serverNameLabel;
private Label buildVersionLabel;
public LocalServerManagementPanel(SailingServiceAsync sailingService, ErrorReporter errorReporter,
StringMessages stringMessages) {
this.sailingService = sailingService;
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
VerticalPanel mainPanel = new VerticalPanel();
setWidget(mainPanel);
mainPanel.setWidth("100%");
serverInfoPanel = new CaptionPanel("Server Information");
mainPanel.add(serverInfoPanel);
serverConfigurationPanel = new CaptionPanel("Server Configuration");
mainPanel.add(serverConfigurationPanel);
createServerInfoUI();
createServerConfigurationUI();
}
private void createServerInfoUI() {
VerticalPanel serverInfoContentPanel = new VerticalPanel();
serverInfoPanel.setContentWidget(serverInfoContentPanel);
serverNameLabel = new Label();
buildVersionLabel = new Label();
Grid grid = new Grid(2, 2);
grid.setWidget(0, 0, new Label(stringMessages.name() + ":"));
grid.setWidget(0, 1, serverNameLabel);
grid.setWidget(1, 0, new Label("Build version:"));
grid.setWidget(1, 1, buildVersionLabel);
serverInfoContentPanel.add(grid);
refreshServerInfo();
}
private void createServerConfigurationUI() {
VerticalPanel serverConfigurationContentPanel = new VerticalPanel();
serverConfigurationPanel.setContentWidget(serverConfigurationContentPanel);
isStandaloneServerCheckbox = new CheckBox();
isStandaloneServerCheckbox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
serverConfigurationChanged();
}
});
Grid grid = new Grid(2, 2);
grid.setWidget(0, 0, new Label("Standalone server:"));
grid.setWidget(0, 1, isStandaloneServerCheckbox);
serverConfigurationContentPanel.add(grid);
refreshServerConfiguration();
}
private void serverConfigurationChanged() {
ServerConfigurationDTO serverConfig = new ServerConfigurationDTO(isStandaloneServerCheckbox.getValue());
sailingService.updateServerConfiguration(serverConfig, new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
@Override
public void onSuccess(Void result) {
refreshServerConfiguration();
}
});
}
private void refreshServerInfo() {
sailingService.getServerInfo(new AsyncCallback<ServerInfoDTO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
@Override
public void onSuccess(ServerInfoDTO result) {
updateServerInfo(result);
}
});
}
private void refreshServerConfiguration() {
sailingService.getServerConfiguration(new AsyncCallback<ServerConfigurationDTO>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError(caught.getMessage());
}
@Override
public void onSuccess(ServerConfigurationDTO result) {
updateServerConfiguration(result);
}
});
}
private void updateServerInfo(ServerInfoDTO result) {
serverNameLabel.setText(result.getServerName());
buildVersionLabel.setText(result.getBuildVersion() != null ? result.getBuildVersion() : "Unknown");
}
private void updateServerConfiguration(ServerConfigurationDTO result) {
isStandaloneServerCheckbox.setValue(result.isStandaloneServer(), true);
}
}
@@ -34,7 +34,7 @@ import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
public class RemoteSailingServerInstancesManagementPanel extends SimplePanel {
public class RemoteServerInstancesManagementPanel extends SimplePanel {
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private final StringMessages stringMessages;
@@ -45,7 +45,7 @@ public class RemoteSailingServerInstancesManagementPanel extends SimplePanel {
private final CaptionPanel remoteServersPanel;
public RemoteSailingServerInstancesManagementPanel(SailingServiceAsync sailingService, ErrorReporter errorReporter,
public RemoteServerInstancesManagementPanel(SailingServiceAsync sailingService, ErrorReporter errorReporter,
StringMessages stringMessages) {
this.sailingService = sailingService;
this.errorReporter = errorReporter;
@@ -146,7 +146,7 @@ public class RemoteSailingServerInstancesManagementPanel extends SimplePanel {
builder.appendHtmlConstant("<br>");
}
} else {
builder.appendEscaped(RemoteSailingServerInstancesManagementPanel.this.stringMessages
builder.appendEscaped(RemoteServerInstancesManagementPanel.this.stringMessages
.errorAddingSailingServer(server.getLastErrorMessage()));
}
return builder.toSafeHtml();
@@ -20,6 +20,8 @@ public interface RemoteServiceMappingConstants {
public static final String sailingServiceRemotePath = "service/sailing";
public static final String serverConfigurationServiceRemotePath = "service/serverconfiguration";
public static final String homeServiceRemotePath = "service/home";
public static final String simulatorServiceRemotePath = "service/simulator";
@@ -76,6 +76,7 @@ import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.RemoteSailingServerReferenceDTO;
import com.sap.sailing.gwt.ui.shared.ReplicationStateDTO;
import com.sap.sailing.gwt.ui.shared.ScoreCorrectionProviderDTO;
import com.sap.sailing.gwt.ui.shared.ServerConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.SimulatorResultsDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO;
@@ -95,6 +96,7 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.mail.MailException;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.gwt.client.ServerInfoDTO;
import com.sap.sse.gwt.client.filestorage.FileStorageManagementGwtService;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.VideoDTO;
@@ -322,6 +324,12 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
WindInfoForRaceDTO getWindSourcesInfo(RegattaAndRaceIdentifier raceIdentifier);
ServerInfoDTO getServerInfo();
ServerConfigurationDTO getServerConfiguration();
void updateServerConfiguration(ServerConfigurationDTO serverConfiguration);
List<RemoteSailingServerReferenceDTO> getRemoteSailingServerReferences();
void removeSailingServers(Set<String> toRemove) throws Exception;
@@ -393,8 +401,6 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
boolean showOnlyCurrentlyRunningRaces, boolean showOnlyRacesOfSameDay, List<String> visibleRegattas)
throws Exception;
String getBuildVersion();
void stopReplicatingFromMaster();
void stopAllReplicas();
@@ -66,6 +66,7 @@ import com.sap.sailing.gwt.ui.shared.RegattaScoreCorrectionDTO;
import com.sap.sailing.gwt.ui.shared.RemoteSailingServerReferenceDTO;
import com.sap.sailing.gwt.ui.shared.ReplicationStateDTO;
import com.sap.sailing.gwt.ui.shared.ScoreCorrectionProviderDTO;
import com.sap.sailing.gwt.ui.shared.ServerConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.SimulatorResultsDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.SwissTimingArchiveConfigurationDTO;
@@ -83,7 +84,7 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.gwt.client.BuildVersionRetriever;
import com.sap.sse.gwt.client.ServerInfoRetriever;
import com.sap.sse.gwt.client.filestorage.FileStorageManagementGwtServiceAsync;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.VideoDTO;
@@ -91,7 +92,7 @@ import com.sap.sse.gwt.client.media.VideoDTO;
/**
* The async counterpart of {@link SailingService}
*/
public interface SailingServiceAsync extends BuildVersionRetriever, FileStorageManagementGwtServiceAsync {
public interface SailingServiceAsync extends ServerInfoRetriever, FileStorageManagementGwtServiceAsync {
void getRegattas(AsyncCallback<List<RegattaDTO>> callback);
@@ -424,6 +425,10 @@ public interface SailingServiceAsync extends BuildVersionRetriever, FileStorageM
void updateRaceCourse(RegattaAndRaceIdentifier raceIdentifier, List<Util.Pair<ControlPointDTO, PassingInstruction>> controlPoints, AsyncCallback<Void> callback);
void getServerConfiguration(AsyncCallback<ServerConfigurationDTO> callback);
void updateServerConfiguration(ServerConfigurationDTO serverConfiguration, AsyncCallback<Void> callback);
void getRemoteSailingServerReferences(AsyncCallback<List<RemoteSailingServerReferenceDTO>> callback);
void removeSailingServers(Set<String> toRemove, AsyncCallback<Void> callback);
@@ -491,8 +496,6 @@ public interface SailingServiceAsync extends BuildVersionRetriever, FileStorageM
void checkLeaderboardName(String leaderboardName, AsyncCallback<Util.Pair<String, LeaderboardType>> callback);
void getBuildVersion(AsyncCallback<String> callback);
void stopReplicatingFromMaster(AsyncCallback<Void> asyncCallback);
void getRegattaStructureForEvent(UUID eventId, AsyncCallback<List<RaceGroupDTO>> asyncCallback);
@@ -0,0 +1,7 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.user.client.rpc.RemoteService;
public interface ServerConfigurationService extends RemoteService {
boolean isStandaloneServer();
}
@@ -0,0 +1,10 @@
package com.sap.sailing.gwt.ui.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
* The async counterpart of {@link ServerConfigurationService}
*/
public interface ServerConfigurationServiceAsync {
void isStandaloneServer(AsyncCallback<Boolean> callback);
}
@@ -383,7 +383,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String pleaseEnterNonEmptyUrl();
String addResultImportUrl();
String errorAddingResultImportUrl(String message);
String serverInstances();
String remoteServerInstances();
String localServer();
String errorRefreshingSailingServers(String message);
String successfullyUpdatedSailingServers();
String errorRemovingSailingServers(String message);
@@ -393,7 +393,8 @@ errorRemovingResultImportUrls=Error removing result import URLs: {0}
pleaseEnterNonEmptyUrl=Please enter a URL.
addResultImportUrl=Add result import URL
errorAddingResultImportUrl=Error adding result import URL: {0}
serverInstances=Server Instances
remoteServerInstances=Remote Server Instances
localServer=Local Server
errorRefreshingSailingServers=Error refreshing SailingServer instances: {0}
successfullyUpdatedSailingServers=Successfully updated SailingServer instances
errorRemovingSailingServers=Error removing SailingServer instances: {0}
@@ -394,7 +394,8 @@ errorRemovingResultImportUrls=Fehler beim Löschen von Ergebnisimport URLs: {0}
pleaseEnterNonEmptyUrl=Bitte gebe eine URL ein.
addResultImportUrl=Ergebnisimport-URL hinzufügen
errorAddingResultImportUrl=Fehler beim Hinzufügen einer Ergebnisimport URL: {0}
serverInstances=Server Instanzen
remoteServerInstances=Remote-Server Instanzen
localServer=Lokaler Server
errorRefreshingSailingServers=Fehler beim Aktualisieren der SailingServer Instanzen: {0}
successfullyUpdatedSailingServers=SailingServer Instanzen erfolgreich aktualisiert
errorRemovingSailingServers=Fehler beim Löschen von SailingServer Instanzen: {0}
@@ -963,7 +963,8 @@ showDiagram=Show Diagram
rerunQueryAfterRefreshTooltip=Повторно запускает запрос после обновления таблиц.
queryDefinitionProvider=Поставщик определения запроса
statisticProvider=Поставщик статистических данных
serverInstances=Server Instances
remoteServerInstances=Remote Server Instances
localServer=Local Server
calculateThe=Calculate the
groupingProvider=Поставщик группировки
releaseNotes=Новости и история выпусков
@@ -112,7 +112,8 @@ leg=L
settingsForComponent=Settings for {0}
classFlag=Class flag
statisticProvider=Statistic Provider
serverInstances=Server Instances
remoteServerInstances=Remote Server Instances
localServer=Local Server
startRaceLogTracking=Start RaceLog Tracking
lastScoreCorrectionsComment=Last score correction comment
masterDataImportPanel=Master Data Import
@@ -111,6 +111,7 @@ import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Sideline;
import com.sap.sailing.domain.base.SpeedWithBearingWithConfidence;
@@ -136,6 +137,7 @@ import com.sap.sailing.domain.base.impl.DynamicTeam;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.SailingServerConfigurationImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.Bearing;
@@ -333,6 +335,7 @@ import com.sap.sailing.gwt.ui.shared.ReplicationMasterDTO;
import com.sap.sailing.gwt.ui.shared.ReplicationStateDTO;
import com.sap.sailing.gwt.ui.shared.ScoreCorrectionProviderDTO;
import com.sap.sailing.gwt.ui.shared.SeriesDTO;
import com.sap.sailing.gwt.ui.shared.ServerConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.SidelineDTO;
import com.sap.sailing.gwt.ui.shared.SimulatorResultsDTO;
import com.sap.sailing.gwt.ui.shared.SimulatorWindDTO;
@@ -407,6 +410,7 @@ import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCo
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCorrectionMetadata;
import com.sap.sailing.server.operationaltransformation.UpdateRaceDelayToLive;
import com.sap.sailing.server.operationaltransformation.UpdateSeries;
import com.sap.sailing.server.operationaltransformation.UpdateServerConfiguration;
import com.sap.sailing.server.operationaltransformation.UpdateSpecificRegatta;
import com.sap.sailing.server.simulation.SimulationService;
import com.sap.sailing.simulator.Path;
@@ -420,7 +424,7 @@ import com.sap.sailing.xrr.schema.RegattaResults;
import com.sap.sailing.xrr.structureimport.SeriesParameters;
import com.sap.sailing.xrr.structureimport.StructureImporter;
import com.sap.sailing.xrr.structureimport.buildstructure.SetRacenumberFromSeries;
import com.sap.sse.BuildVersion;
import com.sap.sse.ServerInfo;
import com.sap.sse.common.CountryCode;
import com.sap.sse.common.Duration;
import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
@@ -444,6 +448,7 @@ import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.common.search.Result;
import com.sap.sse.filestorage.FileStorageService;
import com.sap.sse.filestorage.InvalidPropertiesException;
import com.sap.sse.gwt.client.ServerInfoDTO;
import com.sap.sse.gwt.client.media.ImageDTO;
import com.sap.sse.gwt.client.media.VideoDTO;
import com.sap.sse.gwt.server.filestorage.FileStorageServiceDTOUtils;
@@ -3816,6 +3821,25 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return result;
}
@Override
public ServerInfoDTO getServerInfo() {
ServerInfoDTO result = new ServerInfoDTO(ServerInfo.getName(), ServerInfo.getBuildVersion());
return result;
}
@Override
public ServerConfigurationDTO getServerConfiguration() {
SailingServerConfiguration sailingServerConfiguration = getService().getSailingServerConfiguration();
ServerConfigurationDTO result = new ServerConfigurationDTO(sailingServerConfiguration.isStandaloneServer());
return result;
}
@Override
public void updateServerConfiguration(ServerConfigurationDTO serverConfiguration) {
SailingServerConfiguration newServerConfiguration = new SailingServerConfigurationImpl(serverConfiguration.isStandaloneServer());
getService().apply(new UpdateServerConfiguration(newServerConfiguration));
}
@Override
public List<RemoteSailingServerReferenceDTO> getRemoteSailingServerReferences() {
List<RemoteSailingServerReferenceDTO> result = new ArrayList<RemoteSailingServerReferenceDTO>();
@@ -4233,11 +4257,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
return entry;
}
@Override
public String getBuildVersion() {
return BuildVersion.getBuildVersion();
}
@Override
public void stopReplicatingFromMaster() {
@@ -0,0 +1,19 @@
package com.sap.sailing.gwt.ui.shared;
import com.google.gwt.user.client.rpc.IsSerializable;
public class ServerConfigurationDTO implements IsSerializable {
private boolean isStandaloneServer;
// for GWT
ServerConfigurationDTO() {
}
public ServerConfigurationDTO(boolean isStandaloneServer) {
this.isStandaloneServer = isStandaloneServer;
}
public boolean isStandaloneServer() {
return isStandaloneServer;
}
}
@@ -0,0 +1,54 @@
package com.sap.sailing.mongodb.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.net.UnknownHostException;
import org.junit.Test;
import com.mongodb.MongoException;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.impl.SailingServerConfigurationImpl;
import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.PersistenceFactory;
public class TestStoringAndLoadingServerConfiguration extends AbstractMongoDBTest {
public TestStoringAndLoadingServerConfiguration() throws UnknownHostException, MongoException {
super();
}
@Test
public void testLoadStoreServerConfigurationFirstTime() {
boolean defaultValueOfIsStandaloneServer = false;
// if we have never stored a server configuration before a default configuration should be created
DomainObjectFactory dof = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE);
SailingServerConfiguration loadedServerConfiguration = dof.loadServerConfiguration();
assertNotNull(loadedServerConfiguration);
assertEquals(defaultValueOfIsStandaloneServer, loadedServerConfiguration.isStandaloneServer());
}
@Test
public void testLoadStoreServerConfiguration() {
boolean isStandaloneServer = false;
MongoObjectFactory mof = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService());
SailingServerConfiguration serverConfiguration = new SailingServerConfigurationImpl(isStandaloneServer);
mof.storeServerConfiguration(serverConfiguration);
DomainObjectFactory dof = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE);
SailingServerConfiguration loadedServerConfiguration = dof.loadServerConfiguration();
assertNotNull(loadedServerConfiguration);
assertEquals(isStandaloneServer, loadedServerConfiguration.isStandaloneServer());
isStandaloneServer = true;
serverConfiguration.setStandaloneServer(isStandaloneServer);
mof.storeServerConfiguration(serverConfiguration);
loadedServerConfiguration = dof.loadServerConfiguration();
assertNotNull(loadedServerConfiguration);
assertEquals(isStandaloneServer, loadedServerConfiguration.isStandaloneServer());
}
}
@@ -32,6 +32,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaRegistry;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier;
@@ -584,6 +585,13 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
*/
Result<LeaderboardSearchResultBase> searchRemotely(String remoteServerReferenceName, KeywordQuery query);
/**
* Gets the configuration of the local sailing server instances.
*/
SailingServerConfiguration getSailingServerConfiguration();
void updateServerConfiguration(SailingServerConfiguration serverConfiguration);
/**
* References to remote servers may be dead or alive. This is internally determined by regularly polling those
* servers for their events list. If the events list cannot be successfully retrieved, the server is considered "dead."
@@ -77,6 +77,7 @@ import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.RegattaListener;
import com.sap.sailing.domain.base.RemoteSailingServerReference;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.Sideline;
import com.sap.sailing.domain.base.Waypoint;
@@ -209,7 +210,7 @@ import com.sap.sailing.server.operationaltransformation.UpdateWindAveragingTime;
import com.sap.sailing.server.operationaltransformation.UpdateWindSourcesToExclude;
import com.sap.sailing.server.simulation.SimulationService;
import com.sap.sailing.server.simulation.SimulationServiceFactory;
import com.sap.sse.BuildVersion;
import com.sap.sse.ServerInfo;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TypeBasedServiceFinderFactory;
import com.sap.sse.common.Util;
@@ -398,6 +399,8 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
private final JoinedClassLoader joinedClassLoader;
private SailingServerConfiguration sailingServerConfiguration;
/**
* Providing the constructor parameters for a new {@link RacingEventServiceImpl} instance is a bit tricky
* in some cases because containment and initialization order of some types is fairly tightly coupled.
@@ -593,6 +596,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
this.configurationMap = new DeviceConfigurationMapImpl();
this.serviceFinderFactory = serviceFinderFactory;
sailingServerConfiguration = domainObjectFactory.loadServerConfiguration();
final Iterable<Pair<Event, Boolean>> loadedEventsWithRequireStoreFlag = loadStoredEvents();
loadStoredRegattas();
loadRaceIDToRegattaAssociations();
@@ -1135,6 +1139,17 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
return Collections.unmodifiableMap(new HashMap<String, Leaderboard>(leaderboardsByName));
}
@Override
public SailingServerConfiguration getSailingServerConfiguration() {
return sailingServerConfiguration;
}
@Override
public void updateServerConfiguration(SailingServerConfiguration serverConfiguration) {
this.sailingServerConfiguration = serverConfiguration;
mongoObjectFactory.storeServerConfiguration(serverConfiguration);
}
@Override
public Map<RemoteSailingServerReference, com.sap.sse.common.Util.Pair<Iterable<EventBase>, Exception>> getPublicEventsOfAllSailingServers() {
return remoteSailingServerSet.getCachedEventsForRemoteSailingServers(); // FIXME should probably add our own
@@ -2911,7 +2926,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
}
public String toString() {
return "RacingEventService: " + this.hashCode() + " Build: " + BuildVersion.getBuildVersion();
return "RacingEventService: " + this.hashCode() + " Build: " + ServerInfo.getBuildVersion();
}
@Override
@@ -0,0 +1,39 @@
package com.sap.sailing.server.operationaltransformation;
import com.sap.sailing.domain.base.SailingServerConfiguration;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.RacingEventServiceOperation;
public class UpdateServerConfiguration extends AbstractRacingEventServiceOperation<Void> {
private static final long serialVersionUID = -778186188996039972L;
private final SailingServerConfiguration serverConfiguration;
public UpdateServerConfiguration(SailingServerConfiguration serverConfiguration) {
super();
this.serverConfiguration = serverConfiguration;
}
/**
* {@link #internalApplyTo(RacingEventService)} already replicates the effects
*/
@Override
public boolean isRequiresExplicitTransitiveReplication() {
return false;
}
@Override
public Void internalApplyTo(RacingEventService toState) throws Exception {
toState.updateServerConfiguration(serverConfiguration);
return null;
}
@Override
public RacingEventServiceOperation<?> transformClientOp(RacingEventServiceOperation<?> serverOp) {
return null;
}
@Override
public RacingEventServiceOperation<?> transformServerOp(RacingEventServiceOperation<?> clientOp) {
return null;
}
}
@@ -20,7 +20,7 @@ import com.google.gwt.user.client.ui.TabLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.Util.Triple;
import com.sap.sse.gwt.client.AbstractEntryPoint;
import com.sap.sse.gwt.client.BuildVersionRetriever;
import com.sap.sse.gwt.client.ServerInfoRetriever;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.panels.VerticalTabLayoutPanel;
import com.sap.sse.security.shared.Permission;
@@ -149,7 +149,7 @@ public class AdminConsolePanel extends DockLayoutPanel {
}
public AdminConsolePanel(UserService userService, PermissionsForRoleProvider permissionsForRoleProvider,
BuildVersionRetriever buildVersionRetriever, String releaseNotesAnchorLabel,
ServerInfoRetriever buildVersionRetriever, String releaseNotesAnchorLabel,
String releaseNotesURL, ErrorReporter errorReporter, LoginPanelCss loginPanelCss) {
super(Unit.EM);
this.permissionsForRoleProvider = permissionsForRoleProvider;
@@ -5,21 +5,22 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.gwt.client.BuildVersionRetriever;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.ServerInfoDTO;
import com.sap.sse.gwt.client.ServerInfoRetriever;
public class SystemInformationPanel extends FlowPanel {
private final Label buildVersionText;
public SystemInformationPanel(final BuildVersionRetriever buildVersionRetriever, final ErrorReporter errorReporter) {
public SystemInformationPanel(final ServerInfoRetriever buildVersionRetriever, final ErrorReporter errorReporter) {
super();
buildVersionText = new Label("");
addFloatingWidget(buildVersionText);
buildVersionRetriever.getBuildVersion(new AsyncCallback<String>() {
buildVersionRetriever.getServerInfo(new AsyncCallback<ServerInfoDTO>() {
@Override
public void onSuccess(String result) {
buildVersionText.setText("Version: " + result);
public void onSuccess(ServerInfoDTO result) {
buildVersionText.setText("Version: " + result.getBuildVersion());
}
@Override
@@ -1,7 +0,0 @@
package com.sap.sse.gwt.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface BuildVersionRetriever {
void getBuildVersion(AsyncCallback<String> callback);
}
@@ -0,0 +1,25 @@
package com.sap.sse.gwt.client;
import com.google.gwt.user.client.rpc.IsSerializable;
public class ServerInfoDTO implements IsSerializable {
private String serverName;
private String buildVersion;
// for GWT
ServerInfoDTO() {
}
public ServerInfoDTO(String serverName, String buildVersion) {
this.serverName = serverName;
this.buildVersion = buildVersion;
}
public String getBuildVersion() {
return buildVersion;
}
public String getServerName() {
return serverName;
}
}
@@ -0,0 +1,7 @@
package com.sap.sse.gwt.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface ServerInfoRetriever {
void getServerInfo(AsyncCallback<ServerInfoDTO> callback);
}
@@ -16,7 +16,7 @@ import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.sap.sse.BuildVersion;
import com.sap.sse.ServerInfo;
import com.sap.sse.replication.Replicable;
import com.sap.sse.replication.ReplicationMasterDescriptor;
@@ -79,7 +79,7 @@ public class ReplicationMasterDescriptorImpl implements ReplicationMasterDescrip
return new URL("http", getHostname(), servletPort, REPLICATION_SERVLET + "?" + ReplicationServlet.ACTION + "="
+ ReplicationServlet.Action.REGISTER.name() + "&" + ReplicationServlet.SERVER_UUID + "="
+ uuid.toString() + "&" + ReplicationServlet.ADDITIONAL_INFORMATION + "="
+ java.net.URLEncoder.encode(BuildVersion.getBuildVersion(), "UTF-8"));
+ java.net.URLEncoder.encode(ServerInfo.getBuildVersion(), "UTF-8"));
}
@Override
@@ -32,7 +32,7 @@ import com.rabbitmq.client.AMQP.Queue.DeleteOk;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.sap.sse.BuildVersion;
import com.sap.sse.ServerInfo;
import com.sap.sse.common.Util;
import com.sap.sse.replication.OperationExecutionListener;
import com.sap.sse.replication.OperationWithResult;
@@ -631,7 +631,7 @@ public class ReplicationServiceImpl implements ReplicationService {
private String registerReplicaWithMaster(ReplicationMasterDescriptor master) throws IOException,
ClassNotFoundException {
URL replicationRegistrationRequestURL = master.getReplicationRegistrationRequestURL(getServerIdentifier(),
BuildVersion.getBuildVersion());
ServerInfo.getBuildVersion());
final URLConnection registrationRequestConnection = replicationRegistrationRequestURL.openConnection();
registrationRequestConnection.connect();
final InputStream content = (InputStream) registrationRequestConnection.getContent();
@@ -1,21 +0,0 @@
package com.sap.sse;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class BuildVersion {
public static String getBuildVersion() {
String version = "Unknown or Development (" + System.getProperty("com.sap.sailing.server.name") + ")";
File versionfile = new File(System.getProperty("jetty.home") + File.separator + "version.txt");
if (versionfile.exists()) {
try {
version = new BufferedReader(new FileReader(versionfile)).readLine();
} catch (Exception ex) {
/* ignore */
}
}
return version;
}
}
@@ -0,0 +1,29 @@
package com.sap.sse;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
/**
* A class providing static information about the running server.
* @author Frank
*
*/
public class ServerInfo {
public static String getBuildVersion() {
String version = "Unknown or Development (" + ServerStartupConstants.SERVER_NAME + ")";
File versionfile = new File(ServerStartupConstants.JETTY_HOME + File.separator + "version.txt");
if (versionfile.exists()) {
try {
version = new BufferedReader(new FileReader(versionfile)).readLine();
} catch (Exception ex) {
/* ignore */
}
}
return version;
}
public static String getName() {
return ServerStartupConstants.SERVER_NAME;
}
}
@@ -0,0 +1,6 @@
package com.sap.sse;
public interface ServerStartupConstants {
final static String SERVER_NAME = System.getProperty("com.sap.sailing.server.name");
final static String JETTY_HOME = System.getProperty("jetty.home");
}