From 5b737686384ee55796238131b8954a9f567cacd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kai=20B=C3=B6rnert?= Date: Thu, 6 Dec 2018 10:25:34 +0100 Subject: [PATCH] simplified Ownership migration code enabled migration for ExpeditionDeviceConfigurations --- .../domain/igtimiadapter/impl/Activator.java | 5 +- .../persistence/impl/Activator.java | 10 ++- .../persistence/impl/Activator.java | 5 +- .../expeditionconnector/impl/Activator.java | 27 ++++++++ .../server/impl/RacingEventServiceImpl.java | 67 +++++++------------ .../userstore/mongodb/impl/Activator.java | 9 ++- .../com/sap/sse/security/SecurityService.java | 7 +- .../security/impl/SecurityServiceImpl.java | 41 +++--------- 8 files changed, 77 insertions(+), 94 deletions(-) diff --git a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/Activator.java b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/Activator.java index f3df2d5c1e6..68a3143da8a 100755 --- a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/Activator.java +++ b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/Activator.java @@ -106,10 +106,9 @@ public class Activator implements BundleActivator { final SecurityService securityService = securityServiceServiceTracker.waitForService(0); IgtimiConnectionFactoryImpl igtimiConnectionFactory = connectionFactory.get(); for (Account account : igtimiConnectionFactory.getAllAccounts()) { - securityService.migrateOwnership(account, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(account); } - securityService.assumeOwnershipMigrated(SecuredDomainType.IGTIMI_ACCOUNT.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.IGTIMI_ACCOUNT.getName()); } catch (Exception e) { logger.log(Level.SEVERE, "Exception trying to migrate IgtimiAccounts implementation", e); } diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java index e893e69cc2c..6098caf62cf 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/Activator.java @@ -56,19 +56,17 @@ public class Activator implements BundleActivator { for (SwissTimingArchiveConfiguration swissTimingArchive : SwissTimingAdapterPersistence.INSTANCE .getSwissTimingArchiveConfigurations()) { - securityService.migrateOwnership(swissTimingArchive, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(swissTimingArchive); } for (SwissTimingConfiguration swissTiming : SwissTimingAdapterPersistence.INSTANCE .getSwissTimingConfigurations()) { - securityService.migrateOwnership(swissTiming, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(swissTiming); } // we do not necessarily have swisstiming configs, so ensure that migration is marked as done - securityService.assumeOwnershipMigrated(SecuredDomainType.SWISS_TIMING_ACCOUNT.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.SWISS_TIMING_ARCHIVE_ACCOUNT.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.SWISS_TIMING_ACCOUNT.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.SWISS_TIMING_ARCHIVE_ACCOUNT.getName()); } catch (Exception e) { logger.log(Level.SEVERE, "Exception trying to register SwissTiming RaceTrackingConnectivityParametersHandler implementation", e); diff --git a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java index c3a3432d41f..30e94d0ccde 100755 --- a/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java +++ b/java/com.sap.sailing.domain.tractracadapter.persistence/src/com/sap/sailing/domain/tractracadapter/persistence/impl/Activator.java @@ -62,11 +62,10 @@ public class Activator implements BundleActivator { com.sap.sailing.domain.tractracadapter.persistence.DomainObjectFactory tractracDomainObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.PersistenceFactory.INSTANCE .createDomainObjectFactory(mongoObjectFactory.getDatabase(), domainFactory); for (TracTracConfiguration trackTrackConfig : tractracDomainObjectFactory.getTracTracConfigurations()) { - securityService.migrateOwnership(trackTrackConfig, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(trackTrackConfig); } // we do not necessarily have tractrac configs, so ensure that migration is marked as done - securityService.assumeOwnershipMigrated(SecuredDomainType.TRACTRAC_ACCOUNT.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.TRACTRAC_ACCOUNT.getName()); properties.put(TypeBasedServiceFinder.TYPE, RaceTrackingConnectivityParametersImpl.TYPE); context.registerService(RaceTrackingConnectivityParametersHandler.class, paramsHandler, properties); diff --git a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/Activator.java b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/Activator.java index 31074365dd0..ece74312706 100755 --- a/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/Activator.java +++ b/java/com.sap.sailing.expeditionconnector/src/com/sap/sailing/expeditionconnector/impl/Activator.java @@ -12,9 +12,12 @@ import java.util.logging.Logger; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; +import org.osgi.util.tracker.ServiceTracker; +import com.sap.sailing.domain.common.security.SecuredDomainType; import com.sap.sailing.domain.racelogtracking.DeviceIdentifierStringSerializationHandler; import com.sap.sailing.domain.tracking.WindTrackerFactory; +import com.sap.sailing.expeditionconnector.ExpeditionDeviceConfiguration; import com.sap.sailing.expeditionconnector.ExpeditionSensorDeviceIdentifier; import com.sap.sailing.expeditionconnector.ExpeditionTrackerFactory; import com.sap.sailing.expeditionconnector.persistence.DomainObjectFactory; @@ -23,7 +26,12 @@ import com.sap.sailing.expeditionconnector.persistence.ExpeditionGpsDeviceIdenti import com.sap.sailing.expeditionconnector.persistence.MongoObjectFactory; import com.sap.sailing.expeditionconnector.persistence.PersistenceFactory; import com.sap.sailing.server.gateway.serialization.racelog.tracking.DeviceIdentifierJsonHandler; +import com.sap.sse.ServerInfo; import com.sap.sse.common.TypeBasedServiceFinder; +import com.sap.sse.security.SecurityService; +import com.sap.sse.security.shared.QualifiedObjectIdentifier; +import com.sap.sse.security.shared.impl.WildcardPermissionEncoder; +import com.sap.sse.util.ServiceTrackerFactory; import com.sap.sse.util.impl.ThreadFactoryWithPriority; public class Activator implements BundleActivator { @@ -81,6 +89,25 @@ public class Activator implements BundleActivator { registrations.add(context.registerService(DeviceIdentifierStringSerializationHandler.class, new ExpeditionGpsStringSerializationHandler(), getDict(ExpeditionGpsDeviceIdentifier.TYPE))); registrations.add(context.registerService(DeviceIdentifierJsonHandler.class, new ExpeditionSensorDeviceIdentifierJsonHandler(), getDict(ExpeditionSensorDeviceIdentifier.TYPE))); registrations.add(context.registerService(DeviceIdentifierStringSerializationHandler.class, new ExpeditionSensorStringSerializationHandler(), getDict(ExpeditionSensorDeviceIdentifier.TYPE))); + + new Thread(() -> { + final ServiceTracker securityServiceServiceTracker = ServiceTrackerFactory + .createAndOpen(context, SecurityService.class); + try { + final SecurityService securityService = securityServiceServiceTracker.waitForService(0); + for (ExpeditionDeviceConfiguration deviceConfiguration : expeditionTrackerFactory + .getDeviceConfigurations()) { + QualifiedObjectIdentifier identifier = SecuredDomainType.EXPEDITION_DEVICE_CONFIGURATION + .getQualifiedObjectIdentifier(WildcardPermissionEncoder.encode(ServerInfo.getName(), + deviceConfiguration.getName())); + securityService.migrateOwnership(identifier, identifier.getTypeRelativeObjectIdentifier()); + } + securityService.assumeOwnershipMigrated(SecuredDomainType.IGTIMI_ACCOUNT.getName()); + } catch (Exception e) { + logger.log(Level.SEVERE, "Exception trying to migrate IgtimiAccounts implementation", e); + } + }, getClass().getName() + " registering connectivity handler").start(); + }); } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index c48fb6832f5..08715a9c4fe 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -187,6 +187,7 @@ import com.sap.sailing.domain.tracking.RaceListener; import com.sap.sailing.domain.tracking.RaceTracker; import com.sap.sailing.domain.tracking.RaceTrackingConnectivityParameters; import com.sap.sailing.domain.tracking.RaceTrackingHandler; +import com.sap.sailing.domain.tracking.RaceTrackingHandler.DefaultRaceTrackingHandler; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.TrackedRaceStatus; import com.sap.sailing.domain.tracking.TrackedRegatta; @@ -194,7 +195,6 @@ import com.sap.sailing.domain.tracking.TrackedRegattaListener; import com.sap.sailing.domain.tracking.WindStore; import com.sap.sailing.domain.tracking.WindTracker; import com.sap.sailing.domain.tracking.WindTrackerFactory; -import com.sap.sailing.domain.tracking.RaceTrackingHandler.DefaultRaceTrackingHandler; import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener; import com.sap.sailing.domain.tracking.impl.DynamicTrackedRegattaImpl; import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; @@ -948,73 +948,56 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes public void ensureOwnerships() { SecurityService securityService = getSecurityService(); - securityService.assumeOwnershipMigrated(SecuredDomainType.MANAGE_MARK_PASSINGS.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.EXPEDITION_DEVICE_CONFIGURATION.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.RACE_MANAGER_APP_DEVICE_CONFIGURATION.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.RESULT_IMPORT_URL.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.MANAGE_MARK_POSITIONS.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.CAN_REPLAY_DURING_LIVE_RACES.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.DETAIL_TIMER.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.DATA_MINING.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.REPLICATOR.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.MANAGE_MARK_PASSINGS.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.RACE_MANAGER_APP_DEVICE_CONFIGURATION.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.RESULT_IMPORT_URL.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.MANAGE_MARK_POSITIONS.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.CAN_REPLAY_DURING_LIVE_RACES.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.DETAIL_TIMER.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.DATA_MINING.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.REPLICATOR.getName()); for (Event event : getAllEvents()) { - securityService.migrateOwnership(event, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(event); } - securityService.assumeOwnershipMigrated(SecuredDomainType.EVENT.getName(), SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.EVENT.getName()); for (Regatta regatta : getAllRegattas()) { - securityService.migrateOwnership(regatta, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(regatta); // FIXME add listener for all TrackedRaces here and migrate them as they become available! DynamicTrackedRegatta trackedRegatta = getTrackedRegatta(regatta); if (trackedRegatta != null) { trackedRegatta.lockTrackedRacesForRead(); try { for (DynamicTrackedRace trackedRace : trackedRegatta.getTrackedRaces()) { - securityService.migrateOwnership(trackedRace, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(trackedRace); } } finally { trackedRegatta.unlockTrackedRacesAfterRead(); } } } - securityService.assumeOwnershipMigrated(SecuredDomainType.TRACKED_RACE.getName(), - SecuredDomainType.getAllInstances()); - securityService.assumeOwnershipMigrated(SecuredDomainType.REGATTA.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.TRACKED_RACE.getName()); + securityService.assumeOwnershipMigrated(SecuredDomainType.REGATTA.getName()); for (Leaderboard leaderboard : getLeaderboards().values()) { - securityService.migrateOwnership(leaderboard, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(leaderboard); } - securityService.assumeOwnershipMigrated(SecuredDomainType.LEADERBOARD.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.LEADERBOARD.getName()); for (LeaderboardGroup leaderboardGroup : getLeaderboardGroups().values()) { - securityService.migrateOwnership(leaderboardGroup, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(leaderboardGroup); } - securityService.assumeOwnershipMigrated(SecuredDomainType.LEADERBOARD_GROUP.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.LEADERBOARD_GROUP.getName()); for (MediaTrack mediaTrack : getAllMediaTracks()) { - securityService.migrateOwnership(mediaTrack, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(mediaTrack); } - securityService.assumeOwnershipMigrated(SecuredDomainType.MEDIA_TRACK.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.MEDIA_TRACK.getName()); for (Competitor competitor : getCompetitorAndBoatStore().getAllCompetitors()) { - securityService.migrateOwnership(competitor, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(competitor); } - securityService.assumeOwnershipMigrated(SecuredDomainType.COMPETITOR.getName(), - SecuredDomainType.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredDomainType.COMPETITOR.getName()); for (Boat boat : getCompetitorAndBoatStore().getBoats()) { - securityService.migrateOwnership(boat, SecuredDomainType.getAllInstances()); + securityService.migrateOwnership(boat); } - securityService.assumeOwnershipMigrated(SecuredDomainType.BOAT.getName(), SecuredDomainType.getAllInstances()); - + securityService.assumeOwnershipMigrated(SecuredDomainType.BOAT.getName()); securityService.checkMigration(SecuredDomainType.getAllInstances()); } diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/Activator.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/Activator.java index 39ead8d7175..8fde7e942ba 100644 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/Activator.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/Activator.java @@ -62,16 +62,15 @@ public class Activator implements BundleActivator { securityServiceServiceTracker.open(); final SecurityService securityService = securityServiceServiceTracker.waitForService(0); for (User user : userStore.getUsers()) { - securityService.migrateOwnership(user, SecuredSecurityTypes.getAllInstances()); + securityService.migrateOwnership(user); } for (UserGroup group : userStore.getUserGroups()) { - securityService.migrateOwnership(group, SecuredSecurityTypes.getAllInstances()); + securityService.migrateOwnership(group); } for (RoleDefinition role : userStore.getRoleDefinitions()) { - securityService.migrateOwnership(role, SecuredSecurityTypes.getAllInstances()); + securityService.migrateOwnership(role); } - securityService.assumeOwnershipMigrated(SecuredSecurityTypes.SERVER.getName(), - SecuredSecurityTypes.getAllInstances()); + securityService.assumeOwnershipMigrated(SecuredSecurityTypes.SERVER.getName()); securityService.checkMigration(SecuredSecurityTypes.getAllInstances()); } catch (InterruptedException e) { logger.log(Level.SEVERE, "Error in migration", e); diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java index 17ad0fc27d2..d79db3f31e6 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/SecurityService.java @@ -381,10 +381,11 @@ public interface SecurityService extends ReplicableWithObjectInputStream permissions); - void migrateOwnership(WithQualifiedObjectIdentifier object, Iterable permissions); + void assumeOwnershipMigrated(String typeName); - void migrateOwnership(QualifiedObjectIdentifier object, String displayName, Iterable permissions); + void migrateOwnership(WithQualifiedObjectIdentifier object); + + void migrateOwnership(QualifiedObjectIdentifier object, String displayName); void checkMigration(Iterable allInstances); diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index be221adfc03..d7ad0cc61d6 100644 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -22,7 +22,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ConcurrentSkipListSet; import java.util.function.Consumer; import java.util.function.Function; import java.util.logging.Level; @@ -135,7 +135,7 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat // private static final long MIGRATION_CHECK_DELAY = 20000; - private final Map, List>, List> migratedHasPermissionTypes = new ConcurrentHashMap<>(); + private final Set migratedHasPermissionTypes = new ConcurrentSkipListSet<>();; // private final Timer migrationTimer; @@ -1816,16 +1816,13 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat } @Override - public void migrateOwnership(WithQualifiedObjectIdentifier identifier, Iterable permissions) { - migrateOwnership(identifier.getIdentifier(), identifier.getName(), permissions); + public void migrateOwnership(WithQualifiedObjectIdentifier identifier) { + migrateOwnership(identifier.getIdentifier(), identifier.getName()); } @Override - public void migrateOwnership(final QualifiedObjectIdentifier identifier, final String displayName, - final Iterable permissions) { + public void migrateOwnership(final QualifiedObjectIdentifier identifier, final String displayName) { - final List alreadyMigrated = getMigrationInfoForKey(permissions); - final OwnershipAnnotation owner = this.getOwnership(identifier); final UserGroup defaultTenant = this.getDefaultTenant(); // fix unowned objects, also fix wrongly converted objects due to older codebase that could not handle null @@ -1836,34 +1833,15 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat + defaultTenant); this.setOwnership(identifier, null, defaultTenant, displayName); } - - if (!alreadyMigrated.contains(identifier.getTypeIdentifier())) { - alreadyMigrated.add(identifier.getTypeIdentifier()); - } - } - - private List getMigrationInfoForKey(final Iterable permissions) { - final List allRequiredPermissionsAsString = new ArrayList<>(); - for (HasPermissions permission : permissions) { - allRequiredPermissionsAsString.add(permission.getName()); - } - // the given Iterable cannot guarantee, that the order is always the same - Collections.sort(allRequiredPermissionsAsString); - - Pair, List> key = new Pair<>(Util.first(permissions).getClass(), - allRequiredPermissionsAsString); - final List alreadyMigrated = migratedHasPermissionTypes.computeIfAbsent(key, - t -> new CopyOnWriteArrayList<>()); - return alreadyMigrated; + migratedHasPermissionTypes.add(identifier.getTypeIdentifier()); } @Override public void checkMigration(Iterable allInstances) { Class clazz = Util.first(allInstances).getClass(); - List alreadyMigrated = getMigrationInfoForKey(allInstances); boolean allChecksSucessfull = true; for (HasPermissions shouldBeMigrated : allInstances) { - if (!alreadyMigrated.contains(shouldBeMigrated.getName())) { + if (!migratedHasPermissionTypes.contains(shouldBeMigrated.getName())) { logger.severe("Permission-Vertical Migration: Did not migrate all Types for " + clazz.getName() + " missing: " + shouldBeMigrated); allChecksSucessfull = false; @@ -1944,9 +1922,8 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat } @Override - public void assumeOwnershipMigrated(String typeName, Iterable permissions) { - final List alreadyMigrated = getMigrationInfoForKey(permissions); - alreadyMigrated.add(typeName); + public void assumeOwnershipMigrated(String typeName) { + migratedHasPermissionTypes.add(typeName); } @Override