bug4006 aftermath: defer waiting for SecurityService in RacingEventService until it's really needed

This commit is contained in:
Axel Uhl
2020-03-20 13:21:13 +01:00
parent 6e33a6339b
commit bad0bd975a
18 changed files with 62 additions and 144 deletions
@@ -2,7 +2,6 @@ package com.sap.sailing.dashboards.gwt.server;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.dashboards.gwt.shared.DashboardLiveRaceProvider; import com.sap.sailing.dashboards.gwt.shared.DashboardLiveRaceProvider;
import com.sap.sailing.dashboards.gwt.shared.MovingAveragesCache; import com.sap.sailing.dashboards.gwt.shared.MovingAveragesCache;
@@ -16,8 +15,6 @@ import com.sap.sse.gwt.dispatch.servlets.AbstractDispatchServlet;
import com.sap.sse.gwt.dispatch.shared.commands.Action; import com.sap.sse.gwt.dispatch.shared.commands.Action;
import com.sap.sse.gwt.dispatch.shared.commands.Result; import com.sap.sse.gwt.dispatch.shared.commands.Result;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.util.ServiceTrackerFactory;
public class DashboardDispatchServlet extends AbstractDispatchServlet<DashboardDispatchContext> { public class DashboardDispatchServlet extends AbstractDispatchServlet<DashboardDispatchContext> {
private static final long serialVersionUID = -245230476512348999L; private static final long serialVersionUID = -245230476512348999L;
@@ -29,10 +26,7 @@ public class DashboardDispatchServlet extends AbstractDispatchServlet<DashboardD
public DashboardDispatchServlet() { public DashboardDispatchServlet() {
final BundleContext context = Activator.getDefault(); final BundleContext context = Activator.getDefault();
final ServiceTracker<ReplicationService, ReplicationService> replicationServiceTracker = racingEventServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, RacingEventService.class);
ServiceTrackerFactory.createAndOpen(context, ReplicationService.class);
racingEventServiceTracker = new FullyInitializedReplicableTracker<>(context, RacingEventService.class,
/* customizer */ null, replicationServiceTracker);
racingEventServiceTracker.open(); racingEventServiceTracker.open();
polarDataService = getPolarDataService(); polarDataService = getPolarDataService();
try { try {
@@ -11,7 +11,6 @@ import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.domain.igtimiadapter.Client; import com.sap.sailing.domain.igtimiadapter.Client;
import com.sap.sailing.domain.igtimiadapter.IgtimiConnectionFactory; import com.sap.sailing.domain.igtimiadapter.IgtimiConnectionFactory;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ServiceTrackerFactory; import com.sap.sse.util.ServiceTrackerFactory;
@@ -36,11 +35,8 @@ public class Activator implements BundleActivator {
@Override @Override
public void start(final BundleContext context) throws Exception { public void start(final BundleContext context) throws Exception {
INSTANCE = this; INSTANCE = this;
igtimiConnectionFactoryTracker = ServiceTrackerFactory igtimiConnectionFactoryTracker = ServiceTrackerFactory.createAndOpen(context, IgtimiConnectionFactory.class);
.createAndOpen(context, IgtimiConnectionFactory.class); securityServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
securityServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class,
/* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
securityServiceTracker.open();
} }
public static Activator getInstance() throws ClientProtocolException, IllegalStateException, IOException, ParseException { public static Activator getInstance() throws ClientProtocolException, IllegalStateException, IOException, ParseException {
@@ -23,10 +23,8 @@ import com.sap.sailing.domain.igtimiadapter.persistence.MongoObjectFactory;
import com.sap.sailing.domain.igtimiadapter.persistence.PersistenceFactory; import com.sap.sailing.domain.igtimiadapter.persistence.PersistenceFactory;
import com.sap.sailing.domain.tracking.WindTrackerFactory; import com.sap.sailing.domain.tracking.WindTrackerFactory;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ClearStateTestSupport; import com.sap.sse.util.ClearStateTestSupport;
import com.sap.sse.util.ServiceTrackerFactory;
import com.sap.sse.util.impl.ThreadFactoryWithPriority; import com.sap.sse.util.impl.ThreadFactoryWithPriority;
/** /**
@@ -107,9 +105,7 @@ public class Activator implements BundleActivator {
} }
} }
}); });
securityServiceServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class, securityServiceServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
/* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
securityServiceServiceTracker.open();
new Thread(() -> { new Thread(() -> {
try { try {
final SecurityService securityService = securityServiceServiceTracker.getInitializedService(0); final SecurityService securityService = securityServiceServiceTracker.getInitializedService(0);
@@ -38,7 +38,6 @@ import com.sap.sse.MasterDataImportClassLoaderService;
import com.sap.sse.common.TypeBasedServiceFinder; import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.Replicable; import com.sap.sse.replication.Replicable;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.util.ServiceTrackerFactory; import com.sap.sse.util.ServiceTrackerFactory;
public class Activator implements BundleActivator { public class Activator implements BundleActivator {
@@ -86,9 +85,7 @@ public class Activator implements BundleActivator {
registrations.add(context.registerService(SensorFixMapper.class, new BravoExtendedDataFixMapper(), null)); registrations.add(context.registerService(SensorFixMapper.class, new BravoExtendedDataFixMapper(), null));
registrations.add(context.registerService(SensorFixMapper.class, new ExpeditionExtendedDataFixMapper(), null)); registrations.add(context.registerService(SensorFixMapper.class, new ExpeditionExtendedDataFixMapper(), null));
sensorFixMapperTracker = createSensorFixMapperServiceTracker(context); sensorFixMapperTracker = createSensorFixMapperServiceTracker(context);
racingEventServiceTracker = new FullyInitializedReplicableTracker<>(context, RacingEventService.class, racingEventServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, RacingEventService.class);
/* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
racingEventServiceTracker.open();
RegattaLogFixTrackerRegattaListener regattaLogSensorDataTrackerTrackedRegattaListener = new RegattaLogFixTrackerRegattaListener( RegattaLogFixTrackerRegattaListener regattaLogSensorDataTrackerTrackedRegattaListener = new RegattaLogFixTrackerRegattaListener(
racingEventServiceTracker, new SensorFixMapperFactoryImpl(sensorFixMapperTracker)); racingEventServiceTracker, new SensorFixMapperFactoryImpl(sensorFixMapperTracker));
registrations.add(context.registerService(TrackedRegattaListener.class, registrations.add(context.registerService(TrackedRegattaListener.class,
@@ -23,7 +23,6 @@ import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParametersHandler
import com.sap.sse.common.TypeBasedServiceFinder; import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.mongodb.MongoDBService; import com.sap.sse.mongodb.MongoDBService;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ServiceTrackerFactory; import com.sap.sse.util.ServiceTrackerFactory;
@@ -36,9 +35,7 @@ public class Activator implements BundleActivator {
MongoDBService.INSTANCE.registerExclusively(CollectionNames.class, name.name()); MongoDBService.INSTANCE.registerExclusively(CollectionNames.class, name.name());
} }
new Thread(() -> { new Thread(() -> {
final FullyInitializedReplicableTracker<SecurityService> securityServiceServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class, final FullyInitializedReplicableTracker<SecurityService> securityServiceServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
/* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
securityServiceServiceTracker.open();
final ServiceTracker<MongoObjectFactory, MongoObjectFactory> mongoObjectFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, MongoObjectFactory.class); final ServiceTracker<MongoObjectFactory, MongoObjectFactory> mongoObjectFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, MongoObjectFactory.class);
final ServiceTracker<DomainObjectFactory, DomainObjectFactory> domainObjectFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, DomainObjectFactory.class); final ServiceTracker<DomainObjectFactory, DomainObjectFactory> domainObjectFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, DomainObjectFactory.class);
final ServiceTracker<SwissTimingAdapterFactory, SwissTimingAdapterFactory> swissTimingAdapterFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, SwissTimingAdapterFactory.class); final ServiceTracker<SwissTimingAdapterFactory, SwissTimingAdapterFactory> swissTimingAdapterFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, SwissTimingAdapterFactory.class);
@@ -24,7 +24,6 @@ import com.sap.sailing.domain.tractracadapter.impl.RaceTrackingConnectivityParam
import com.sap.sse.common.TypeBasedServiceFinder; import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.mongodb.MongoDBService; import com.sap.sse.mongodb.MongoDBService;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ClearStateTestSupport; import com.sap.sse.util.ClearStateTestSupport;
import com.sap.sse.util.ServiceTrackerFactory; import com.sap.sse.util.ServiceTrackerFactory;
@@ -48,10 +47,7 @@ public class Activator implements BundleActivator {
.createAndOpen(context, MongoObjectFactory.class); .createAndOpen(context, MongoObjectFactory.class);
final ServiceTracker<DomainObjectFactory, DomainObjectFactory> domainObjectFactoryServiceTracker = ServiceTrackerFactory final ServiceTracker<DomainObjectFactory, DomainObjectFactory> domainObjectFactoryServiceTracker = ServiceTrackerFactory
.createAndOpen(context, DomainObjectFactory.class); .createAndOpen(context, DomainObjectFactory.class);
final FullyInitializedReplicableTracker<SecurityService> securityServiceServiceTracker = new FullyInitializedReplicableTracker<>( final FullyInitializedReplicableTracker<SecurityService> securityServiceServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
context, SecurityService.class, /* customizer */ null,
ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
securityServiceServiceTracker.open();
final ServiceTracker<TracTracAdapterFactory, TracTracAdapterFactory> tractracAdapterFactoryTracker = ServiceTrackerFactory final ServiceTracker<TracTracAdapterFactory, TracTracAdapterFactory> tractracAdapterFactoryTracker = ServiceTrackerFactory
.createAndOpen(context, TracTracAdapterFactory.class); .createAndOpen(context, TracTracAdapterFactory.class);
try { try {
@@ -28,11 +28,9 @@ import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdent
import com.sap.sse.ServerInfo; import com.sap.sse.ServerInfo;
import com.sap.sse.common.TypeBasedServiceFinder; import com.sap.sse.common.TypeBasedServiceFinder;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.security.shared.QualifiedObjectIdentifier; import com.sap.sse.security.shared.QualifiedObjectIdentifier;
import com.sap.sse.security.shared.impl.WildcardPermissionEncoder; import com.sap.sse.security.shared.impl.WildcardPermissionEncoder;
import com.sap.sse.util.ServiceTrackerFactory;
import com.sap.sse.util.impl.ThreadFactoryWithPriority; import com.sap.sse.util.impl.ThreadFactoryWithPriority;
public class Activator implements BundleActivator { public class Activator implements BundleActivator {
@@ -92,9 +90,7 @@ public class Activator implements BundleActivator {
registrations.add(context.registerService(DeviceIdentifierStringSerializationHandler.class, new ExpeditionSensorStringSerializationHandler(), getDict(ExpeditionSensorDeviceIdentifier.TYPE))); registrations.add(context.registerService(DeviceIdentifierStringSerializationHandler.class, new ExpeditionSensorStringSerializationHandler(), getDict(ExpeditionSensorDeviceIdentifier.TYPE)));
new Thread(() -> { new Thread(() -> {
final FullyInitializedReplicableTracker<SecurityService> securityServiceServiceTracker = new FullyInitializedReplicableTracker<>( final FullyInitializedReplicableTracker<SecurityService> securityServiceServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
context, SecurityService.class, /* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
securityServiceServiceTracker.open();
try { try {
final SecurityService securityService = securityServiceServiceTracker.getInitializedService(0); final SecurityService securityService = securityServiceServiceTracker.getInitializedService(0);
final WildcardPermissionEncoder permissionEncoder = new WildcardPermissionEncoder(); final WildcardPermissionEncoder permissionEncoder = new WildcardPermissionEncoder();
@@ -24,7 +24,6 @@ import com.sap.sse.gwt.dispatch.servlets.AbstractDispatchServlet;
import com.sap.sse.gwt.dispatch.shared.commands.Action; import com.sap.sse.gwt.dispatch.shared.commands.Action;
import com.sap.sse.gwt.dispatch.shared.commands.Result; import com.sap.sse.gwt.dispatch.shared.commands.Result;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ServiceTrackerFactory; import com.sap.sse.util.ServiceTrackerFactory;
@@ -39,16 +38,10 @@ public class SailingDispatchServlet extends AbstractDispatchServlet<SailingDispa
public SailingDispatchServlet() { public SailingDispatchServlet() {
final BundleContext context = Activator.getDefault(); final BundleContext context = Activator.getDefault();
final ServiceTracker<ReplicationService, ReplicationService> replicationServiceTracker = racingEventServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, RacingEventService.class);
ServiceTrackerFactory.createAndOpen(context, ReplicationService.class);
racingEventServiceTracker = new FullyInitializedReplicableTracker<>(context, RacingEventService.class,
/* customizer */ null, replicationServiceTracker);
racingEventServiceTracker.open();
windFinderTrackerFactory = ServiceTrackerFactory.createAndOpen(context, WindFinderTrackerFactory.class); windFinderTrackerFactory = ServiceTrackerFactory.createAndOpen(context, WindFinderTrackerFactory.class);
eventNewsServiceTracker = ServiceTrackerFactory.createAndOpen(context, EventNewsService.class); eventNewsServiceTracker = ServiceTrackerFactory.createAndOpen(context, EventNewsService.class);
securityServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class, securityServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
/* customizer */ null, replicationServiceTracker);
securityServiceTracker.open();
trackedRaceStatisticsCacheTracker = ServiceTrackerFactory.createAndOpen(context, TrackedRaceStatisticsCache.class); trackedRaceStatisticsCacheTracker = ServiceTrackerFactory.createAndOpen(context, TrackedRaceStatisticsCache.class);
} }
@@ -7,8 +7,6 @@ import com.sap.sailing.gwt.ui.server.Activator;
import com.sap.sailing.server.interfaces.RacingEventService; import com.sap.sailing.server.interfaces.RacingEventService;
import com.sap.sse.gwt.server.ProxiedRemoteServiceServlet; import com.sap.sse.gwt.server.ProxiedRemoteServiceServlet;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.util.ServiceTrackerFactory;
/** /**
* The server side implementation of the RPC service. * The server side implementation of the RPC service.
@@ -20,9 +18,7 @@ public class ServerConfigurationServiceImpl extends ProxiedRemoteServiceServlet
public ServerConfigurationServiceImpl() { public ServerConfigurationServiceImpl() {
BundleContext context = Activator.getDefault(); BundleContext context = Activator.getDefault();
racingEventServiceTracker = new FullyInitializedReplicableTracker<>(context, RacingEventService.class, racingEventServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, RacingEventService.class);
/* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
racingEventServiceTracker.open();
} }
protected RacingEventService getService() { protected RacingEventService getService() {
@@ -50,10 +50,8 @@ import com.sap.sse.datamining.ui.client.DataMiningService;
import com.sap.sse.gwt.server.ProxiedRemoteServiceServlet; import com.sap.sse.gwt.server.ProxiedRemoteServiceServlet;
import com.sap.sse.i18n.ResourceBundleStringMessages; import com.sap.sse.i18n.ResourceBundleStringMessages;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions; import com.sap.sse.security.shared.impl.SecuredSecurityTypes.ServerActions;
import com.sap.sse.util.ServiceTrackerFactory;
public class DataMiningServiceImpl extends ProxiedRemoteServiceServlet implements DataMiningService { public class DataMiningServiceImpl extends ProxiedRemoteServiceServlet implements DataMiningService {
private static final long serialVersionUID = -7951930891674894528L; private static final long serialVersionUID = -7951930891674894528L;
@@ -67,9 +65,7 @@ public class DataMiningServiceImpl extends ProxiedRemoteServiceServlet implement
public DataMiningServiceImpl() { public DataMiningServiceImpl() {
context = Activator.getDefault(); context = Activator.getDefault();
dataMiningServerTracker = createAndOpenDataMiningServerTracker(context); dataMiningServerTracker = createAndOpenDataMiningServerTracker(context);
securityServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class, securityServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
/* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
securityServiceTracker.open();
storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(getSecurityService(), storedDataMiningQueryPersistor = new StoredDataMiningQueryPersisterImpl(getSecurityService(),
dataMiningServerTracker); dataMiningServerTracker);
dtoFactory = new DataMiningDTOFactory(); dtoFactory = new DataMiningDTOFactory();
@@ -780,12 +780,8 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
Activator activator = Activator.getInstance(); Activator activator = Activator.getInstance();
quickRanksLiveCache = new QuickRanksLiveCache(this); quickRanksLiveCache = new QuickRanksLiveCache(this);
replicationServiceTracker = ServiceTrackerFactory.createAndOpen(context, ReplicationService.class); replicationServiceTracker = ServiceTrackerFactory.createAndOpen(context, ReplicationService.class);
racingEventServiceTracker = new FullyInitializedReplicableTracker<>(context, RacingEventService.class, racingEventServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, RacingEventService.class);
/* customizer */ null, replicationServiceTracker); sharedSailingDataTracker = FullyInitializedReplicableTracker.createAndOpen(context, SharedSailingData.class);
racingEventServiceTracker.open();
sharedSailingDataTracker = new FullyInitializedReplicableTracker<>(context, SharedSailingData.class,
/* service tracker customizer */ null, replicationServiceTracker);
sharedSailingDataTracker.open();
windFinderTrackerFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, WindFinderTrackerFactory.class); windFinderTrackerFactoryServiceTracker = ServiceTrackerFactory.createAndOpen(context, WindFinderTrackerFactory.class);
swissTimingAdapterTracker = ServiceTrackerFactory.createAndOpen(context, SwissTimingAdapterFactory.class); swissTimingAdapterTracker = ServiceTrackerFactory.createAndOpen(context, SwissTimingAdapterFactory.class);
tractracAdapterTracker = ServiceTrackerFactory.createAndOpen(context, TracTracAdapterFactory.class); tractracAdapterTracker = ServiceTrackerFactory.createAndOpen(context, TracTracAdapterFactory.class);
@@ -793,8 +789,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
RaceLogTrackingAdapterFactory.class); RaceLogTrackingAdapterFactory.class);
deviceIdentifierStringSerializationHandlerTracker = ServiceTrackerFactory.createAndOpen(context, deviceIdentifierStringSerializationHandlerTracker = ServiceTrackerFactory.createAndOpen(context,
DeviceIdentifierStringSerializationHandler.class); DeviceIdentifierStringSerializationHandler.class);
securityServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class, securityServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
/* service tracker customizer */ null, replicationServiceTracker);
securityServiceTracker.open(); securityServiceTracker.open();
igtimiAdapterTracker = ServiceTrackerFactory.createAndOpen(context, IgtimiConnectionFactory.class); igtimiAdapterTracker = ServiceTrackerFactory.createAndOpen(context, IgtimiConnectionFactory.class);
baseDomainFactory = getService().getBaseDomainFactory(); baseDomainFactory = getService().getBaseDomainFactory();
@@ -18,6 +18,7 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TypeBasedServiceFinderFactory; import com.sap.sse.common.TypeBasedServiceFinderFactory;
import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.osgi.CachedOsgiTypeBasedServiceFinderFactory; import com.sap.sse.osgi.CachedOsgiTypeBasedServiceFinderFactory;
import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.DateParser; import com.sap.sse.util.DateParser;
@@ -38,7 +39,7 @@ public abstract class SailingServerHttpServlet extends HttpServlet {
private BundleContext context; private BundleContext context;
private ServiceTracker<RacingEventService, RacingEventService> racingEventServiceTracker; private FullyInitializedReplicableTracker<RacingEventService> racingEventServiceTracker;
private ServiceTracker<SecurityService, SecurityService> securityServiceTracker; private ServiceTracker<SecurityService, SecurityService> securityServiceTracker;
@@ -53,8 +54,7 @@ public abstract class SailingServerHttpServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException { public void init(ServletConfig config) throws ServletException {
super.init(config); super.init(config);
context = (BundleContext) config.getServletContext().getAttribute(OSGI_RFC66_WEBBUNDLE_BUNDLECONTEXT_NAME); context = (BundleContext) config.getServletContext().getAttribute(OSGI_RFC66_WEBBUNDLE_BUNDLECONTEXT_NAME);
racingEventServiceTracker = new ServiceTracker<RacingEventService, RacingEventService>(context, RacingEventService.class.getName(), null); racingEventServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, RacingEventService.class);
racingEventServiceTracker.open();
securityServiceTracker = new ServiceTracker<SecurityService, SecurityService>(context, SecurityService.class.getName(), null); securityServiceTracker = new ServiceTracker<SecurityService, SecurityService>(context, SecurityService.class.getName(), null);
securityServiceTracker.open(); securityServiceTracker.open();
tracTracAdapterFactoryTracker = new ServiceTracker<TracTracAdapterFactory, TracTracAdapterFactory>(context, TracTracAdapterFactory.class.getName(), null); tracTracAdapterFactoryTracker = new ServiceTracker<TracTracAdapterFactory, TracTracAdapterFactory>(context, TracTracAdapterFactory.class.getName(), null);
@@ -135,25 +135,22 @@ public class Activator implements BundleActivator {
extenderBundleTracker.open(); extenderBundleTracker.open();
mailServiceTracker = ServiceTrackerFactory.createAndOpen(context, MailService.class); mailServiceTracker = ServiceTrackerFactory.createAndOpen(context, MailService.class);
replicationServiceTracker = ServiceTrackerFactory.createAndOpen(context, ReplicationService.class); replicationServiceTracker = ServiceTrackerFactory.createAndOpen(context, ReplicationService.class);
sharedSailingDataTracker = new FullyInitializedReplicableTracker<>(context, SharedSailingData.class, sharedSailingDataTracker = FullyInitializedReplicableTracker.createAndOpen(context, SharedSailingData.class);
/* customizer */ null, replicationServiceTracker); securityServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
sharedSailingDataTracker.open();
securityServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class,
/* customizer */ null, replicationServiceTracker);
securityServiceTracker.open(); securityServiceTracker.open();
if (securityServiceTracker != null) { new Thread(""+this+" initializing RacingEventService in the background") {
new Thread("Racingevent wait for securityservice for migration thread") { public void run() {
public void run() { try {
try { // we used to wait for the SecurityService here, but this now (see bug 4006) would be suspended until replication
// only continue once we have the service, as some of the services require it to start properly // is finished with its initial load, and it's important to get RacingEventService registered with the OSGi service
securityServiceTracker.getInitializedService(0); // registry before the first access to the SecurityService, because only registering RacingEventService can unblock
internalStartBundle(context); // the replication and hence make a fully-initialized SecurityService with the initial load already completed available.
} catch (Exception e) { internalStartBundle(context);
logger.log(Level.SEVERE, "Could not start RacingEvent service properly", e); } catch (Exception e) {
} logger.log(Level.SEVERE, "Could not start RacingEvent service properly", e);
}; }
}.start(); };
} }.start();
} }
/** /**
@@ -218,7 +215,6 @@ public class Activator implements BundleActivator {
private void internalStartBundle(BundleContext context) throws MalformedURLException, MalformedObjectNameException, private void internalStartBundle(BundleContext context) throws MalformedURLException, MalformedObjectNameException,
InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, InterruptedException { InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, InterruptedException {
assert securityServiceTracker.getInitializedService(0) != null; // callers must call securityServiceTracker.waitForService(0) before calling this method
mailQueue = new ExecutorMailQueue(mailServiceTracker); mailQueue = new ExecutorMailQueue(mailServiceTracker);
notificationService = new SailingNotificationServiceImpl(context, mailQueue); notificationService = new SailingNotificationServiceImpl(context, mailQueue);
trackedRegattaListener = new OSGiBasedTrackedRegattaListener(context); trackedRegattaListener = new OSGiBasedTrackedRegattaListener(context);
@@ -317,7 +313,9 @@ public class Activator implements BundleActivator {
mbs.registerMBean(mbean, mBeanName); mbs.registerMBean(mbean, mBeanName);
logger.log(Level.INFO, "Started " + context.getBundle().getSymbolicName() logger.log(Level.INFO, "Started " + context.getBundle().getSymbolicName()
+ ". Character encoding: " + Charset.defaultCharset()); + ". Character encoding: " + Charset.defaultCharset());
// do initial setup/migration logic // do initial setup/migration logic; do this after the RacingEventService has been published to the OSGi
// registry because this will require the SecurityService and that can only become available once the initial
// load has been finished in case this is a replica with auto-replication.
racingEventService.ensureOwnerships(); racingEventService.ensureOwnerships();
} }
@@ -14,10 +14,8 @@ import com.sap.sailing.shared.server.SharedSailingData;
import com.sap.sse.osgi.CachedOsgiTypeBasedServiceFinderFactory; import com.sap.sse.osgi.CachedOsgiTypeBasedServiceFinderFactory;
import com.sap.sse.replication.FullyInitializedReplicableTracker; import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.replication.Replicable; import com.sap.sse.replication.Replicable;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ClearStateTestSupport; import com.sap.sse.util.ClearStateTestSupport;
import com.sap.sse.util.ServiceTrackerFactory;
public class Activator implements BundleActivator { public class Activator implements BundleActivator {
@@ -33,9 +31,7 @@ public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception { public void start(BundleContext context) throws Exception {
Activator.context = context; Activator.context = context;
securityServiceTracker = new FullyInitializedReplicableTracker<>(context, SecurityService.class, securityServiceTracker = FullyInitializedReplicableTracker.createAndOpen(context, SecurityService.class);
/* customizer */ null, ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
securityServiceTracker.open();
serviceFinderFactory = new CachedOsgiTypeBasedServiceFinderFactory(context); serviceFinderFactory = new CachedOsgiTypeBasedServiceFinderFactory(context);
sharedSailingData = new SharedSailingDataImpl(PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory(serviceFinderFactory), sharedSailingData = new SharedSailingDataImpl(PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory(serviceFinderFactory),
PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(serviceFinderFactory), serviceFinderFactory, PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(serviceFinderFactory), serviceFinderFactory,
@@ -6,31 +6,30 @@ import java.util.Map;
import java.util.UUID; import java.util.UUID;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sse.common.IsManagedByCache; import com.sap.sse.common.IsManagedByCache;
import com.sap.sse.filestorage.FileStorageService; import com.sap.sse.filestorage.FileStorageService;
import com.sap.sse.filestorage.FileStorageServiceProperty; import com.sap.sse.filestorage.FileStorageServiceProperty;
import com.sap.sse.filestorage.FileStorageServiceResolver; import com.sap.sse.filestorage.FileStorageServiceResolver;
import com.sap.sse.replication.FullyInitializedReplicableTracker;
import com.sap.sse.security.SecurityService; import com.sap.sse.security.SecurityService;
import com.sap.sse.util.ServiceTrackerFactory;
public abstract class BaseFileStorageServiceImpl implements FileStorageService { public abstract class BaseFileStorageServiceImpl implements FileStorageService {
private static final long serialVersionUID = 7787261863522200165L; private static final long serialVersionUID = 7787261863522200165L;
private final String name; private final String name;
private final String descriptionKey; private final String descriptionKey;
protected final Map<String, FileStorageServicePropertyImpl> propertiesByNameInInsertionOrder = new LinkedHashMap<>(); protected final Map<String, FileStorageServicePropertyImpl> propertiesByNameInInsertionOrder = new LinkedHashMap<>();
private transient ServiceTracker<SecurityService, SecurityService> securityServiceTracker; private transient FullyInitializedReplicableTracker<SecurityService> securityServiceTracker;
protected BaseFileStorageServiceImpl(String name, String descriptionKey, BundleContext bundleContext) { protected BaseFileStorageServiceImpl(String name, String descriptionKey, BundleContext bundleContext) {
this.name = name; this.name = name;
this.descriptionKey = descriptionKey; this.descriptionKey = descriptionKey;
this.securityServiceTracker = bundleContext == null ? null : ServiceTrackerFactory.createAndOpen(bundleContext, SecurityService.class); this.securityServiceTracker = bundleContext == null ? null : FullyInitializedReplicableTracker.createAndOpen(bundleContext, SecurityService.class);
} }
protected SecurityService getSecurityService() { protected SecurityService getSecurityService() {
try { try {
return securityServiceTracker.waitForService(0); return securityServiceTracker.getInitializedService(0);
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -10,6 +10,7 @@ import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer; import org.osgi.util.tracker.ServiceTrackerCustomizer;
import com.sap.sse.replication.ReplicationService.ReplicationStartingListener; import com.sap.sse.replication.ReplicationService.ReplicationStartingListener;
import com.sap.sse.util.ServiceTrackerFactory;
/** /**
* While a regular OSGi {@link ServiceTracker} would {@link ServiceTracker#waitForService(long) wait} for the service's * While a regular OSGi {@link ServiceTracker} would {@link ServiceTracker#waitForService(long) wait} for the service's
@@ -42,6 +43,21 @@ public class FullyInitializedReplicableTracker<R extends Replicable<?, ?>> exten
* result will be considered. * result will be considered.
*/ */
private final ServiceTracker<ReplicationService, ReplicationService> replicationServiceTracker; private final ServiceTracker<ReplicationService, ReplicationService> replicationServiceTracker;
/**
* Same as {@link #createAndOpen(BundleContext, Class, ServiceTrackerCustomizer)}, but using {@code null} for the customizer.
*/
public static <R extends Replicable<?, ?>> FullyInitializedReplicableTracker<R> createAndOpen(BundleContext context, Class<R> clazz) {
return createAndOpen(context, clazz, /* customizer */ null);
}
public static <R extends Replicable<?, ?>> FullyInitializedReplicableTracker<R> createAndOpen(BundleContext context, Class<R> clazz,
ServiceTrackerCustomizer<R, R> customizer) {
final FullyInitializedReplicableTracker<R> result = new FullyInitializedReplicableTracker<R>(context, clazz, customizer,
ServiceTrackerFactory.createAndOpen(context, ReplicationService.class));
result.open();
return result;
}
public FullyInitializedReplicableTracker(BundleContext context, Class<R> clazz, public FullyInitializedReplicableTracker(BundleContext context, Class<R> clazz,
ServiceTrackerCustomizer<R, R> customizer, ServiceTrackerCustomizer<R, R> customizer,
@@ -639,7 +639,8 @@ public class ReplicationServiceImpl implements ReplicationService, OperationsToM
/** /**
* The peer for this method is * The peer for this method is
* {@link ReplicationServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)} * {@link ReplicationServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}
* which implements the initial load sending process. * which implements the initial load sending process. This method will return only after the initial load for all
* replicas described in the {@code master} descriptor has completed.
*/ */
@Override @Override
public void startToReplicateFrom(final ReplicationMasterDescriptor master) public void startToReplicateFrom(final ReplicationMasterDescriptor master)
@@ -908,9 +909,9 @@ public class ReplicationServiceImpl implements ReplicationService, OperationsToM
@Override @Override
public void setReplicationStarting(boolean newReplicationStarting) { public void setReplicationStarting(boolean newReplicationStarting) {
if (this.replicationStarting != newReplicationStarting) { synchronized (replicationStartingListeners) {
this.replicationStarting = newReplicationStarting; if (this.replicationStarting != newReplicationStarting) {
synchronized (replicationStartingListeners) { this.replicationStarting = newReplicationStarting;
for (final ReplicationStartingListener listener : replicationStartingListeners) { for (final ReplicationStartingListener listener : replicationStartingListeners) {
listener.onReplicationStartingChanged(newReplicationStarting); listener.onReplicationStartingChanged(newReplicationStarting);
} }
@@ -1,44 +0,0 @@
package com.sap.sse.gateway;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import org.osgi.util.tracker.ServiceTracker;
/**
* A servlet that holds an OSGi service reference
*
* @author Axel Uhl (D043530)
*
* @param <S> the service type
*/
public abstract class HttpServletWithService<S> extends AbstractHttpServlet {
private static final long serialVersionUID = -6514453597593669376L;
private ServiceTracker<S, S> racingEventServiceTracker;
private final String serviceClassName;
protected HttpServletWithService(Class<S> serviceClass) {
this.serviceClassName = serviceClass.getName();
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
racingEventServiceTracker = new ServiceTracker<S, S>(getContext(), serviceClassName, null);
racingEventServiceTracker.open();
}
@Override
public void destroy() {
super.destroy();
if (racingEventServiceTracker != null) {
racingEventServiceTracker.close();
}
}
public S getService() {
return racingEventServiceTracker.getService();
}
}