summaryrefslogtreecommitdiffstats
path: root/sonar-server/src/main/java/org
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2014-07-16 12:10:13 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2014-07-16 13:03:06 +0200
commitd8f606d1de1b13672f3aee769a7c25f37dc8aa48 (patch)
treefbd85f255359171ac1099ccf94f30669543f82a6 /sonar-server/src/main/java/org
parent16fe780b56393a0fe0d483be895af8433ab85ea9 (diff)
downloadsonarqube-d8f606d1de1b13672f3aee769a7c25f37dc8aa48.tar.gz
sonarqube-d8f606d1de1b13672f3aee769a7c25f37dc8aa48.zip
SONAR-5338 Read test info from the test_data measure
Diffstat (limited to 'sonar-server/src/main/java/org')
-rw-r--r--sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java4
-rw-r--r--sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java87
2 files changed, 86 insertions, 5 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java b/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java
index 7fbed57dc0f..80b279ec1cb 100644
--- a/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java
+++ b/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java
@@ -69,6 +69,10 @@ public class MeasureDao extends BaseDao<MeasureMapper, MeasureDto, MeasureKey> i
return dtos;
}
+ public MeasureDto findByComponentKeyAndMetricKey(String componentKey, String metricKey, DbSession session) {
+ return session.getMapper(MeasureMapper.class).selectByComponentAndMetric(componentKey, metricKey);
+ }
+
@Override
protected MeasureDto doInsert(DbSession session, MeasureDto item) {
throw notImplemented();
diff --git a/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java b/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java
index 581dad7a90b..117a3b25c54 100644
--- a/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java
+++ b/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java
@@ -21,6 +21,10 @@
package org.sonar.server.test.ws;
import com.google.common.io.Resources;
+import org.codehaus.staxmate.SMInputFactory;
+import org.codehaus.staxmate.in.SMHierarchicCursor;
+import org.codehaus.staxmate.in.SMInputCursor;
+import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.RequestHandler;
import org.sonar.api.server.ws.Response;
@@ -30,15 +34,27 @@ import org.sonar.api.test.TestCase;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.SnapshotPerspectives;
+import org.sonar.core.measure.db.MeasureDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.db.DbClient;
import org.sonar.server.user.UserSession;
+import javax.annotation.CheckForNull;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+
+import java.io.StringReader;
+
public class TestsShowAction implements RequestHandler {
private static final String KEY = "key";
+ private final DbClient dbClient;
private final SnapshotPerspectives snapshotPerspectives;
- public TestsShowAction(SnapshotPerspectives snapshotPerspectives) {
+ public TestsShowAction(DbClient dbClient, SnapshotPerspectives snapshotPerspectives) {
+ this.dbClient = dbClient;
this.snapshotPerspectives = snapshotPerspectives;
}
@@ -61,15 +77,20 @@ public class TestsShowAction implements RequestHandler {
String fileKey = request.mandatoryParam(KEY);
UserSession.get().checkComponentPermission(UserRole.CODEVIEWER, fileKey);
- MutableTestPlan testPlan = snapshotPerspectives.as(MutableTestPlan.class, fileKey);
+ String testData = findTestData(fileKey);
JsonWriter json = response.newJsonWriter().beginObject();
- if (testPlan != null) {
- writeTests(testPlan, json);
+ if (testData != null) {
+ writeFromTestData(testData, json);
+ } else {
+ MutableTestPlan testPlan = snapshotPerspectives.as(MutableTestPlan.class, fileKey);
+ if (testPlan != null) {
+ writeFromTestable(testPlan, json);
+ }
}
json.endObject().close();
}
- private void writeTests(MutableTestPlan testPlan, JsonWriter json) {
+ private void writeFromTestable(MutableTestPlan testPlan, JsonWriter json) {
json.name("tests").beginArray();
for (TestCase testCase : testPlan.testCases()) {
json.beginObject();
@@ -84,4 +105,60 @@ public class TestsShowAction implements RequestHandler {
json.endArray();
}
+ private void writeFromTestData(String data, JsonWriter json) {
+ SMInputFactory inputFactory = initStax();
+ try {
+ SMHierarchicCursor root = inputFactory.rootElementCursor(new StringReader(data));
+ root.advance(); // tests-details
+ SMInputCursor cursor = root.childElementCursor();
+ json.name("tests").beginArray();
+ while (cursor.getNext() != null) {
+ json.beginObject();
+
+ json.prop("name", cursor.getAttrValue("name"));
+ json.prop("status", cursor.getAttrValue("status").toUpperCase());
+ json.prop("durationInMs", cursor.getAttrValue("time"));
+
+ SMInputCursor errorCursor = cursor.childElementCursor();
+ if (errorCursor.getNext() != null) {
+ json.prop("message", errorCursor.getAttrValue("message"));
+
+ SMInputCursor stackTraceCursor = cursor.childElementCursor();
+ if (stackTraceCursor.getNext() != null) {
+// json.prop("stackTrace", stackTraceCursor.getAttrValue(""));
+ }
+ }
+
+ json.endObject();
+ }
+ json.endArray();
+ } catch (XMLStreamException e) {
+ throw new IllegalStateException("XML is not valid: " + e.getMessage(), e);
+ }
+ }
+
+ @CheckForNull
+ private String findTestData(String fileKey) {
+ DbSession session = dbClient.openSession(false);
+ try {
+ MeasureDto testData = dbClient.measureDao().findByComponentKeyAndMetricKey(fileKey, CoreMetrics.TEST_DATA_KEY, session);
+ if (testData != null) {
+ return testData.getData();
+ }
+ } finally {
+ MyBatis.closeQuietly(session);
+ }
+ return null;
+ }
+
+ private SMInputFactory initStax() {
+ XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
+ xmlFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
+ xmlFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
+ // just so it won't try to load DTD in if there's DOCTYPE
+ xmlFactory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);
+ xmlFactory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.FALSE);
+ return new SMInputFactory(xmlFactory);
+ }
+
}