Skip to content

Commit bfff157

Browse files
authored
CONCONDEC-14: Add macro parameters (#7)
* Rename macro so that the metadata is not lost (seems to be a macro bug) * Fill projects selection field dynamically * Enable to freeze imported data
1 parent 33eb650 commit bfff157

File tree

16 files changed

+195
-114
lines changed

16 files changed

+195
-114
lines changed

src/main/java/de/uhd/ifi/se/decision/management/confluence/macro/DecisionKnowledgeImportMacro.java

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import java.util.List;
44
import java.util.Map;
55

6-
import org.springframework.beans.factory.annotation.Autowired;
7-
86
import com.atlassian.confluence.content.render.xhtml.ConversionContext;
97
import com.atlassian.confluence.content.render.xhtml.storage.macro.MacroId;
108
import com.atlassian.confluence.macro.Macro;
@@ -13,33 +11,43 @@
1311
import com.atlassian.confluence.util.velocity.VelocityUtils;
1412
import com.atlassian.confluence.xhtml.api.MacroDefinition;
1513
import com.atlassian.fugue.Option;
16-
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
17-
import com.atlassian.webresource.api.assembler.PageBuilderService;
1814

1915
import de.uhd.ifi.se.decision.management.confluence.model.DecisionKnowledgeElement;
16+
import de.uhd.ifi.se.decision.management.confluence.oauth.JiraClient;
2017
import de.uhd.ifi.se.decision.management.confluence.persistence.KnowledgePersistenceManager;
2118

2219
public class DecisionKnowledgeImportMacro implements Macro {
2320

24-
private PageBuilderService pageBuilderService;
25-
26-
@Autowired
27-
public DecisionKnowledgeImportMacro(@ComponentImport PageBuilderService pageBuilderService) {
28-
this.pageBuilderService = pageBuilderService;
29-
}
30-
3121
@Override
3222
public String execute(Map<String, String> map, String s, ConversionContext conversionContext)
3323
throws MacroExecutionException {
34-
pageBuilderService.assembler().resources().requireWebResource(
35-
"de.uhd.ifi.se.decision.management.confluence.macro:decision-knowledge-import-resources");
3624
int pageId = Integer.parseInt(conversionContext.getEntity().getIdAsString());
3725
String macroId = getMacroId(conversionContext);
3826

39-
// Save all issues in an ArrayList data structure.
4027
List<DecisionKnowledgeElement> knowledgeElements = KnowledgePersistenceManager.getElements(pageId, macroId);
4128

42-
// Create a new context for rendering...
29+
boolean freeze = false;
30+
if ("true".equals(map.get("freeze"))) {
31+
freeze = true;
32+
}
33+
34+
if (knowledgeElements.isEmpty() || !freeze) {
35+
String projectKey = map.get("project");
36+
String query = map.get("query");
37+
if (query == null) {
38+
query = "";
39+
}
40+
if (projectKey != null && !projectKey.isEmpty()) {
41+
knowledgeElements = JiraClient.instance.getDecisionKnowledgeFromJira(query, projectKey);
42+
KnowledgePersistenceManager.removeDecisionKnowledgeElements(pageId, macroId);
43+
for (DecisionKnowledgeElement element : knowledgeElements) {
44+
element.setPageId(pageId);
45+
element.setMacroId(macroId);
46+
KnowledgePersistenceManager.addDecisionKnowledgeElement(element);
47+
}
48+
}
49+
}
50+
4351
Map<String, Object> renderContext = MacroUtils.defaultVelocityContext();
4452
renderContext.put("knowledgeElements", knowledgeElements);
4553

src/main/java/de/uhd/ifi/se/decision/management/confluence/model/DecisionKnowledgeElement.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.codehaus.jackson.map.ObjectMapper;
99
import org.codehaus.jackson.map.annotate.JsonDeserialize;
1010

11+
import com.google.gson.Gson;
12+
1113
import de.uhd.ifi.se.decision.management.confluence.model.impl.DecisionKnowledgeElementImpl;
1214

1315
/**
@@ -27,9 +29,10 @@ public static List<DecisionKnowledgeElement> parseJsonString(String jsonString)
2729
.constructCollectionType(List.class, DecisionKnowledgeElementImpl.class));
2830
} catch (JsonMappingException e) {
2931
try {
30-
List<DecisionKnowledgeElement[]> myelements = objectMapper.readValue(jsonString, objectMapper
31-
.getTypeFactory().constructCollectionType(List.class, DecisionKnowledgeElementImpl[].class));
32-
elements = Arrays.asList(myelements.get(0));
32+
Gson g = new Gson();
33+
DecisionKnowledgeElementImpl[] myelements = g.fromJson(jsonString.substring(1, jsonString.length() - 1),
34+
DecisionKnowledgeElementImpl[].class);
35+
elements = Arrays.asList(myelements);
3336
} catch (Exception e1) {
3437
e1.printStackTrace();
3538
}

src/main/java/de/uhd/ifi/se/decision/management/confluence/oauth/JiraClient.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import java.net.URLEncoder;
55
import java.util.Iterator;
66
import java.util.LinkedHashSet;
7+
import java.util.List;
78
import java.util.Locale;
89
import java.util.Set;
910

11+
import de.uhd.ifi.se.decision.management.confluence.model.DecisionKnowledgeElement;
1012
import de.uhd.ifi.se.decision.management.confluence.oauth.impl.JiraClientImpl;
1113

1214
/**
@@ -40,9 +42,9 @@ public interface JiraClient {
4042
*
4143
* @param jiraIssueKeys
4244
* as a set of strings.
43-
* @return JSON string.
45+
* @return list of decision knowledge elements.
4446
*/
45-
String getDecisionKnowledgeFromJira(Set<String> jiraIssueKeys);
47+
List<DecisionKnowledgeElement> getDecisionKnowledgeFromJira(Set<String> jiraIssueKeys);
4648

4749
/**
4850
* Retrieves the decision knowledge elements from Jira that match a certain
@@ -52,9 +54,9 @@ public interface JiraClient {
5254
* JQL query.
5355
* @param projectKey
5456
* of the Jira project.
55-
* @return JSON String.
57+
* @return list of decision knowledge elements.
5658
*/
57-
String getDecisionKnowledgeFromJira(String query, String projectKey);
59+
List<DecisionKnowledgeElement> getDecisionKnowledgeFromJira(String query, String projectKey);
5860

5961
/**
6062
* Returns all Jira issue keys mentioned in a message.

src/main/java/de/uhd/ifi/se/decision/management/confluence/oauth/impl/JiraClientImpl.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.uhd.ifi.se.decision.management.confluence.oauth.impl;
22

33
import java.util.HashSet;
4+
import java.util.List;
45
import java.util.Set;
56

67
import org.json.JSONArray;
@@ -18,6 +19,7 @@
1819
import com.atlassian.sal.api.net.Response;
1920
import com.atlassian.sal.api.net.ResponseException;
2021

22+
import de.uhd.ifi.se.decision.management.confluence.model.DecisionKnowledgeElement;
2123
import de.uhd.ifi.se.decision.management.confluence.oauth.JiraClient;
2224

2325
/**
@@ -93,16 +95,21 @@ public String handle(final Response response) throws ResponseException {
9395
}
9496

9597
@Override
96-
public String getDecisionKnowledgeFromJira(Set<String> jiraIssueKeys) {
98+
public List<DecisionKnowledgeElement> getDecisionKnowledgeFromJira(Set<String> jiraIssueKeys) {
9799
String queryWithJiraIssues = JiraClient.getJiraCallQuery(jiraIssueKeys);
98100
String projectKey = JiraClient.retrieveProjectKey(jiraIssueKeys);
99101
return getDecisionKnowledgeFromJira(queryWithJiraIssues, projectKey);
100102
}
101103

102104
@Override
103-
public String getDecisionKnowledgeFromJira(String query, String projectKey) {
105+
public List<DecisionKnowledgeElement> getDecisionKnowledgeFromJira(String query, String projectKey) {
106+
String jsonString = getDecisionKnowledgeFromJiraAsJsonString(query, projectKey);
107+
return DecisionKnowledgeElement.parseJsonString(jsonString);
108+
}
109+
110+
private String getDecisionKnowledgeFromJiraAsJsonString(String query, String projectKey) {
104111
return getResponseFromJiraWithApplicationLink(
105-
"rest/decisions/latest/decisions/getElements.json?allTrees=true&query=" + query + "&projectKey="
112+
"rest/decisions/latest/decisions/getElements.json?allTrees=false&query=" + query + "&projectKey="
106113
+ projectKey);
107114
}
108115
}

src/main/java/de/uhd/ifi/se/decision/management/confluence/persistence/KnowledgePersistenceManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public static void removeDecisionKnowledgeElement(String id) {
4141

4242
public static List<DecisionKnowledgeElement> getElements(int pageId, String macroId) {
4343
List<DecisionKnowledgeElement> elements = new ArrayList<DecisionKnowledgeElement>();
44+
if (pageId == 0 || macroId == null) {
45+
return elements;
46+
}
4447

4548
for (String id : bandanaManager.getKeys(bandanaContext)) {
4649
DecisionKnowledgeElement decisionKnowledgeElement = (DecisionKnowledgeElement) bandanaManager

src/main/java/de/uhd/ifi/se/decision/management/confluence/rest/impl/KnowledgeRestImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,9 @@ public Response getStoredKnowledgeElements(@QueryParam("pageId") int pageId,
8989
public Response getKnowledgeElementsFromJira(@QueryParam("projectKey") String projectKey,
9090
@QueryParam("query") String query) {
9191
try {
92-
String jsonString = JiraClient.instance.getDecisionKnowledgeFromJira(query, projectKey);
93-
return Response.status(Response.Status.OK).entity(jsonString).build();
92+
List<DecisionKnowledgeElement> elements = JiraClient.instance.getDecisionKnowledgeFromJira(query,
93+
projectKey);
94+
return Response.status(Response.Status.OK).entity(elements).build();
9495
} catch (Exception e) {
9596
return Response.serverError().build();
9697
}

src/main/resources/atlassian-plugin.xml

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,30 @@
2121
(e.g. for meetings).
2222
</description>
2323
<context>editor</context>
24+
<context>atl.general</context>
2425
<context>Decision Knowledge Import Macro</context>
2526
<resource type="download" name="condec.css" location="/css/condec.css" />
26-
<resource type="download" name="condec.knowledge.import.js" location="/js/condec.knowledge.import.js" />
27+
<resource type="download" name="condec.knowledge.import.js"
28+
location="/js/condec.knowledge.import.js" />
2729
<resource type="download" name="condec.api.js" location="/js/condec.api.js" />
2830
<resource type="download" name="images/" location="/images" />
2931
<resource type="download" name="pluginIconBig.png" location="/images/pluginIconBig.png" />
3032
<dependency>com.atlassian.auiplugin:ajs</dependency>
33+
<dependency>com.atlassian.auiplugin:aui-flag</dependency>
34+
<dependency>com.atlassian.auiplugin:aui-buttons</dependency>
35+
<dependency>com.atlassian.auiplugin:aui-forms</dependency>
36+
<dependency>com.atlassian.auiplugin:aui-navigation</dependency>
37+
<dependency>com.atlassian.auiplugin:aui-toggle</dependency>
38+
<dependency>com.atlassian.auiplugin:table</dependency>
39+
<dependency>com.atlassian.auiplugin:aui-lozenge</dependency>
40+
<dependency>com.atlassian.auiplugin:dialog2</dependency>
41+
<dependency>com.atlassian.auiplugin:aui-dropdown2</dependency>
42+
<dependency>com.atlassian.auiplugin:aui-select2</dependency>
43+
<dependency>com.atlassian.auiplugin:aui-experimental-iconfont</dependency>
44+
<dependency>com.atlassian.auiplugin:aui-tooltips</dependency>
45+
<dependency>com.atlassian.auiplugin:tabs</dependency>
46+
<dependency>com.atlassian.auiplugin:aui-expander</dependency>
47+
<dependency>com.atlassian.auiplugin:aui-table-sortable</dependency>
3148
</web-resource>
3249

3350
<!-- REST API -->
@@ -37,18 +54,22 @@
3754
</rest>
3855

3956
<!-- Decision Knowledge Import in Wiki Pages -->
40-
<xhtml-macro name="Decision Knowledge Import" key="decision-knowledge-import-macro"
57+
<xhtml-macro name="decision-knowledge-import-macro"
58+
key="decision-knowledge-import-macro"
4159
class="de.uhd.ifi.se.decision.management.confluence.macro.DecisionKnowledgeImportMacro"
4260
icon="/download/resources/de.uhd.ifi.se.decision.management.confluence:decision-knowledge-import-resources/pluginIconBig.png">
4361
<description key="condec.import.macro.description" />
4462
<category name="external-content" />
4563
<parameters>
46-
<!--<parameter name="yourJsonArray" type="string" /> -->
64+
<parameter name="query" type="string" desc="filter=allopenissues" />
65+
<parameter name="project" type="enum" />
66+
<parameter name="freeze" type="boolean" default="false" required="true"
67+
title="Freeze the content?" />
4768
</parameters>
4869
<property-panel>
49-
<spacer />
50-
<button id="updateButton" label="Update Stand-up Table" />
51-
<spacer />
70+
<button id="updateButton" label="Edit Manually">
71+
<label key="condec.import.macro.update.button" />
72+
</button>
5273
</property-panel>
5374
</xhtml-macro>
5475

src/main/resources/i18n/condec.properties

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,8 @@ condec.report.label = Decision Knowledge Report
1313
condec.report.description = Generates statistics about decision knowledge in the project.
1414
condec.report.project.description = Please select a project to display the report for.
1515
condec.report.issuetype.description = Please select the JIRA issue type you want to see decision knowledge linked to.
16-
17-
condec.import.macro.description=After inserting the macro to the confluence site the first time, you have to save the site and then you can click on the macro to edit your queries
18-
de.uhd.ifi.se.decision.management.confluence.issue-import-macro.param.yourJsonArray.label=Your Issues:
19-
de.uhd.ifi.se.decision.management.confluence.issue-import-macro.param.yourJsonArray.desc=Copy your Json Array here
20-
21-
#
22-
# Dashboard item with feature branch reports
23-
condec.dashboard.featurebranch.title = RatDocQuality of branches
24-
condec.dashboard.featurebranch.description = Rationale documentation quality status of feature task branches.
25-
condec.dashboard.featurebranch.project.data.error = Fetching the project data resulted in an error. Is the project configured to use git for ConDec plug-in?
26-
condec.dashboard.featurebranch.project.selection.description = Please select a project you would like to see reports for.
27-
condec.dashboard.featurebranch.project.selection.pickone = pick a project
28-
condec.dashboard.featurebranch.project.selection.not.done = Nothing to show yet.
29-
condec.dashboard.featurebranch.project.processing = Please wait, processing ...
30-
condec.dashboard.featurebranch.project.nogit = The ConDec plugin is not configured to extract rationale from git for this project.
31-
16+
condec.import.macro.description = Imports decision knowledge from Jira, if an application link exists.
17+
condec.import.macro.update.button = Edit Manually
3218
#
3319
# Decision Knowledge Elements
3420
condec.issue = Issue

src/main/resources/i18n/condec_de_DE.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ condec.report.label = Bericht zu Dokumentation von Entscheidungswissen
1313
condec.report.description = Erzeugt eine statistische \u00dcbersicht zu Entscheidungswissen in einem JIRA Projekt.
1414
condec.report.project.description = Bitte w\u00e4hlen Sie ein Projekt, f\u00fcr das die statistische \u00dcbersicht erzeugt werden soll.
1515
condec.report.issuetype.description = Bitte w\u00e4hlen Sie den JIRA Issue Typen, f\u00fcr den die statistische \u00dcbersicht erzeugt werden soll
16+
condec.import.macro.description = Importiert Entscheidungswissen aus Jira, wenn ein Anwendungslink existiert.
17+
condec.import.macro.update.button = Manuelle Bearbeitung
1618
#
1719
# Decision Knowledge Elements
1820
condec.issue = Entscheidungsproblem

src/main/resources/js/condec.api.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@
133133
body : message
134134
});
135135
}
136+
137+
/*
138+
* external references: condec.knowledge.import
139+
*/
140+
ConDecAPI.prototype.showFlag = showFlag;
136141

137142
// export ConDecAPI
138143
global.conDecAPI = new ConDecAPI();

0 commit comments

Comments
 (0)