mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-21 13:15:35 +00:00
bug4006 aftermath: defer waiting for SecurityService in RacingEventService until it's really needed
This commit is contained in:
+1
-7
@@ -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 {
|
||||||
|
|||||||
+2
-6
@@ -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 {
|
||||||
|
|||||||
+1
-5
@@ -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);
|
||||||
|
|||||||
+1
-4
@@ -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,
|
||||||
|
|||||||
+1
-4
@@ -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);
|
||||||
|
|||||||
+1
-5
@@ -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 {
|
||||||
|
|||||||
+1
-5
@@ -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();
|
||||||
|
|||||||
+2
-9
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-5
@@ -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() {
|
||||||
|
|||||||
+1
-5
@@ -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();
|
||||||
|
|||||||
+3
-8
@@ -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();
|
||||||
|
|||||||
+3
-3
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-5
@@ -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,
|
||||||
|
|||||||
+4
-5
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+16
@@ -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,
|
||||||
|
|||||||
+5
-4
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user