Skip to content

Commit 33eb650

Browse files
authored
CONCONDEC: Simplify JSON to object mapping (#6)
* Replace ContainerManager.autowireComponent(this) with Spring annotations and dependency injection * Test KnowledgePersistenceManager
1 parent 3c4d794 commit 33eb650

20 files changed

+362
-384
lines changed

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package de.uhd.ifi.se.decision.management.confluence.macro;
22

3-
import java.util.ArrayList;
43
import java.util.List;
54
import java.util.Map;
6-
import java.util.Optional;
75

86
import org.springframework.beans.factory.annotation.Autowired;
97

@@ -14,12 +12,12 @@
1412
import com.atlassian.confluence.renderer.radeox.macros.MacroUtils;
1513
import com.atlassian.confluence.util.velocity.VelocityUtils;
1614
import com.atlassian.confluence.xhtml.api.MacroDefinition;
15+
import com.atlassian.fugue.Option;
1716
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
1817
import com.atlassian.webresource.api.assembler.PageBuilderService;
1918

2019
import de.uhd.ifi.se.decision.management.confluence.model.DecisionKnowledgeElement;
2120
import de.uhd.ifi.se.decision.management.confluence.persistence.KnowledgePersistenceManager;
22-
import de.uhd.ifi.se.decision.management.confluence.persistence.impl.KnowledgePersistenceManagerImpl;
2321

2422
public class DecisionKnowledgeImportMacro implements Macro {
2523

@@ -39,13 +37,11 @@ public String execute(Map<String, String> map, String s, ConversionContext conve
3937
String macroId = getMacroId(conversionContext);
4038

4139
// Save all issues in an ArrayList data structure.
42-
KnowledgePersistenceManager persistenceManager = KnowledgePersistenceManagerImpl.getInstance();
43-
List<ArrayList<DecisionKnowledgeElement>> jsonIssueArray = persistenceManager
44-
.getElementsGroupedFromPageIdAndMacroId(pageId, macroId);
40+
List<DecisionKnowledgeElement> knowledgeElements = KnowledgePersistenceManager.getElements(pageId, macroId);
4541

4642
// Create a new context for rendering...
4743
Map<String, Object> renderContext = MacroUtils.defaultVelocityContext();
48-
renderContext.put("jsonArrays", jsonIssueArray);
44+
renderContext.put("knowledgeElements", knowledgeElements);
4945

5046
return VelocityUtils.getRenderedTemplate("/templates/standUpTable.vm", renderContext);
5147
}
@@ -54,8 +50,9 @@ private String getMacroId(ConversionContext conversionContext) {
5450
String macroId = "0";
5551
try {
5652
MacroDefinition macroDefinition = (MacroDefinition) conversionContext.getProperty("macroDefinition");
57-
Optional<MacroId> option = macroDefinition.getMacroIdentifier();
53+
Option<MacroId> option = macroDefinition.getMacroId();
5854
macroId = option.get().getId();
55+
System.out.println(macroId);
5956
} catch (Exception e) {
6057
}
6158
return macroId;

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package de.uhd.ifi.se.decision.management.confluence.model;
22

3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
import org.codehaus.jackson.map.JsonMappingException;
8+
import org.codehaus.jackson.map.ObjectMapper;
39
import org.codehaus.jackson.map.annotate.JsonDeserialize;
410

511
import de.uhd.ifi.se.decision.management.confluence.model.impl.DecisionKnowledgeElementImpl;
@@ -10,6 +16,30 @@
1016
@JsonDeserialize(as = DecisionKnowledgeElementImpl.class)
1117
public interface DecisionKnowledgeElement {
1218

19+
public static List<DecisionKnowledgeElement> parseJsonString(String jsonString) {
20+
ObjectMapper objectMapper = new ObjectMapper();
21+
objectMapper.writerWithDefaultPrettyPrinter();
22+
23+
List<DecisionKnowledgeElement> elements = new ArrayList<DecisionKnowledgeElement>();
24+
25+
try {
26+
elements = objectMapper.readValue(jsonString, objectMapper.getTypeFactory()
27+
.constructCollectionType(List.class, DecisionKnowledgeElementImpl.class));
28+
} catch (JsonMappingException e) {
29+
try {
30+
List<DecisionKnowledgeElement[]> myelements = objectMapper.readValue(jsonString, objectMapper
31+
.getTypeFactory().constructCollectionType(List.class, DecisionKnowledgeElementImpl[].class));
32+
elements = Arrays.asList(myelements.get(0));
33+
} catch (Exception e1) {
34+
e1.printStackTrace();
35+
}
36+
} catch (Exception e) {
37+
e.printStackTrace();
38+
}
39+
40+
return elements;
41+
}
42+
1343
int getPageId();
1444

1545
void setPageId(int pageId);
@@ -38,10 +68,6 @@ public interface DecisionKnowledgeElement {
3868

3969
void setMacroId(String macroId);
4070

41-
int getGroup();
42-
43-
void setGroup(Integer group);
44-
4571
String getDescription();
4672

4773
void setDescription(String description);

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

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
import javax.xml.bind.annotation.XmlElement;
99
import javax.xml.bind.annotation.XmlRootElement;
1010

11+
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
12+
import org.codehaus.jackson.annotate.JsonProperty;
13+
1114
import de.uhd.ifi.se.decision.management.confluence.model.DecisionKnowledgeElement;
1215

1316
@XmlRootElement
1417
@XmlAccessorType(XmlAccessType.FIELD)
18+
@JsonIgnoreProperties(ignoreUnknown = true)
1519
public class DecisionKnowledgeElementImpl implements DecisionKnowledgeElement {
1620

1721
@XmlElement
@@ -29,19 +33,16 @@ public class DecisionKnowledgeElementImpl implements DecisionKnowledgeElement {
2933
@XmlElement
3034
private String macroId;
3135
@XmlElement
32-
private Integer group;
33-
@XmlElement
3436
private String description;
3537

3638
public DecisionKnowledgeElementImpl(String link, int pageId, String summary, String type, String key,
37-
String description, Integer group, String macroId) {
39+
String description, String macroId) {
3840
this.pageId = pageId;
3941
this.summary = summary;
4042
this.type = type;
4143
this.key = key;
4244
this.link = link;
4345
this.description = description;
44-
this.group = group;
4546
this.macroId = macroId;
4647

4748
// generate unique id
@@ -114,6 +115,11 @@ public void setLink(String link) {
114115
this.link = link;
115116
}
116117

118+
@JsonProperty("url")
119+
public void setUrl(String link) {
120+
this.setLink(link);
121+
}
122+
117123
@Override
118124
public String getMacroId() {
119125
return macroId;
@@ -124,16 +130,6 @@ public void setMacroId(String macroId) {
124130
this.macroId = macroId;
125131
}
126132

127-
@Override
128-
public int getGroup() {
129-
return this.group;
130-
}
131-
132-
@Override
133-
public void setGroup(Integer group) {
134-
this.group = group;
135-
}
136-
137133
@Override
138134
public String getDescription() {
139135
return description;

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

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,83 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6+
import javax.inject.Inject;
7+
import javax.inject.Named;
8+
9+
import com.atlassian.bandana.BandanaContext;
610
import com.atlassian.bandana.BandanaManager;
11+
import com.atlassian.confluence.setup.bandana.ConfluenceBandanaContext;
12+
import com.atlassian.plugin.spring.scanner.annotation.imports.ConfluenceImport;
713

814
import de.uhd.ifi.se.decision.management.confluence.model.DecisionKnowledgeElement;
915

10-
/**
11-
* Interface to store the knowledge imported from Jira.
16+
/*
17+
* @issue How to store the knowledge in Confluence?
18+
* @decision Use the Confluence BandanaManager for persistent storage!
19+
* See http://docs.atlassian.com/atlassian-bandana/0.2.0/com/atlassian/bandana/BandanaManager.html
1220
*/
13-
public interface KnowledgePersistenceManager {
21+
@Named
22+
public class KnowledgePersistenceManager {
23+
24+
@ConfluenceImport
25+
private static BandanaManager bandanaManager;
26+
private static BandanaContext bandanaContext;
27+
28+
@Inject
29+
public KnowledgePersistenceManager(BandanaManager bandanaManager) {
30+
setBandanaManager(bandanaManager);
31+
setBandanaContext(new ConfluenceBandanaContext("knowledge"));
32+
}
33+
34+
public static void addDecisionKnowledgeElement(DecisionKnowledgeElement decisionKnowledgeElement) {
35+
bandanaManager.setValue(bandanaContext, decisionKnowledgeElement.getId(), decisionKnowledgeElement);
36+
}
37+
38+
public static void removeDecisionKnowledgeElement(String id) {
39+
bandanaManager.removeValue(bandanaContext, id);
40+
}
1441

15-
void addDecisionKnowledgeElement(DecisionKnowledgeElement decisionKnowledgeElement);
42+
public static List<DecisionKnowledgeElement> getElements(int pageId, String macroId) {
43+
List<DecisionKnowledgeElement> elements = new ArrayList<DecisionKnowledgeElement>();
1644

17-
void removeDecisionKnowledgeElement(String id);
45+
for (String id : bandanaManager.getKeys(bandanaContext)) {
46+
DecisionKnowledgeElement decisionKnowledgeElement = (DecisionKnowledgeElement) bandanaManager
47+
.getValue(bandanaContext, id);
48+
// add only if the page id and Macro id corresponds // if macro id is null
49+
// return all from page
50+
if (decisionKnowledgeElement != null && decisionKnowledgeElement.getPageId() == pageId
51+
&& decisionKnowledgeElement.getMacroId() != null
52+
&& (decisionKnowledgeElement.getMacroId().equals(macroId)) || macroId == null) {
53+
elements.add(decisionKnowledgeElement);
54+
}
55+
}
56+
return elements;
57+
}
1858

19-
List<DecisionKnowledgeElement> getElements(int pageId, String macroId);
59+
public static void removeDecisionKnowledgeElements(int pageId, String macroId) {
60+
for (String id : bandanaManager.getKeys(bandanaContext)) {
61+
DecisionKnowledgeElement decisionKnowledgeElement = (DecisionKnowledgeElement) bandanaManager
62+
.getValue(bandanaContext, id);
63+
// remove only if the page id and Macro id corresponds remove all where macroId
64+
// is null
65+
String issueMacroId = decisionKnowledgeElement.getMacroId();
2066

21-
List<ArrayList<DecisionKnowledgeElement>> getElementsGroupedFromPageIdAndMacroId(int pageId, String macroId);
67+
if (isNullOrEmpty(issueMacroId) || (!isNullOrEmpty(issueMacroId)
68+
&& decisionKnowledgeElement.getPageId() == pageId && issueMacroId.equals(macroId))) {
69+
removeDecisionKnowledgeElement(decisionKnowledgeElement.getId());
70+
}
71+
}
72+
}
2273

23-
void removeDecisionKnowledgeElement(int pageId, String macroId);
74+
public static void setBandanaManager(BandanaManager bandanaManager) {
75+
KnowledgePersistenceManager.bandanaManager = bandanaManager;
76+
}
2477

25-
// Getters and setters for the BandanaManager are called by Confluence
26-
// (injection).
27-
BandanaManager getBandanaManager();
78+
public static void setBandanaContext(BandanaContext bandanaContext) {
79+
KnowledgePersistenceManager.bandanaContext = bandanaContext;
80+
}
2881

29-
void setBandanaManager(BandanaManager bandanaManager);
82+
public static boolean isNullOrEmpty(String myString) {
83+
return myString == null || myString.isEmpty();
84+
}
3085
}

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

Lines changed: 0 additions & 120 deletions
This file was deleted.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public interface KnowledgeRest {
1010

1111
Response storeKnowledgeElements(HttpServletRequest request, int pageId, String macroId, String jsonObjectString);
1212

13-
Response getKnowledgeElements(int pageId, String macroId);
13+
Response getStoredKnowledgeElements(int pageId, String macroId);
1414

1515
Response getKnowledgeElementsFromJira(String projectKey, String query);
1616

0 commit comments

Comments
 (0)