/src/main/resources/com/onresolve/jira/groovy/canned/admin/ChangeSharedEntityOwnership.groovy
Groovy | 310 lines | 261 code | 40 blank | 9 comment | 38 complexity | 3ee33247faf5bb27c0427dd6cd418c32 MD5 | raw file
- package com.onresolve.jira.groovy.canned.admin
-
- import com.atlassian.jira.ComponentManager
- import com.atlassian.jira.bc.JiraServiceContext
- import com.atlassian.jira.bc.JiraServiceContextImpl
- import com.atlassian.jira.bc.portal.PortalPageService
- import com.atlassian.jira.favourites.FavouritesManager
- import com.atlassian.jira.issue.search.CachingSearchRequestStore
- import com.atlassian.jira.issue.search.SearchRequest
- import com.atlassian.jira.issue.search.SearchRequestManager
- import com.atlassian.jira.issue.search.SearchRequestStore
- import com.atlassian.jira.portal.CachingPortalPageStore
- import com.atlassian.jira.portal.PortalPage
- import com.atlassian.jira.portal.PortalPageManager
- import com.atlassian.jira.portal.PortletConfiguration
-
- import com.atlassian.jira.sharing.ShareManager
- import com.atlassian.jira.sharing.SharedEntity.SharePermissions
- import com.atlassian.jira.util.ErrorCollection
- import com.atlassian.jira.util.SimpleErrorCollection
- import com.onresolve.jira.groovy.canned.CannedScript
- import org.apache.log4j.Category
- import org.ofbiz.core.entity.DelegatorInterface
- import org.ofbiz.core.entity.GenericValue
- import com.atlassian.crowd.embedded.api.User
- import com.atlassian.jira.user.util.UserUtil
-
- class ChangeSharedEntityOwnership implements CannedScript{
-
- public static final String FIELD_FROM_USER_ID = 'FIELD_FROM_USER_ID'
- public static final String FIELD_TO_USER_ID = 'FIELD_TO_USER_ID'
- public static final String FIELD_DASHBOARD_IDS = 'FIELD_DASHBOARD_IDS'
- public static final String FIELD_FILTER_IDS = 'FIELD_FILTER_IDS'
-
- Category log = Category.getInstance(ChangeSharedEntityOwnership.class)
- ComponentManager componentManager = ComponentManager.getInstance()
- UserUtil userUtil = componentManager.getUserUtil()
- FavouritesManager favouritesManager = ComponentManager.getComponentInstanceOfType(FavouritesManager.class) as FavouritesManager
- SearchRequestStore searchRequestStore = ComponentManager.getComponentInstanceOfType(SearchRequestStore.class) as SearchRequestStore
-
- // doing this: "ComponentManager.getInstance().getContainer().getComponentInstanceOfType" is to work around
- // the fact that this now logs a stack trace as of 4.4, which is ugly and possibly slow to fill in
- // Posted on a.a.c but probably solution is not to use this interface at all
- CachingSearchRequestStore cachingSearchRequestStore = componentManager.getContainer().getComponentInstanceOfType(CachingSearchRequestStore.class) as CachingSearchRequestStore
- CachingPortalPageStore cachingPortalPageStore = componentManager.getContainer().getComponentInstanceOfType(CachingPortalPageStore.class) as CachingPortalPageStore
-
- ShareManager shareManager = ComponentManager.getComponentInstanceOfType(ShareManager.class) as ShareManager
- SearchRequestManager searchRequestManager = componentManager.getSearchRequestManager()
- def portalPageService = componentManager.getPortalPageService()
- def portalPageManager = componentManager.getPortalPageManager()
- DelegatorInterface gd = (DelegatorInterface) componentManager.getComponentInstanceOfType(DelegatorInterface.class)
-
- String getName() {
- "Change dashboard or filter ownership"
- }
-
- String getDescription() {
- """This will change the ownership of the selected dashboards/filters, and for dashboards any filters that they use"""
- }
-
- public String getHelpUrl() {
- "https://studio.plugins.atlassian.com/wiki/display/GRV/Built-In+Scripts#Built-InScripts-Changedashboardorfilterownership"
- }
-
- List getCategories() {
- ["ADMIN"]
- }
-
- List getParameters(Map params) {
- if ( !isFinalParamsPage(params) || doValidate(params, false).hasAnyErrors()) {
- getDefaultParameters()
- }
- else {
- [
- [
- Name: FIELD_DASHBOARD_IDS,
- Label: 'Dashboard IDs',
- Type: "multilist",
- Values: getDashboardsForUser(params[FIELD_FROM_USER_ID] as String),
- Description: "",
- ],
- [
- Name: FIELD_FILTER_IDS,
- Label: 'Filter IDs',
- Type: "multilist",
- Values: getSearchRequestsForUser(params[FIELD_FROM_USER_ID] as String),
- Description: "",
- ],
- ]
- }
- }
-
- List getDefaultParameters() {
- List<LinkedHashMap<String, String>> userParams = [
- [
- Name: FIELD_FROM_USER_ID,
- Label: 'From user ID',
- Description: "",
- ],
- [
- Name: FIELD_TO_USER_ID,
- Label: 'To user ID',
- Description: "",
- ],
- ]
- userParams
- }
-
- ErrorCollection doValidate(Map params, boolean forPreview) {
- ErrorCollection errorCollection = new SimpleErrorCollection()
- String sourceUserId = params[FIELD_FROM_USER_ID] as String
- String targetUserId = params[FIELD_TO_USER_ID] as String
-
- [FIELD_FROM_USER_ID, FIELD_TO_USER_ID].each {String p ->
- if (! params[p]) {
- errorCollection.addError(p, "Please provide the user ID")
- }
- else {
- if (! userUtil.getUser(params[p] as String)) {
- errorCollection.addError(p, "Cannot find user ID")
- }
- }
- }
-
- if (sourceUserId == targetUserId) {
- errorCollection.addErrorMessage("From and to user can't be the same")
- }
- // log.debug("errorCollection: $errorCollection")
-
- errorCollection
- }
-
- public Boolean isFinalParamsPage(Map params) {
- // log.debug("isFinalParamsPage: " + params.inspect())
- params[FIELD_FROM_USER_ID] && params[FIELD_TO_USER_ID]
- }
-
- private def chownSearchRequest(User sourceUser, Long srId, String targetUser) {
- SearchRequest searchRequest = searchRequestManager.getSharedEntity(srId)
-
- // todo: only defavourite if it's not visible to them in the new location
- if (favouritesManager.isFavourite(sourceUser, searchRequest)) {
- favouritesManager.removeFavourite(sourceUser, searchRequest)
- }
-
- if (!searchRequest) {
- log.warn("no search req")
- return
- }
-
- log.debug(searchRequest)
-
- GenericValue gv = gd.findByPrimaryKey("SearchRequest", ["id": searchRequest.getId()])
- log.debug gv
- gv.set('author', targetUser)
- gv.set('user', targetUser)
- gv.store()
-
- // cachingSearchRequestStore.delegateStore.removeFromCache(searchRequest.id) // 3.13
- cachingSearchRequestStore.removeFromCache(searchRequest.id)
- searchRequest = cachingSearchRequestStore.getSearchRequest(searchRequest.id)
- log.debug("from cache: " + searchRequest.getOwnerUserName())
-
- // test in j4
- favouritesManager.addFavourite(userUtil.getUser(targetUser), searchRequest)
- }
-
- Map doScript(Map params) {
- log.debug("doScript: $params")
- doScript(params, false)
- }
-
- Map getDashboardsForUser(String sourceUserId) {
- JiraServiceContext sourceUserServiceCtx = new JiraServiceContextImpl(userUtil.getUser(sourceUserId));
- Map rt = [:]
- portalPageManager.getAllOwnedPortalPages(getUserFromServiceCtx(sourceUserServiceCtx)).each {PortalPage pp ->
- rt.put(pp.id, pp.name)
- }
- rt
- }
-
- private User getUserFromServiceCtx(JiraServiceContext ctx) {
- ctx?.user ?: ctx?.loggedInUser
- }
-
- Map getSearchRequestsForUser(String sourceUserId) {
- Map rt = [:]
- searchRequestManager.getAllOwnedSearchRequests(userUtil.getUser(sourceUserId)).each {SearchRequest sr ->
- rt.put(sr.id, sr.name)
- }
-
- rt
- }
-
- Map doScript(Map params, boolean forPreview) {
-
- String sourceUserId = params[FIELD_FROM_USER_ID] as String
- String targetUserId = params[FIELD_TO_USER_ID] as String
- List dashBoardIds = getEntityIdsFromParams(params, FIELD_DASHBOARD_IDS)
- List filterIds = getEntityIdsFromParams(params, FIELD_FILTER_IDS)
- JiraServiceContext sourceUserServiceCtx = new JiraServiceContextImpl(userUtil.getUser(sourceUserId));
- JiraServiceContext targetUserServiceCtx = new JiraServiceContextImpl(userUtil.getUser(targetUserId));
- DelegatorInterface gd = (DelegatorInterface) componentManager.getComponentInstanceOfType(DelegatorInterface.class)
- StringBuffer output = new StringBuffer()
-
- log.debug("dashBoardIds: $dashBoardIds")
-
- if (!forPreview) {
- output << "<b>Completed</b><br>"
- }
-
- for (String dashId in dashBoardIds) {
- PortalPage origPortalPage = portalPageManager.getPortalPage(getUserFromServiceCtx(sourceUserServiceCtx), dashId as Long)
- if (! origPortalPage) {
- output << "Cannot find dashboard with ID $dashId... it's been removed or already changed ownership"
- continue
- }
- output << "Change ownership of dashboard ${origPortalPage.name} to $targetUserId\n"
- portalPageService.getPortletConfigurations(sourceUserServiceCtx, origPortalPage.id).each {
- it.each {PortletConfiguration pc ->
- Map<String, String> prefs = pc.getUserPrefs()
- String projOrFilter = prefs?.get('filterId') ?: prefs?.get('projectOrFilterId')
- if (projOrFilter) {
- if (projOrFilter.startsWith('filter-')) {
- Long filterId = projOrFilter.split('-')[1] as Long
- SearchRequest searchRequest = searchRequestManager.getSharedEntity(filterId)
- // todo remove any filter subscriptions
- if (searchRequest) {
- if (searchRequest.getOwnerUserName() == sourceUserId) {
- output << "\tChange ownership of filter \"${searchRequest.name}\" to $targetUserId\n"
- if (!forPreview) {
- chownSearchRequest(getUserFromServiceCtx(sourceUserServiceCtx), searchRequest.id, targetUserId)
- }
- }
- else if (searchRequest.getOwnerUserName() == targetUserId) {
- output << "\tFilter \"${searchRequest.name}\" already owned by $targetUserId, won't change\n"
- log.debug ("Filter already owned by the target, do nothing")
- }
- else {
- if (! shareManager.hasPermission(getUserFromServiceCtx(targetUserServiceCtx), searchRequest)) {
- output << "\tShare filter \"${searchRequest.name}\" globally as not visible to $targetUserId\n"
- if (!forPreview) {
- searchRequest.setPermissions(SharePermissions.GLOBAL)
- searchRequestManager.update(searchRequest)
- }
- }
- else {
- output << "\tFilter \"${searchRequest.name}\" already visible to $targetUserId, won't change\n"
- }
- }
- }
- else {
- log.warn ("Cannot find searchRequest for $filterId, maybe deleted")
- }
- }
- }
- }
- }
-
- if (!forPreview) {
- if (favouritesManager.isFavourite(getUserFromServiceCtx(sourceUserServiceCtx), origPortalPage)) {
- favouritesManager.removeFavourite(getUserFromServiceCtx(sourceUserServiceCtx), origPortalPage)
- }
- GenericValue gv = gd.findByPrimaryKey("PortalPage", ["id": origPortalPage.getId()])
- log.debug(gv)
- gv.setString("username", targetUserId)
- gv.store()
- cachingPortalPageStore.flush()
- PortalPage reloadedPortalPage = portalPageService.getPortalPage(targetUserServiceCtx, origPortalPage.id)
- if (reloadedPortalPage) {
- favouritesManager.addFavourite(getUserFromServiceCtx(targetUserServiceCtx), reloadedPortalPage)
- }
- else {
- log.warn("Some problem reloading origPortalPage")
- }
- }
- }
-
- for (String filterId in filterIds) {
- SearchRequest searchRequest = searchRequestManager.getSharedEntity(getUserFromServiceCtx(sourceUserServiceCtx), filterId as Long)
- if (! searchRequest) {
- output << "Cannot find filter with ID $filterId... it's been removed or already changed ownership\n"
- continue
- }
- output << "\tChange ownership of filter \"${searchRequest.name}\" to $targetUserId\n"
- if (!forPreview) {
- chownSearchRequest(getUserFromServiceCtx(sourceUserServiceCtx), searchRequest.id, targetUserId)
- }
- }
-
- return ["output":"<pre>" + output.toString() + "<pre>"]
- }
-
- private List getEntityIdsFromParams(Map params, String param) {
- List ids = []
- if (params[param] instanceof List) {
- ids = params[param] as List
- }
- else {
- if (params[param]) {
- ids.add(params[param])
- }
- }
- return ids
- }
-
- String getDescription(Map params, boolean forPreview) {
- doScript(params, true).get("output")
- }
- }