001package systems.dmx.accesscontrol.migrations; 002 003import systems.dmx.accesscontrol.AccessControlService; 004import systems.dmx.config.ConfigService; 005import systems.dmx.workspaces.WorkspacesService; 006 007import systems.dmx.core.Topic; 008import systems.dmx.core.service.Inject; 009import systems.dmx.core.service.Migration; 010 011import java.util.List; 012import java.util.logging.Logger; 013 014 015 016/** 017 * Creates the "Administration" workspace. 018 * Reassigns existing "Login enabled" and "Disk Quota" config topics to the "Administration" workspace. 019 * Creates "Enabled Sharing Modes" config topics for existing usernames. 020 * <p> 021 * Runs only in UPDATE mode. 022 * <p> 023 * Note: when CLEAN_INSTALLing DM 4.8 the "Administration" workspace is already created in migration 4, and the 024 * config topics are already assigned to the "Administration" workspace (as the Config service is already in charge 025 * when the "admin" user account is created, in migration 10). 026 * <p> 027 * The "Administration" workspace must exist before the "admin" user account is created (migration 10). 028 * <p> 029 * Part of DM 4.8 030 */ 031public class Migration12 extends Migration { 032 033 // ---------------------------------------------------------------------------------------------- Instance Variables 034 035 @Inject private AccessControlService acService; 036 @Inject private WorkspacesService wsService; 037 @Inject private ConfigService configService; 038 039 private long administrationWorkspaceId; 040 041 private Logger logger = Logger.getLogger(getClass().getName()); 042 043 // -------------------------------------------------------------------------------------------------- Public Methods 044 045 @Override 046 public void run() { 047 // 1) create "Administration" workspace (Note: there is a copy in migration 4) 048 Topic systemWorkspace = wsService.createWorkspace( 049 AccessControlService.ADMINISTRATION_WORKSPACE_NAME, 050 AccessControlService.ADMINISTRATION_WORKSPACE_URI, 051 AccessControlService.ADMINISTRATION_WORKSPACE_SHARING_MODE 052 ); 053 // Note: at migration running time our plugin listeners are not yet registered 054 // (furthermore there is no user logged in). So we set the owner manually here. 055 acService.setWorkspaceOwner(systemWorkspace, AccessControlService.ADMIN_USERNAME); 056 // Note: we don't set a particular creator/modifier here as we don't want suggest that the Administration 057 // workspace has been created by the "admin" user. Instead the creator/modifier of the Administration 058 // workspace remain undefined as the Administration workspace is actually created by the system itself. 059 // 060 // 2) reassign existing "Login enabled" and "Disk Quota" config topics 061 administrationWorkspaceId = dmx.getAccessControl().getAdministrationWorkspaceId(); 062 assignConfigTopics("dmx.accesscontrol.login_enabled"); 063 assignConfigTopics("dmx.files.disk_quota"); 064 // Note: the "Disk Quota" config topics are reassigned to the Administration workspace which is created 065 // only here. The "Disk Quota" config type belongs to the Files plugin and the reassignment is supposed 066 // to be performed by a Files migration. But the Files migrations run *before* the Access Control migrations 067 // (as the Access Control plugin depends indirectly on the Files plugin). 068 // 069 // 3) create "Enabled Sharing Modes" config topics 070 List<Topic> usernames = dmx.getTopicsByType("dmx.accesscontrol.username"); 071 logger.info("########## Creating config topics of type \"dmx.workspaces.enabled_sharing_modes\" for " + 072 usernames.size() + " usernames"); 073 for (Topic username : usernames) { 074 configService.createConfigTopic("dmx.workspaces.enabled_sharing_modes", username); 075 } 076 // Note: the "Enabled Sharing Modes" config topics are assigned to the Administration workspace which is 077 // created only here. The "Enabled Sharing Modes" config type belongs to the Workspaces plugin and the 078 // config topics are supposed to be created by a Workspaces migration. But the Workspaces migrations run 079 // *before* the Access Control migrations (as the Access Control plugin depends on the Workspaces plugin). 080 } 081 082 // ------------------------------------------------------------------------------------------------- Private Methods 083 084 private void assignConfigTopics(String configTypeUri) { 085 List<Topic> configTopics = dmx.getTopicsByType(configTypeUri); 086 logger.info("########## Reassigning " + configTopics.size() + " config topics of type \"" + configTypeUri + 087 "\" to workspace \"Administration\""); 088 for (Topic configTopic : configTopics) { 089 wsService.assignToWorkspace(configTopic, administrationWorkspaceId); 090 } 091 } 092}