Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngel Avila2015-02-03 15:47:51 -0500
committerAngel Avila2015-02-03 15:47:51 -0500
commit88b2ab62926953927c2241a988cba05784477e14 (patch)
treefcf5430a26f2954144902ef4fac853e59a845061
parent9babe673433afb08388fa3ee2f4609b9a26f4a28 (diff)
downloadorg.eclipse.osee-dispo_refator.tar.gz
org.eclipse.osee-dispo_refator.tar.xz
org.eclipse.osee-dispo_refator.zip
-rw-r--r--plugins/org.eclipse.osee.disposition.rest.test/src/org/eclipse/osee/disposition/rest/resources/DispoSetResourceTest.java4
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/DispoApiImpl.java7
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/DispoItemDataCopier.java84
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/coverage/LisFileParser.java56
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/report/ExportSet.java9
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoItemMessageWriter.java31
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoSetMessageWriter.java55
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/resources/DispoSetResource.java21
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/util/DispoUtil.java224
-rw-r--r--plugins/org.eclipse.osee.disposition.rest/web/user.html1
-rw-r--r--plugins/org.eclipse.osee.support.config/launchConfig/osee.hsql.json24
11 files changed, 212 insertions, 304 deletions
diff --git a/plugins/org.eclipse.osee.disposition.rest.test/src/org/eclipse/osee/disposition/rest/resources/DispoSetResourceTest.java b/plugins/org.eclipse.osee.disposition.rest.test/src/org/eclipse/osee/disposition/rest/resources/DispoSetResourceTest.java
index 75cf31383b..bd5ca269dc 100644
--- a/plugins/org.eclipse.osee.disposition.rest.test/src/org/eclipse/osee/disposition/rest/resources/DispoSetResourceTest.java
+++ b/plugins/org.eclipse.osee.disposition.rest.test/src/org/eclipse/osee/disposition/rest/resources/DispoSetResourceTest.java
@@ -120,8 +120,8 @@ public class DispoSetResourceTest {
public void testGetAll() throws JSONException {
// No Sets
List<DispoSet> emptyResultSet = new ArrayList<DispoSet>();
- when(dispositionApi.getDispoSets(program)).thenReturn(emptyResultSet);
- Response noSetsResponse = resource.getAllDispoSets("testScript");
+ when(dispositionApi.getDispoSets(program, "testScript")).thenReturn(emptyResultSet);
+ Iterable<DispoSet> noSetsResponse = resource.getAllDispoSets("testScript");
String messageActual = (String) noSetsResponse.getEntity();
assertEquals(Response.Status.NOT_FOUND.getStatusCode(), noSetsResponse.getStatus());
assertEquals("[]", messageActual);
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/DispoApiImpl.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/DispoApiImpl.java
index 08d4cdba96..7f08be7c02 100644
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/DispoApiImpl.java
+++ b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/DispoApiImpl.java
@@ -44,7 +44,6 @@ import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.type.ResultSet;
import org.eclipse.osee.logger.Log;
import org.eclipse.osee.orcs.data.ArtifactReadable;
-import org.json.JSONException;
/**
* @author Angel Avila
@@ -445,11 +444,7 @@ public class DispoApiImpl implements DispoApi {
}
List<DispoItem> toEdit = Collections.emptyList();
OperationReport report = new OperationReport();
- try {
- toEdit = copier.copyEntireSet(destinationItems, getDispoItems(program, source.getGuid()), true, report);
- } catch (JSONException ex) {
- report.addOtherMessage(ex.getMessage());
- }
+ toEdit = copier.copyEntireSet(destinationItems, getDispoItems(program, source.getGuid()), true, report);
if (!toEdit.isEmpty()) {
editDispoItems(program, toEdit, false);
}
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/DispoItemDataCopier.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/DispoItemDataCopier.java
index d473df3320..6696ae0b84 100644
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/DispoItemDataCopier.java
+++ b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/DispoItemDataCopier.java
@@ -13,7 +13,6 @@ package org.eclipse.osee.disposition.rest.internal.importer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.osee.disposition.model.Discrepancy;
@@ -23,18 +22,14 @@ import org.eclipse.osee.disposition.model.DispoItemData;
import org.eclipse.osee.disposition.model.DispoStrings;
import org.eclipse.osee.disposition.rest.internal.LocationRangesCompressor;
import org.eclipse.osee.disposition.rest.internal.report.OperationReport;
-import org.eclipse.osee.disposition.rest.util.DispoUtil;
import org.eclipse.osee.framework.jdk.core.type.Pair;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
/**
* @author Angel Avila
*/
public class DispoItemDataCopier {
- public static void copyOldItemData(DispoItem sourceItem, DispoItemData destItem, OperationReport report) throws JSONException {
+ public static void copyOldItemData(DispoItem sourceItem, DispoItemData destItem, OperationReport report) {
StringBuilder message = new StringBuilder();
Map<String, Discrepancy> destItemDiscrepancies = destItem.getDiscrepanciesList();
@@ -49,42 +44,33 @@ public class DispoItemDataCopier {
report.addMessageForItem(destItem.getName(), message.toString());
}
- private static void updateTestPointNumbersForAnntations(HashMap<String, Integer> idsToUpdate, JSONArray annotations, JSONObject discrepancies, StringBuilder message) throws JSONException {
- for (int j = 0; j < annotations.length(); j++) {
- JSONObject annotationAsJson = annotations.getJSONObject(j);
- DispoAnnotationData annotation = DispoUtil.jsonObjToDispoAnnotationData(annotationAsJson);
- JSONArray idsOfCoveredDiscrepancies = annotation.getIdsOfCoveredDiscrepancies();
-
+ private static void updateTestPointNumbersForAnntations(HashMap<String, Integer> idsToUpdate, List<DispoAnnotationData> annotations, Map<String, Discrepancy> discrepancies, StringBuilder message) {
+ for (DispoAnnotationData annotation : annotations) {
+ List<String> idsOfCoveredDiscrepancies = annotation.getIdsOfCoveredDiscrepancies();
updateIdsCoveredDiscrepancies(idsToUpdate, idsOfCoveredDiscrepancies, annotations, discrepancies, annotation,
message);
}
}
- private static void updateIdsCoveredDiscrepancies(HashMap<String, Integer> idsToUpdate, JSONArray idsOfCoveredDiscrepancies, JSONArray annotations, JSONObject discrepancies, DispoAnnotationData annotation, StringBuilder message) throws JSONException {
- int length = idsOfCoveredDiscrepancies.length();
- for (int i = 0; i < length; i++) {
- String coveredId = idsOfCoveredDiscrepancies.getString(i);
+ private static void updateIdsCoveredDiscrepancies(HashMap<String, Integer> idsToUpdate, List<String> idsOfCoveredDiscrepancies, List<DispoAnnotationData> annotations, Map<String, Discrepancy> discrepancies, DispoAnnotationData annotation, StringBuilder message) {
+ for (String coveredId : idsOfCoveredDiscrepancies) {
if (idsToUpdate.containsKey(coveredId)) {
String newLocRef = rebuildLocRef(idsOfCoveredDiscrepancies, discrepancies, idsToUpdate, message);
if (!newLocRef.isEmpty()) {
annotation.setLocationRefs(newLocRef);
}
- JSONObject updatedAnnotationAsJson = DispoUtil.annotationToJsonObj(annotation);
- annotations.put(annotation.getIndex(), updatedAnnotationAsJson);
+ annotations.add(annotation.getIndex(), annotation);
break; // We can break here because we're going reconstruct the whole locRefs for the annotation, no need to keep checking
}
}
}
- private static String rebuildLocRef(JSONArray idsOfCoveredDiscrepancies, JSONObject discrepancies, HashMap<String, Integer> idsToUpdate, StringBuilder message) throws JSONException {
+ private static String rebuildLocRef(List<String> idsOfCoveredDiscrepancies, Map<String, Discrepancy> discrepancies, HashMap<String, Integer> idsToUpdate, StringBuilder message) {
boolean isGaveup = false;
- int length = idsOfCoveredDiscrepancies.length();
List<Integer> testPointNumber = new ArrayList<Integer>();
- for (int i = 0; i < length; i++) {
- String id = idsOfCoveredDiscrepancies.getString(i);
- if (discrepancies.has(id)) {
- JSONObject discrepancyAsObject = discrepancies.getJSONObject(id);
- Discrepancy discrepancy = DispoUtil.jsonObjToDiscrepancy(discrepancyAsObject);
+ for (String id : idsOfCoveredDiscrepancies) {
+ if (discrepancies.containsKey(id)) {
+ Discrepancy discrepancy = discrepancies.get(id);
testPointNumber.add(discrepancy.getLocation());
} else if (idsToUpdate.containsKey(id)) {
int justTestPoint = idsToUpdate.get(id);
@@ -107,17 +93,13 @@ public class DispoItemDataCopier {
return toReturn;
}
- @SuppressWarnings("unchecked")
- private static HashMap<String, Integer> matchupOldDiscrepancies(JSONObject oldDiscrepancies, JSONObject newDiscrepancies, JSONArray annotations, StringBuilder message, Boolean needsReview) throws JSONException {
+ private static HashMap<String, Integer> matchupOldDiscrepancies(Map<String, Discrepancy> oldDiscrepancies, Map<String, Discrepancy> newDiscrepancies, List<DispoAnnotationData> annotations, StringBuilder message, Boolean needsReview) {
HashMap<String, Pair<Discrepancy, Boolean>> textToNewDiscrepancies =
createTextToDiscrepanciesMap(newDiscrepancies);
HashMap<String, Integer> idsToUpdate = new HashMap<String, Integer>();
- Iterator<String> iterator = oldDiscrepancies.keys();
- while (iterator.hasNext()) {
- String key = iterator.next();
- JSONObject oldDiscrepancyAsJson = oldDiscrepancies.getJSONObject(key);
- Discrepancy oldDiscrepany = DispoUtil.jsonObjToDiscrepancy(oldDiscrepancyAsJson);
+ for (String key : oldDiscrepancies.keySet()) {
+ Discrepancy oldDiscrepany = oldDiscrepancies.get(key);
String normalizedText = oldDiscrepany.getText().replaceFirst(".*?\\.", "");
Pair<Discrepancy, Boolean> matchedPair = textToNewDiscrepancies.get(normalizedText);
@@ -148,9 +130,8 @@ public class DispoItemDataCopier {
idsToUpdate.put(idOfOldDiscrep, newTestPointNumber);
}
- JSONObject matchedNewDiscrepAsJson = DispoUtil.discrepancyToJsonObj(matchedNewDiscrepancy);
newDiscrepancies.remove(idToReplace);
- newDiscrepancies.put(idOfOldDiscrep, matchedNewDiscrepAsJson);
+ newDiscrepancies.put(idOfOldDiscrep, matchedNewDiscrepancy);
} else {
// This discrepancy doesn't exist on the new Item
message.append("Test Point:");
@@ -165,45 +146,38 @@ public class DispoItemDataCopier {
return idsToUpdate;
}
- private static void removeDiscrepancyFromAnnotation(Discrepancy toRemove, JSONArray annotations) throws JSONException {
- for (int i = 0; i < annotations.length(); i++) {
- JSONObject annotationAsJson = annotations.getJSONObject(i);
- DispoAnnotationData annotation = DispoUtil.jsonObjToDispoAnnotationData(annotationAsJson);
- JSONArray idsOfCoveredDiscrepancies = annotation.getIdsOfCoveredDiscrepancies();
+ private static void removeDiscrepancyFromAnnotation(Discrepancy toRemove, List<DispoAnnotationData> annotations) {
+ for (DispoAnnotationData annotation : annotations) {
+ List<String> idsOfCoveredDiscrepancies = annotation.getIdsOfCoveredDiscrepancies();
if (idsOfCoveredDiscrepancies.toString().contains(toRemove.getId())) {
replaceIdInList(toRemove, idsOfCoveredDiscrepancies);
annotation.setIsConnected(false);
}
- JSONObject updatedAnnotationAsJson = DispoUtil.annotationToJsonObj(annotation);
- annotations.put(annotation.getIndex(), updatedAnnotationAsJson);
+ annotations.add(annotation.getIndex(), annotation);
}
}
- private static void replaceIdInList(Discrepancy discrepany, JSONArray idsList) throws JSONException {
- int length = idsList.length();
+ private static void replaceIdInList(Discrepancy discrepany, List<String> idsList) {
String id = discrepany.getId();
- for (int i = 0; i < length; i++) {
- if (id.equals(idsList.getString(i))) {
+ for (int i = 0; i < idsList.size(); i++) {
+ if (id.equals(idsList.get(i))) {
int testPoint = discrepany.getLocation() * -1;
- String newMockId = DispoStrings.DeletedDiscrepancy + testPoint;
- idsList.put(i, newMockId);
+ String newFakeId = DispoStrings.DeletedDiscrepancy + testPoint;
+ idsList.add(i, newFakeId);
break;
}
}
}
- @SuppressWarnings("unchecked")
- private static HashMap<String, Pair<Discrepancy, Boolean>> createTextToDiscrepanciesMap(JSONObject discrepancies) throws JSONException {
+ private static HashMap<String, Pair<Discrepancy, Boolean>> createTextToDiscrepanciesMap(Map<String, Discrepancy> discrepancies) {
HashMap<String, Pair<Discrepancy, Boolean>> textToDiscrepancy = new HashMap<String, Pair<Discrepancy, Boolean>>();
- Iterator<String> iterator = discrepancies.keys();
- while (iterator.hasNext()) {
- String key = iterator.next();
- JSONObject discrepancyAsObject = discrepancies.getJSONObject(key);
- Discrepancy discrepancy = DispoUtil.jsonObjToDiscrepancy(discrepancyAsObject);
+ for (String key : discrepancies.keySet()) {
+ Discrepancy discrepancy = discrepancies.get(key);
String normalizedText = discrepancy.getText().replaceFirst(".*?\\.", ""); // Want to exclude Point number from text we match with
- Pair newPair = new Pair<Discrepancy, Boolean>(discrepancy, textToDiscrepancy.containsKey(normalizedText));
+ Pair<Discrepancy, Boolean> newPair =
+ new Pair<Discrepancy, Boolean>(discrepancy, textToDiscrepancy.containsKey(normalizedText));
textToDiscrepancy.put(normalizedText, newPair);
}
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/coverage/LisFileParser.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/coverage/LisFileParser.java
index bb36176a37..163ff62360 100644
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/coverage/LisFileParser.java
+++ b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/importer/coverage/LisFileParser.java
@@ -20,7 +20,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -35,7 +34,6 @@ import org.eclipse.osee.disposition.rest.internal.DispoConnector;
import org.eclipse.osee.disposition.rest.internal.DispoDataFactory;
import org.eclipse.osee.disposition.rest.internal.importer.AnnotationCopier;
import org.eclipse.osee.disposition.rest.internal.report.OperationReport;
-import org.eclipse.osee.disposition.rest.util.DispoUtil;
import org.eclipse.osee.framework.core.util.Result;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.type.Pair;
@@ -51,9 +49,6 @@ import org.eclipse.osee.vcast.model.VCastInstrumentedFile;
import org.eclipse.osee.vcast.model.VCastResult;
import org.eclipse.osee.vcast.model.VCastSourceFileJoin;
import org.eclipse.osee.vcast.model.VCastStatementCoverage;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
/**
* @author Angel Avila
@@ -94,34 +89,27 @@ public class LisFileParser implements DispoImporterApi {
try {
processResult(result, report);
} catch (Exception ex) {
- //
+ report.addOtherMessage(ex.toString());
}
}
- try {
- processExceptionHandled(report);
- } catch (JSONException ex) {
- //
- }
+ processExceptionHandled(report);
Collection<DispoItemData> values = datIdToItem.values();
for (DispoItemData item : values) {
dataFactory.initDispoItem(item);
- item.setTotalPoints(String.valueOf(item.getAnnotationsList().length() + item.getDiscrepanciesList().length()));
+ item.setTotalPoints(String.valueOf(item.getAnnotationsList().size() + item.getDiscrepanciesList().size()));
}
// This is a reimport so we'll need to copy all the annotations
if (!exisitingItems.isEmpty()) {
AnnotationCopier copier = new AnnotationCopier(dispoConnector);
- try {
- List<DispoItemData> itemsFromImport = new ArrayList<DispoItemData>();
- itemsFromImport.addAll(values);
+ List<DispoItemData> itemsFromImport = new ArrayList<DispoItemData>();
+ itemsFromImport.addAll(values);
- toReturn = copier.copyEntireSet(itemsFromImport, exisitingItems.values(), false, report);
- } catch (JSONException ex) {
- //
- }
+ toReturn = copier.copyEntireSet(itemsFromImport, exisitingItems.values(), false, report);
+ //
} else {
toReturn = new ArrayList<DispoItem>();
toReturn.addAll(values);
@@ -129,7 +117,7 @@ public class LisFileParser implements DispoImporterApi {
return toReturn;
}
- private void processExceptionHandled(OperationReport report) throws JSONException {
+ private void processExceptionHandled(OperationReport report) {
for (String datId : datIdsCoveredByException) {
Matcher matcher = Pattern.compile("\\d*:\\d*:").matcher(datId);
matcher.find();
@@ -197,7 +185,7 @@ public class LisFileParser implements DispoImporterApi {
private void processFunction(String lisFileName, VCastLisFileParser lisFileParser, int fileNum, VCastDataStore dataStore, VCastInstrumentedFile instrumentedFile, VCastFunction function, OperationReport report) {
int functionNum = function.getFindex();
DispoItemData newItem = new DispoItemData();
- newItem.setAnnotationsList(new JSONArray());
+ newItem.setAnnotationsList(new ArrayList<DispoAnnotationData>());
newItem.setName(lisFileName + "." + function.getName());
String datId = generateDatId(fileNum, functionNum);
@@ -213,18 +201,18 @@ public class LisFileParser implements DispoImporterApi {
instrumentedFile.getId(), function.getId(), ex.getMessage());
}
- Map<String, JSONObject> discrepancies = new HashMap<String, JSONObject>();
+ Map<String, Discrepancy> discrepancies = new HashMap<String, Discrepancy>();
for (VCastStatementCoverage statementCoverageItem : statementCoverageItems) {
processStatement(lisFileName, lisFileParser, fileNum, functionNum, function, statementCoverageItem,
discrepancies, report);
}
- newItem.setDiscrepanciesList(new JSONObject(discrepancies));
+ newItem.setDiscrepanciesList(discrepancies);
// add discrepancies to item
}
- private void processStatement(String lisFileName, VCastLisFileParser lisFileParser, int fileNum, int functionNum, VCastFunction function, VCastStatementCoverage statementCoverageItem, Map<String, JSONObject> discrepancies, OperationReport report) {
+ private void processStatement(String lisFileName, VCastLisFileParser lisFileParser, int fileNum, int functionNum, VCastFunction function, VCastStatementCoverage statementCoverageItem, Map<String, Discrepancy> discrepancies, OperationReport report) {
// Create discrepancy for every line, annotate with test usnit or exception handled
Integer functionNumber = function.getFindex();
Integer lineNumber = statementCoverageItem.getLine();
@@ -243,7 +231,7 @@ public class LisFileParser implements DispoImporterApi {
newDiscrepancy.setLocation(lineNumber);
String id = String.valueOf(Lib.generateUuid());
newDiscrepancy.setId(id);
- discrepancies.put(id, new JSONObject(newDiscrepancy));
+ discrepancies.put(id, newDiscrepancy);
// Is covered by exception handling, pass as parameter from DispoApiImpl
if (lineData.getSecond()) {
@@ -305,13 +293,9 @@ public class LisFileParser implements DispoImporterApi {
}
}
- private void removeDisrepancy(String location, JSONObject discrepancies) throws JSONException {
- @SuppressWarnings("unchecked")
- Iterator<String> iterator = discrepancies.keys();
- while (iterator.hasNext()) {
- String key = iterator.next();
- JSONObject discrepancyAsJson = discrepancies.getJSONObject(key);
- Discrepancy discrepancy = DispoUtil.jsonObjToDiscrepancy(discrepancyAsJson);
+ private void removeDisrepancy(String location, Map<String, Discrepancy> discrepancies) {
+ for (String key : discrepancies.keySet()) {
+ Discrepancy discrepancy = discrepancies.get(key);
if (String.valueOf(discrepancy.getLocation()).equals(location)) {
discrepancies.remove(key);
break;
@@ -320,7 +304,7 @@ public class LisFileParser implements DispoImporterApi {
}
- private void addAnnotationForForCoveredLine(DispoItemData item, String location, String resolutionType, String coveringFile) throws JSONException {
+ private void addAnnotationForForCoveredLine(DispoItemData item, String location, String resolutionType, String coveringFile) {
DispoAnnotationData newAnnotation = new DispoAnnotationData();
dataFactory.initAnnotation(newAnnotation);
String idOfNewAnnotation = dataFactory.getNewId();
@@ -333,10 +317,10 @@ public class LisFileParser implements DispoImporterApi {
newAnnotation.setIsResolutionValid(true);
dispoConnector.connectAnnotation(newAnnotation, item.getDiscrepanciesList());
- JSONArray annotationsList = item.getAnnotationsList();
- int newIndex = annotationsList.length();
+ List<DispoAnnotationData> annotationsList = item.getAnnotationsList();
+ int newIndex = annotationsList.size();
newAnnotation.setIndex(newIndex);
- annotationsList.put(newIndex, DispoUtil.annotationToJsonObj(newAnnotation));
+ annotationsList.add(newIndex, newAnnotation);
}
private Collection<VCastResult> getResultFiles(VCastDataStore dataStore) {
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/report/ExportSet.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/report/ExportSet.java
index 2732960e0c..61c9510d08 100644
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/report/ExportSet.java
+++ b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/internal/report/ExportSet.java
@@ -26,9 +26,6 @@ import org.eclipse.osee.disposition.rest.internal.LocationRangesCompressor;
import org.eclipse.osee.disposition.rest.util.DispoUtil;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
/**
* @author Angel Avila
@@ -87,12 +84,10 @@ public class ExportSet {
}
- private static String prettifyAnnotations(JSONArray annotations) throws JSONException {
+ private static String prettifyAnnotations(List<DispoAnnotationData> annotations) {
StringBuilder sb = new StringBuilder();
- for (int i = 0; i < annotations.length(); i++) {
- JSONObject annotationJson = annotations.getJSONObject(i);
- DispoAnnotationData annotation = DispoUtil.jsonObjToDispoAnnotationData(annotationJson);
+ for (DispoAnnotationData annotation : annotations) {
sb.append(annotation.getLocationRefs());
sb.append(":");
sb.append(annotation.getResolution());
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoItemMessageWriter.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoItemMessageWriter.java
index bd20adf118..f1b1d1ca8c 100644
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoItemMessageWriter.java
+++ b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoItemMessageWriter.java
@@ -13,41 +13,46 @@ package org.eclipse.osee.disposition.rest.messages;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
+import java.util.List;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
-import org.eclipse.osee.disposition.model.DispoItemData;
-import org.json.JSONException;
+import org.eclipse.osee.disposition.model.DispoItem;
+import org.eclipse.osee.disposition.rest.util.DispoUtil;
+import org.json.JSONArray;
import org.json.JSONObject;
/**
* @author Angel Avila
*/
-public class DispoItemMessageWriter implements MessageBodyWriter<DispoItemData> {
+public class DispoItemMessageWriter implements MessageBodyWriter<List<DispoItem>> {
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
- return type == DispoItemData.class;
+ if (genericType instanceof ParameterizedType) {
+ return ((ParameterizedType) genericType).getActualTypeArguments()[0] == DispoItem.class;
+ } else {
+ return false;
+ }
}
@Override
- public long getSize(DispoItemData dispoItem, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+ public long getSize(List<DispoItem> dispoItems, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
- public void writeTo(DispoItemData dispoItem, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
- JSONObject jsonObject = new JSONObject(dispoItem);
- try {
- jsonObject.put("annotationsList", dispoItem.getAnnotationsList());
- jsonObject.put("discrepanciesList", dispoItem.getDiscrepanciesList());
- } catch (JSONException ex) {
- throw new IOException("Could not get Lists from Disposition Item", ex);
+ public void writeTo(List<DispoItem> dispoItems, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
+ JSONArray jArray = new JSONArray();
+ for (DispoItem item : dispoItems) {
+ JSONObject jObject = DispoUtil.dispoItemToJsonObj(item);
+ jArray.put(jObject);
}
- String jsonString = jsonObject.toString();
+ String jsonString = jArray.toString();
entityStream.write(jsonString.getBytes(Charset.forName("UTF-8")));
}
}
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoSetMessageWriter.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoSetMessageWriter.java
deleted file mode 100644
index cd86141041..0000000000
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/messages/DispoSetMessageWriter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2013 Boeing.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Boeing - initial API and implementation
- *******************************************************************************/
-package org.eclipse.osee.disposition.rest.messages;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.nio.charset.Charset;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyWriter;
-import org.eclipse.osee.disposition.model.DispoSet;
-import org.json.JSONObject;
-
-/**
- * @author Angel Avila
- */
-public class DispoSetMessageWriter implements MessageBodyWriter<DispoSet> {
-
- @Override
- public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
- if (genericType instanceof ParameterizedType) {
- return ((ParameterizedType) genericType).getActualTypeArguments()[0] == DispoSet.class;
- } else {
- return false;
- }
- }
-
- @Override
- public long getSize(DispoSet dispoSet, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
- return -1;
- }
-
- @Override
- public void writeTo(DispoSet dispoSetArt, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
- // DispoUtil.setArtToSetData(dispoSet)
- // JSONObject jsonObject = DispoUtil.dispoSetToJsonObj(dispoSet);
- System.out.println("");
- JSONObject jsonObject = new JSONObject(dispoSetArt);
- String jsonString = jsonObject.toString();
- entityStream.write(jsonString.getBytes(Charset.forName("UTF-8")));
- }
-
-}
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/resources/DispoSetResource.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/resources/DispoSetResource.java
index 5ab8482d68..cbd7e4f499 100644
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/resources/DispoSetResource.java
+++ b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/resources/DispoSetResource.java
@@ -31,9 +31,7 @@ import org.eclipse.osee.disposition.model.DispoSet;
import org.eclipse.osee.disposition.model.DispoSetData;
import org.eclipse.osee.disposition.model.DispoSetDescriptorData;
import org.eclipse.osee.disposition.rest.DispoApi;
-import org.eclipse.osee.disposition.rest.util.DispoUtil;
import org.eclipse.osee.framework.jdk.core.util.Strings;
-import org.json.JSONArray;
import org.json.JSONException;
/**
@@ -74,7 +72,7 @@ public class DispoSetResource {
String createdSetId = dispoApi.createDispoSet(program, descriptor).getGuid();
DispoSet createdSet = dispoApi.getDispoSetById(program, createdSetId);
status = Status.CREATED;
- response = Response.status(status).entity(DispoUtil.setArtToSetData(createdSet)).build();
+ response = Response.status(status).entity(createdSet).build();
} else {
status = Status.CONFLICT;
response = Response.status(status).entity(DispoMessages.Set_ConflictingNames).build();
@@ -103,7 +101,7 @@ public class DispoSetResource {
if (result == null) {
response = Response.status(Response.Status.NOT_FOUND).entity(DispoMessages.Set_NotFound).build();
} else {
- response = Response.status(Response.Status.OK).entity(DispoUtil.setArtToSetData(result)).build();
+ response = Response.status(Response.Status.OK).entity(result).build();
}
return response;
}
@@ -185,20 +183,9 @@ public class DispoSetResource {
@Path("{setId}/search")
@GET
@Produces(MediaType.APPLICATION_JSON)
- public Response getDispoItemsByAnnotationText(@PathParam("setId") String setId, @QueryParam("value") String value) {
- Response response;
+ public Iterable<DispoItem> getDispoItemsByAnnotationText(@PathParam("setId") String setId, @QueryParam("value") String value) {
Collection<DispoItem> foundItems = dispoApi.getDispoItemByAnnotationText(program, setId, value);
- if (foundItems.isEmpty()) {
- response = Response.status(Response.Status.NOT_FOUND).entity(DispoMessages.Item_NotFound).build();
- } else {
- JSONArray jArray = new JSONArray();
- for (DispoItem item : foundItems) {
- jArray.put(DispoUtil.dispoItemToJsonObj(item));
- }
-
- response = Response.status(Response.Status.OK).entity(jArray.toString()).build();
- }
- return response;
+ return foundItems;
}
}
diff --git a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/util/DispoUtil.java b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/util/DispoUtil.java
index 00ef7a89ef..ed00143a50 100644
--- a/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/util/DispoUtil.java
+++ b/plugins/org.eclipse.osee.disposition.rest/src/org/eclipse/osee/disposition/rest/util/DispoUtil.java
@@ -17,7 +17,9 @@ import org.eclipse.osee.disposition.model.Discrepancy;
import org.eclipse.osee.disposition.model.DispoAnnotationData;
import org.eclipse.osee.disposition.model.DispoItem;
import org.eclipse.osee.disposition.model.DispoItemData;
+import org.eclipse.osee.disposition.model.DispoSetData;
import org.eclipse.osee.disposition.model.DispoStrings;
+import org.eclipse.osee.disposition.model.Note;
import org.eclipse.osee.disposition.rest.internal.LocationRangesCompressor;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.json.JSONArray;
@@ -153,103 +155,106 @@ public final class DispoUtil {
}
//
- // public static DispoItemData jsonObjToDispoItem(JSONObject jsonObject) {
- // DispoItemData dispoItem = new DispoItemData();
- // try {
- // if (jsonObject.has("name")) {
- // dispoItem.setName(jsonObject.getString("name"));
- // }
- // if (jsonObject.has("guid")) {
- // dispoItem.setGuid(jsonObject.getString("guid"));
- // }
- // if (jsonObject.has("status")) {
- // dispoItem.setStatus(jsonObject.getString("status"));
- // }
- // if (jsonObject.has("totalPoints")) {
- // dispoItem.setTotalPoints(jsonObject.getString("totalPoints"));
- // }
- // if (jsonObject.has("needsRerun")) {
- // dispoItem.setNeedsRerun(jsonObject.getBoolean("needsRerun"));
- // }
- // if (jsonObject.has("version")) {
- // dispoItem.setVersion(jsonObject.getString("version"));
- // }
- // if (jsonObject.has("assignee")) {
- // dispoItem.setAssignee(jsonObject.getString("assignee"));
- // }
- // if (jsonObject.has("category")) {
- // dispoItem.setCategory(jsonObject.getString("category"));
- // }
- // if (jsonObject.has("machine")) {
- // dispoItem.setMachine(jsonObject.getString("machine"));
- // }
- // if (jsonObject.has("elapsedTime")) {
- // dispoItem.setElapsedTime(jsonObject.getString("elapsedTime"));
- // }
- // if (jsonObject.has("aborted")) {
- // dispoItem.setAborted(jsonObject.getBoolean("aborted"));
- // }
- // if (jsonObject.has("itemNotes")) {
- // dispoItem.setItemNotes(jsonObject.getString("itemNotes"));
- // }
- // } catch (JSONException ex) {
- // throw new OseeCoreException("Error deserializing a Dispositionable Item.", ex);
- // }
- //
- // return dispoItem;
- // }
- //
- // public static DispoSetData jsonObjToDispoSet(JSONObject jsonObject) {
- // DispoSetData dispoSet = new DispoSetData();
- // try {
- // if (jsonObject.has("importPath")) {
- // dispoSet.setImportPath(jsonObject.getString("importPath"));
- // }
- // if (jsonObject.has("name")) {
- // dispoSet.setName(jsonObject.getString("name"));
- // }
- // if (jsonObject.has("operation")) {
- // dispoSet.setOperation(jsonObject.getString("operation"));
- // }
- // if (jsonObject.has("notesList")) {
- // JSONArray jArray = jsonObject.getJSONArray("notesList");
- // List<Note> notesList = new ArrayList<Note>();
- // for (int i = 0; i < jArray.length(); i++) {
- // notesList.add(jsonObjToNote(jArray.getJSONObject(i)));
- // }
- // dispoSet.setNotesList(notesList);
- // }
- // } catch (JSONException ex) {
- // throw new OseeCoreException("Error deserializing a Dispositionable Item.", ex);
- // }
- // return dispoSet;
- // }
+ public static DispoItemData jsonObjToDispoItem(JSONObject jsonObject) {
+ DispoItemData dispoItem = new DispoItemData();
+ try {
+ if (jsonObject.has("name")) {
+ dispoItem.setName(jsonObject.getString("name"));
+ }
+ if (jsonObject.has("guid")) {
+ dispoItem.setGuid(jsonObject.getString("guid"));
+ }
+ if (jsonObject.has("status")) {
+ dispoItem.setStatus(jsonObject.getString("status"));
+ }
+ if (jsonObject.has("totalPoints")) {
+ dispoItem.setTotalPoints(jsonObject.getString("totalPoints"));
+ }
+ if (jsonObject.has("needsRerun")) {
+ dispoItem.setNeedsRerun(jsonObject.getBoolean("needsRerun"));
+ }
+ if (jsonObject.has("version")) {
+ dispoItem.setVersion(jsonObject.getString("version"));
+ }
+ if (jsonObject.has("assignee")) {
+ dispoItem.setAssignee(jsonObject.getString("assignee"));
+ }
+ if (jsonObject.has("category")) {
+ dispoItem.setCategory(jsonObject.getString("category"));
+ }
+ if (jsonObject.has("machine")) {
+ dispoItem.setMachine(jsonObject.getString("machine"));
+ }
+ if (jsonObject.has("elapsedTime")) {
+ dispoItem.setElapsedTime(jsonObject.getString("elapsedTime"));
+ }
+ if (jsonObject.has("aborted")) {
+ dispoItem.setAborted(jsonObject.getBoolean("aborted"));
+ }
+ if (jsonObject.has("itemNotes")) {
+ dispoItem.setItemNotes(jsonObject.getString("itemNotes"));
+ }
+ } catch (JSONException ex) {
+ throw new OseeCoreException("Error deserializing a Dispositionable Item.", ex);
+ }
+
+ return dispoItem;
+ }
+
//
- // public static JSONObject dispoItemToJsonObj(DispoItem dispoItem) {
- // JSONObject jsonObject = new JSONObject();
- // try {
- // jsonObject.put("discrepanciesAsRanges", discrepanciesToString(dispoItem.getDiscrepanciesList()));
- // jsonObject.put("failureCount", dispoItem.getDiscrepanciesList().size());
- // jsonObject.put("name", dispoItem.getName());
- // jsonObject.put("status", dispoItem.getStatus());
- // jsonObject.put("totalPoints", dispoItem.getTotalPoints());
- // jsonObject.put("assignee", dispoItem.getAssignee());
- // jsonObject.put("needsRerun", dispoItem.getNeedsRerun());
- // jsonObject.put("guid", dispoItem.getGuid());
- // jsonObject.put("category", dispoItem.getCategory());
- // jsonObject.put("machine", dispoItem.getMachine());
- // jsonObject.put("elapsedTime", dispoItem.getElapsedTime());
- // jsonObject.put("aborted", dispoItem.getAborted());
- // jsonObject.put("lastUpdated", dispoItem.getLastUpdate());
- // jsonObject.put("creationDate", dispoItem.getCreationDate());
- // jsonObject.put("itemNotes", dispoItem.getItemNotes());
- // jsonObject.put("version", dispoItem.getVersion());
- // } catch (JSONException ex) {
- // throw new OseeCoreException("Error deserializing a Dispositionable Item.", ex);
- // }
+ public static DispoSetData jsonObjToDispoSet(JSONObject jsonObject) {
+ DispoSetData dispoSet = new DispoSetData();
+ try {
+ if (jsonObject.has("importPath")) {
+ dispoSet.setImportPath(jsonObject.getString("importPath"));
+ }
+ if (jsonObject.has("name")) {
+ dispoSet.setName(jsonObject.getString("name"));
+ }
+ if (jsonObject.has("operation")) {
+ dispoSet.setOperation(jsonObject.getString("operation"));
+ }
+ if (jsonObject.has("notesList")) {
+ JSONArray jArray = jsonObject.getJSONArray("notesList");
+ List<Note> notesList = new ArrayList<Note>();
+ for (int i = 0; i < jArray.length(); i++) {
+ notesList.add(jsonObjToNote(jArray.getJSONObject(i)));
+ }
+ dispoSet.setNotesList(notesList);
+ }
+ } catch (JSONException ex) {
+ throw new OseeCoreException("Error deserializing a Dispositionable Item.", ex);
+ }
+ return dispoSet;
+ }
+
//
- // return jsonObject;
- // }
+ public static JSONObject dispoItemToJsonObj(DispoItem dispoItem) {
+ JSONObject jsonObject = new JSONObject();
+ try {
+ jsonObject.put("discrepanciesAsRanges", discrepanciesToString(dispoItem.getDiscrepanciesList()));
+ jsonObject.put("failureCount", dispoItem.getDiscrepanciesList().size());
+ jsonObject.put("name", dispoItem.getName());
+ jsonObject.put("status", dispoItem.getStatus());
+ jsonObject.put("totalPoints", dispoItem.getTotalPoints());
+ jsonObject.put("assignee", dispoItem.getAssignee());
+ jsonObject.put("needsRerun", dispoItem.getNeedsRerun());
+ jsonObject.put("guid", dispoItem.getGuid());
+ jsonObject.put("category", dispoItem.getCategory());
+ jsonObject.put("machine", dispoItem.getMachine());
+ jsonObject.put("elapsedTime", dispoItem.getElapsedTime());
+ jsonObject.put("aborted", dispoItem.getAborted());
+ jsonObject.put("lastUpdated", dispoItem.getLastUpdate());
+ jsonObject.put("creationDate", dispoItem.getCreationDate());
+ jsonObject.put("itemNotes", dispoItem.getItemNotes());
+ jsonObject.put("version", dispoItem.getVersion());
+ } catch (JSONException ex) {
+ throw new OseeCoreException("Error deserializing a Dispositionable Item.", ex);
+ }
+
+ return jsonObject;
+ }
+
//
public static JSONObject discrepancyToJsonObj(Discrepancy discrepancy) {
JSONObject toReturn = new JSONObject(discrepancy);
@@ -366,19 +371,18 @@ public final class DispoUtil {
return discrepancy;
}
- // public static LocationRange jsonObjToLocationRagne(JSONObject object) throws JSONException {
- // LocationRange range = new LocationRange();
- // range.setStart(object.getInt("start"));
- // range.setEnd(object.getInt("end"));
- // return range;
- // }
- //
- // public static Note jsonObjToNote(JSONObject object) throws JSONException {
- // Note note = new Note();
- // note.setContent(object.getString("content"));
- // note.setDateString(object.getString("dateString"));
- // note.setType(object.getString("type"));
- // return note;
- // }
- // }
+ // public static LocationRange jsonObjToLocationRagne(JSONObject object) throws JSONException {
+ // LocationRange range = new LocationRange();
+ // range.setStart(object.getInt("start"));
+ // range.setEnd(object.getInt("end"));
+ // return range;
+ // }
+
+ public static Note jsonObjToNote(JSONObject object) throws JSONException {
+ Note note = new Note();
+ note.setContent(object.getString("content"));
+ note.setDateString(object.getString("dateString"));
+ note.setType(object.getString("type"));
+ return note;
+ }
}
diff --git a/plugins/org.eclipse.osee.disposition.rest/web/user.html b/plugins/org.eclipse.osee.disposition.rest/web/user.html
index d587c904e1..54651947b8 100644
--- a/plugins/org.eclipse.osee.disposition.rest/web/user.html
+++ b/plugins/org.eclipse.osee.disposition.rest/web/user.html
@@ -12,7 +12,6 @@
</div>
<div class="span3">
ATS Version:
- <select class="form-control" ng-show="programs" ng-model="programSelection" ng-disabled="isSearchView" ng-change="updateProgram()" ng-options="obj.value as obj.text for obj in programs"></select>
<select class="form-control" ng-show="programs" ng-model="programSelection" ng-change="updateProgram()" ng-options="program.guid as program.name for program in programs"></select>
</div>
<div class="span3">
diff --git a/plugins/org.eclipse.osee.support.config/launchConfig/osee.hsql.json b/plugins/org.eclipse.osee.support.config/launchConfig/osee.hsql.json
index 244075e58e..3ce3002e97 100644
--- a/plugins/org.eclipse.osee.support.config/launchConfig/osee.hsql.json
+++ b/plugins/org.eclipse.osee.support.config/launchConfig/osee.hsql.json
@@ -26,9 +26,29 @@
{
"service.pid": "org.eclipse.osee.http.jetty.internal.osgi.JettyHttpService",
"jetty.server.context.session.inactive.interval": 3600,
- "jetty.server.session.manager.factory": "JDBC",
+ "jetty.server.session.manager.factory": "IN_MEMORY",
"jetty.jdbc.cluster.name" : "OSEE",
"jetty.jdbc.save.interval.secs" : 30
- }
+ },
+ {
+ "service.pid": "org.eclipse.osee.jaxrs.server.internal.security.oauth2.provider.OAuth2ServerProvider",
+ "jaxrs.oauth2.provider.enabled" : true,
+ "jaxrs.oauth2.provider.secret.key":"T0W3wQ1mMqmgdSxklHxYqg"
+ },
+ {
+ "service.pid": "org.eclipse.osee.authentication.admin.internal.AuthenticationAdminImpl",
+ "authentication.scheme.allowed": "LDAP",
+ "authentication.scheme.allowed.default": "LDAP"
+ },
+ {
+ "service.pid": "org.eclipse.osee.authentication.ldap.internal.LdapAuthenticationProvider",
+ "ldap.server.address": "ldap://msa-support.msc.az.boeing.com",
+ "ldap.credential.source": "SYSTEM",
+ "ldap.account.search.base": "DC=msc,DC=az,DC=boeing,DC=com",
+ "ldap.account.search.pattern": "(&(objectClass=person)(uid=${username}))",
+ "ldap.account.display.name": "cn",
+ "ldap.account.email.address": "mail",
+ "ldap.group.search.base": "DC=msc,DC=az,DC=boeing,DC=com"
+ }
]
} \ No newline at end of file

Back to the top