diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-07-16 12:10:13 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-07-16 13:03:06 +0200 |
commit | d8f606d1de1b13672f3aee769a7c25f37dc8aa48 (patch) | |
tree | fbd85f255359171ac1099ccf94f30669543f82a6 /sonar-server/src/main/java/org | |
parent | 16fe780b56393a0fe0d483be895af8433ab85ea9 (diff) | |
download | sonarqube-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.java | 4 | ||||
-rw-r--r-- | sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java | 87 |
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); + } + } |