PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/resources/com/onresolve/jira/groovy/canned/admin/ChangeSharedEntityOwnership.groovy

https://bitbucket.org/sorin/jira-plugin-intellij
Groovy | 310 lines | 261 code | 40 blank | 9 comment | 38 complexity | 3ee33247faf5bb27c0427dd6cd418c32 MD5 | raw file
  1. package com.onresolve.jira.groovy.canned.admin
  2. import com.atlassian.jira.ComponentManager
  3. import com.atlassian.jira.bc.JiraServiceContext
  4. import com.atlassian.jira.bc.JiraServiceContextImpl
  5. import com.atlassian.jira.bc.portal.PortalPageService
  6. import com.atlassian.jira.favourites.FavouritesManager
  7. import com.atlassian.jira.issue.search.CachingSearchRequestStore
  8. import com.atlassian.jira.issue.search.SearchRequest
  9. import com.atlassian.jira.issue.search.SearchRequestManager
  10. import com.atlassian.jira.issue.search.SearchRequestStore
  11. import com.atlassian.jira.portal.CachingPortalPageStore
  12. import com.atlassian.jira.portal.PortalPage
  13. import com.atlassian.jira.portal.PortalPageManager
  14. import com.atlassian.jira.portal.PortletConfiguration
  15. import com.atlassian.jira.sharing.ShareManager
  16. import com.atlassian.jira.sharing.SharedEntity.SharePermissions
  17. import com.atlassian.jira.util.ErrorCollection
  18. import com.atlassian.jira.util.SimpleErrorCollection
  19. import com.onresolve.jira.groovy.canned.CannedScript
  20. import org.apache.log4j.Category
  21. import org.ofbiz.core.entity.DelegatorInterface
  22. import org.ofbiz.core.entity.GenericValue
  23. import com.atlassian.crowd.embedded.api.User
  24. import com.atlassian.jira.user.util.UserUtil
  25. class ChangeSharedEntityOwnership implements CannedScript{
  26. public static final String FIELD_FROM_USER_ID = 'FIELD_FROM_USER_ID'
  27. public static final String FIELD_TO_USER_ID = 'FIELD_TO_USER_ID'
  28. public static final String FIELD_DASHBOARD_IDS = 'FIELD_DASHBOARD_IDS'
  29. public static final String FIELD_FILTER_IDS = 'FIELD_FILTER_IDS'
  30. Category log = Category.getInstance(ChangeSharedEntityOwnership.class)
  31. ComponentManager componentManager = ComponentManager.getInstance()
  32. UserUtil userUtil = componentManager.getUserUtil()
  33. FavouritesManager favouritesManager = ComponentManager.getComponentInstanceOfType(FavouritesManager.class) as FavouritesManager
  34. SearchRequestStore searchRequestStore = ComponentManager.getComponentInstanceOfType(SearchRequestStore.class) as SearchRequestStore
  35. // doing this: "ComponentManager.getInstance().getContainer().getComponentInstanceOfType" is to work around
  36. // the fact that this now logs a stack trace as of 4.4, which is ugly and possibly slow to fill in
  37. // Posted on a.a.c but probably solution is not to use this interface at all
  38. CachingSearchRequestStore cachingSearchRequestStore = componentManager.getContainer().getComponentInstanceOfType(CachingSearchRequestStore.class) as CachingSearchRequestStore
  39. CachingPortalPageStore cachingPortalPageStore = componentManager.getContainer().getComponentInstanceOfType(CachingPortalPageStore.class) as CachingPortalPageStore
  40. ShareManager shareManager = ComponentManager.getComponentInstanceOfType(ShareManager.class) as ShareManager
  41. SearchRequestManager searchRequestManager = componentManager.getSearchRequestManager()
  42. def portalPageService = componentManager.getPortalPageService()
  43. def portalPageManager = componentManager.getPortalPageManager()
  44. DelegatorInterface gd = (DelegatorInterface) componentManager.getComponentInstanceOfType(DelegatorInterface.class)
  45. String getName() {
  46. "Change dashboard or filter ownership"
  47. }
  48. String getDescription() {
  49. """This will change the ownership of the selected dashboards/filters, and for dashboards any filters that they use"""
  50. }
  51. public String getHelpUrl() {
  52. "https://studio.plugins.atlassian.com/wiki/display/GRV/Built-In+Scripts#Built-InScripts-Changedashboardorfilterownership"
  53. }
  54. List getCategories() {
  55. ["ADMIN"]
  56. }
  57. List getParameters(Map params) {
  58. if ( !isFinalParamsPage(params) || doValidate(params, false).hasAnyErrors()) {
  59. getDefaultParameters()
  60. }
  61. else {
  62. [
  63. [
  64. Name: FIELD_DASHBOARD_IDS,
  65. Label: 'Dashboard IDs',
  66. Type: "multilist",
  67. Values: getDashboardsForUser(params[FIELD_FROM_USER_ID] as String),
  68. Description: "",
  69. ],
  70. [
  71. Name: FIELD_FILTER_IDS,
  72. Label: 'Filter IDs',
  73. Type: "multilist",
  74. Values: getSearchRequestsForUser(params[FIELD_FROM_USER_ID] as String),
  75. Description: "",
  76. ],
  77. ]
  78. }
  79. }
  80. List getDefaultParameters() {
  81. List<LinkedHashMap<String, String>> userParams = [
  82. [
  83. Name: FIELD_FROM_USER_ID,
  84. Label: 'From user ID',
  85. Description: "",
  86. ],
  87. [
  88. Name: FIELD_TO_USER_ID,
  89. Label: 'To user ID',
  90. Description: "",
  91. ],
  92. ]
  93. userParams
  94. }
  95. ErrorCollection doValidate(Map params, boolean forPreview) {
  96. ErrorCollection errorCollection = new SimpleErrorCollection()
  97. String sourceUserId = params[FIELD_FROM_USER_ID] as String
  98. String targetUserId = params[FIELD_TO_USER_ID] as String
  99. [FIELD_FROM_USER_ID, FIELD_TO_USER_ID].each {String p ->
  100. if (! params[p]) {
  101. errorCollection.addError(p, "Please provide the user ID")
  102. }
  103. else {
  104. if (! userUtil.getUser(params[p] as String)) {
  105. errorCollection.addError(p, "Cannot find user ID")
  106. }
  107. }
  108. }
  109. if (sourceUserId == targetUserId) {
  110. errorCollection.addErrorMessage("From and to user can't be the same")
  111. }
  112. // log.debug("errorCollection: $errorCollection")
  113. errorCollection
  114. }
  115. public Boolean isFinalParamsPage(Map params) {
  116. // log.debug("isFinalParamsPage: " + params.inspect())
  117. params[FIELD_FROM_USER_ID] && params[FIELD_TO_USER_ID]
  118. }
  119. private def chownSearchRequest(User sourceUser, Long srId, String targetUser) {
  120. SearchRequest searchRequest = searchRequestManager.getSharedEntity(srId)
  121. // todo: only defavourite if it's not visible to them in the new location
  122. if (favouritesManager.isFavourite(sourceUser, searchRequest)) {
  123. favouritesManager.removeFavourite(sourceUser, searchRequest)
  124. }
  125. if (!searchRequest) {
  126. log.warn("no search req")
  127. return
  128. }
  129. log.debug(searchRequest)
  130. GenericValue gv = gd.findByPrimaryKey("SearchRequest", ["id": searchRequest.getId()])
  131. log.debug gv
  132. gv.set('author', targetUser)
  133. gv.set('user', targetUser)
  134. gv.store()
  135. // cachingSearchRequestStore.delegateStore.removeFromCache(searchRequest.id) // 3.13
  136. cachingSearchRequestStore.removeFromCache(searchRequest.id)
  137. searchRequest = cachingSearchRequestStore.getSearchRequest(searchRequest.id)
  138. log.debug("from cache: " + searchRequest.getOwnerUserName())
  139. // test in j4
  140. favouritesManager.addFavourite(userUtil.getUser(targetUser), searchRequest)
  141. }
  142. Map doScript(Map params) {
  143. log.debug("doScript: $params")
  144. doScript(params, false)
  145. }
  146. Map getDashboardsForUser(String sourceUserId) {
  147. JiraServiceContext sourceUserServiceCtx = new JiraServiceContextImpl(userUtil.getUser(sourceUserId));
  148. Map rt = [:]
  149. portalPageManager.getAllOwnedPortalPages(getUserFromServiceCtx(sourceUserServiceCtx)).each {PortalPage pp ->
  150. rt.put(pp.id, pp.name)
  151. }
  152. rt
  153. }
  154. private User getUserFromServiceCtx(JiraServiceContext ctx) {
  155. ctx?.user ?: ctx?.loggedInUser
  156. }
  157. Map getSearchRequestsForUser(String sourceUserId) {
  158. Map rt = [:]
  159. searchRequestManager.getAllOwnedSearchRequests(userUtil.getUser(sourceUserId)).each {SearchRequest sr ->
  160. rt.put(sr.id, sr.name)
  161. }
  162. rt
  163. }
  164. Map doScript(Map params, boolean forPreview) {
  165. String sourceUserId = params[FIELD_FROM_USER_ID] as String
  166. String targetUserId = params[FIELD_TO_USER_ID] as String
  167. List dashBoardIds = getEntityIdsFromParams(params, FIELD_DASHBOARD_IDS)
  168. List filterIds = getEntityIdsFromParams(params, FIELD_FILTER_IDS)
  169. JiraServiceContext sourceUserServiceCtx = new JiraServiceContextImpl(userUtil.getUser(sourceUserId));
  170. JiraServiceContext targetUserServiceCtx = new JiraServiceContextImpl(userUtil.getUser(targetUserId));
  171. DelegatorInterface gd = (DelegatorInterface) componentManager.getComponentInstanceOfType(DelegatorInterface.class)
  172. StringBuffer output = new StringBuffer()
  173. log.debug("dashBoardIds: $dashBoardIds")
  174. if (!forPreview) {
  175. output << "<b>Completed</b><br>"
  176. }
  177. for (String dashId in dashBoardIds) {
  178. PortalPage origPortalPage = portalPageManager.getPortalPage(getUserFromServiceCtx(sourceUserServiceCtx), dashId as Long)
  179. if (! origPortalPage) {
  180. output << "Cannot find dashboard with ID $dashId... it's been removed or already changed ownership"
  181. continue
  182. }
  183. output << "Change ownership of dashboard ${origPortalPage.name} to $targetUserId\n"
  184. portalPageService.getPortletConfigurations(sourceUserServiceCtx, origPortalPage.id).each {
  185. it.each {PortletConfiguration pc ->
  186. Map<String, String> prefs = pc.getUserPrefs()
  187. String projOrFilter = prefs?.get('filterId') ?: prefs?.get('projectOrFilterId')
  188. if (projOrFilter) {
  189. if (projOrFilter.startsWith('filter-')) {
  190. Long filterId = projOrFilter.split('-')[1] as Long
  191. SearchRequest searchRequest = searchRequestManager.getSharedEntity(filterId)
  192. // todo remove any filter subscriptions
  193. if (searchRequest) {
  194. if (searchRequest.getOwnerUserName() == sourceUserId) {
  195. output << "\tChange ownership of filter \"${searchRequest.name}\" to $targetUserId\n"
  196. if (!forPreview) {
  197. chownSearchRequest(getUserFromServiceCtx(sourceUserServiceCtx), searchRequest.id, targetUserId)
  198. }
  199. }
  200. else if (searchRequest.getOwnerUserName() == targetUserId) {
  201. output << "\tFilter \"${searchRequest.name}\" already owned by $targetUserId, won't change\n"
  202. log.debug ("Filter already owned by the target, do nothing")
  203. }
  204. else {
  205. if (! shareManager.hasPermission(getUserFromServiceCtx(targetUserServiceCtx), searchRequest)) {
  206. output << "\tShare filter \"${searchRequest.name}\" globally as not visible to $targetUserId\n"
  207. if (!forPreview) {
  208. searchRequest.setPermissions(SharePermissions.GLOBAL)
  209. searchRequestManager.update(searchRequest)
  210. }
  211. }
  212. else {
  213. output << "\tFilter \"${searchRequest.name}\" already visible to $targetUserId, won't change\n"
  214. }
  215. }
  216. }
  217. else {
  218. log.warn ("Cannot find searchRequest for $filterId, maybe deleted")
  219. }
  220. }
  221. }
  222. }
  223. }
  224. if (!forPreview) {
  225. if (favouritesManager.isFavourite(getUserFromServiceCtx(sourceUserServiceCtx), origPortalPage)) {
  226. favouritesManager.removeFavourite(getUserFromServiceCtx(sourceUserServiceCtx), origPortalPage)
  227. }
  228. GenericValue gv = gd.findByPrimaryKey("PortalPage", ["id": origPortalPage.getId()])
  229. log.debug(gv)
  230. gv.setString("username", targetUserId)
  231. gv.store()
  232. cachingPortalPageStore.flush()
  233. PortalPage reloadedPortalPage = portalPageService.getPortalPage(targetUserServiceCtx, origPortalPage.id)
  234. if (reloadedPortalPage) {
  235. favouritesManager.addFavourite(getUserFromServiceCtx(targetUserServiceCtx), reloadedPortalPage)
  236. }
  237. else {
  238. log.warn("Some problem reloading origPortalPage")
  239. }
  240. }
  241. }
  242. for (String filterId in filterIds) {
  243. SearchRequest searchRequest = searchRequestManager.getSharedEntity(getUserFromServiceCtx(sourceUserServiceCtx), filterId as Long)
  244. if (! searchRequest) {
  245. output << "Cannot find filter with ID $filterId... it's been removed or already changed ownership\n"
  246. continue
  247. }
  248. output << "\tChange ownership of filter \"${searchRequest.name}\" to $targetUserId\n"
  249. if (!forPreview) {
  250. chownSearchRequest(getUserFromServiceCtx(sourceUserServiceCtx), searchRequest.id, targetUserId)
  251. }
  252. }
  253. return ["output":"<pre>" + output.toString() + "<pre>"]
  254. }
  255. private List getEntityIdsFromParams(Map params, String param) {
  256. List ids = []
  257. if (params[param] instanceof List) {
  258. ids = params[param] as List
  259. }
  260. else {
  261. if (params[param]) {
  262. ids.add(params[param])
  263. }
  264. }
  265. return ids
  266. }
  267. String getDescription(Map params, boolean forPreview) {
  268. doScript(params, true).get("output")
  269. }
  270. }