<groupId>org.codehaus.sonar</groupId> | <groupId>org.codehaus.sonar</groupId> | ||||
<artifactId>sonar-core</artifactId> | <artifactId>sonar-core</artifactId> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.codehaus.sonar</groupId> | |||||
<artifactId>sonar-batch-protocol</artifactId> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>org.codehaus.sonar</groupId> | <groupId>org.codehaus.sonar</groupId> | ||||
<artifactId>sonar-deprecated</artifactId> | <artifactId>sonar-deprecated</artifactId> |
public class BatchWs implements WebService { | public class BatchWs implements WebService { | ||||
private final BatchIndex batchIndex; | private final BatchIndex batchIndex; | ||||
private final GlobalReferentialsAction globalReferentialsAction; | |||||
public BatchWs(BatchIndex batchIndex) { | |||||
public BatchWs(BatchIndex batchIndex, GlobalReferentialsAction globalReferentialsAction) { | |||||
this.batchIndex = batchIndex; | this.batchIndex = batchIndex; | ||||
this.globalReferentialsAction = globalReferentialsAction; | |||||
} | } | ||||
@Override | @Override | ||||
public void define(Context context) { | public void define(Context context) { | ||||
NewController controller = context.createController("batch") | NewController controller = context.createController("batch") | ||||
.setSince("4.4") | .setSince("4.4") | ||||
.setDescription("Get JAR files for batch"); | |||||
.setDescription("Get JAR files and referentials for batch"); | |||||
defineIndexAction(controller); | defineIndexAction(controller); | ||||
defineFileAction(controller); | defineFileAction(controller); | ||||
globalReferentialsAction.define(controller); | |||||
controller.done(); | controller.done(); | ||||
} | } | ||||
response.stream().setMediaType("text/plain"); | response.stream().setMediaType("text/plain"); | ||||
IOUtils.write(batchIndex.getIndex(), response.stream().output()); | IOUtils.write(batchIndex.getIndex(), response.stream().output()); | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
throw new IllegalStateException("Fail to send batch index", e); | |||||
throw new IllegalStateException(e); | |||||
} | } | ||||
} | } | ||||
}) | }) | ||||
response.stream().setMediaType("application/java-archive"); | response.stream().setMediaType("application/java-archive"); | ||||
FileUtils.copyFile(batchIndex.getFile(filename), response.stream().output()); | FileUtils.copyFile(batchIndex.getFile(filename), response.stream().output()); | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
throw new IllegalStateException("Fail to send batch file " + filename, e); | |||||
throw new IllegalStateException(e); | |||||
} | } | ||||
} | } | ||||
}) | }) |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.server.batch; | |||||
import org.apache.commons.io.IOUtils; | |||||
import org.sonar.api.server.ws.Request; | |||||
import org.sonar.api.server.ws.RequestHandler; | |||||
import org.sonar.api.server.ws.Response; | |||||
import org.sonar.api.server.ws.WebService; | |||||
import org.sonar.batch.protocol.input.GlobalReferentials; | |||||
import org.sonar.core.measure.db.MetricDto; | |||||
import org.sonar.core.persistence.DbSession; | |||||
import org.sonar.core.persistence.MyBatis; | |||||
import org.sonar.server.db.DbClient; | |||||
import org.sonar.server.plugins.MimeTypes; | |||||
public class GlobalReferentialsAction implements RequestHandler { | |||||
private final DbClient dbClient; | |||||
public GlobalReferentialsAction(DbClient dbClient) { | |||||
this.dbClient = dbClient; | |||||
} | |||||
void define(WebService.NewController controller) { | |||||
controller.createAction("global") | |||||
.setDescription("Return global referentials") | |||||
.setSince("4.5") | |||||
.setInternal(true) | |||||
.setHandler(this); | |||||
} | |||||
@Override | |||||
public void handle(Request request, Response response) throws Exception { | |||||
// TODO check user permission | |||||
DbSession session = dbClient.openSession(false); | |||||
try { | |||||
GlobalReferentials ref = new GlobalReferentials(); | |||||
for (MetricDto metric : dbClient.metricDao().findEnabled(session)) { | |||||
Boolean optimizedBestValue = metric.isOptimizedBestValue(); | |||||
ref.metrics().add( | |||||
new org.sonar.batch.protocol.input.Metric(metric.getId(), metric.getKey(), | |||||
metric.getValueType(), | |||||
metric.getDescription(), | |||||
metric.getDirection(), | |||||
metric.getName(), | |||||
metric.isQualitative(), | |||||
metric.isUserManaged(), | |||||
metric.getWorstValue(), | |||||
metric.getBestValue(), | |||||
optimizedBestValue != null ? optimizedBestValue : false)); | |||||
} | |||||
response.stream().setMediaType(MimeTypes.JSON); | |||||
IOUtils.write(ref.toJson(), response.stream().output()); | |||||
} finally { | |||||
MyBatis.closeQuietly(session); | |||||
} | |||||
} | |||||
} |
import org.sonar.server.activity.db.ActivityDao; | import org.sonar.server.activity.db.ActivityDao; | ||||
import org.sonar.server.component.persistence.ComponentDao; | import org.sonar.server.component.persistence.ComponentDao; | ||||
import org.sonar.server.measure.persistence.MeasureDao; | import org.sonar.server.measure.persistence.MeasureDao; | ||||
import org.sonar.server.measure.persistence.MetricDao; | |||||
import org.sonar.server.qualityprofile.db.ActiveRuleDao; | import org.sonar.server.qualityprofile.db.ActiveRuleDao; | ||||
import org.sonar.server.rule.db.RuleDao; | import org.sonar.server.rule.db.RuleDao; | ||||
private final ComponentDao componentDao; | private final ComponentDao componentDao; | ||||
private final ResourceDao resourceDao; | private final ResourceDao resourceDao; | ||||
private final MeasureDao measureDao; | private final MeasureDao measureDao; | ||||
private final MetricDao metricDao; | |||||
private final ActivityDao activityDao; | private final ActivityDao activityDao; | ||||
private final AuthorizationDao authorizationDao; | private final AuthorizationDao authorizationDao; | ||||
private final UserDao userDao; | private final UserDao userDao; | ||||
componentDao = getDao(map, ComponentDao.class); | componentDao = getDao(map, ComponentDao.class); | ||||
resourceDao = getDao(map, ResourceDao.class); | resourceDao = getDao(map, ResourceDao.class); | ||||
measureDao = getDao(map, MeasureDao.class); | measureDao = getDao(map, MeasureDao.class); | ||||
metricDao = getDao(map, MetricDao.class); | |||||
activityDao = getDao(map, ActivityDao.class); | activityDao = getDao(map, ActivityDao.class); | ||||
authorizationDao = getDao(map, AuthorizationDao.class); | authorizationDao = getDao(map, AuthorizationDao.class); | ||||
userDao = getDao(map, UserDao.class); | userDao = getDao(map, UserDao.class); | ||||
return measureDao; | return measureDao; | ||||
} | } | ||||
public MetricDao metricDao() { | |||||
return metricDao; | |||||
} | |||||
public ActivityDao activityDao() { | public ActivityDao activityDao() { | ||||
return activityDao; | return activityDao; | ||||
} | } |
@Override | @Override | ||||
protected MeasureDto doGetNullableByKey(DbSession session, MeasureKey key) { | protected MeasureDto doGetNullableByKey(DbSession session, MeasureKey key) { | ||||
return session.getMapper(MeasureMapper.class).selectByKey(key); | |||||
return mapper(session).selectByKey(key); | |||||
} | } | ||||
public boolean existsByKey(MeasureKey key, DbSession session) { | public boolean existsByKey(MeasureKey key, DbSession session) { | ||||
return session.getMapper(MeasureMapper.class).countByKey(key) > 0; | |||||
return mapper(session).countByKey(key) > 0; | |||||
} | } | ||||
public List<MeasureDto> findByComponentKeyAndMetricKeys(String componentKey, List<String> metricKeys, DbSession session) { | public List<MeasureDto> findByComponentKeyAndMetricKeys(String componentKey, List<String> metricKeys, DbSession session) { | ||||
List<MeasureDto> dtos = newArrayList(); | List<MeasureDto> dtos = newArrayList(); | ||||
List<List<String>> partitions = Lists.partition(newArrayList(metricKeys), 1000); | List<List<String>> partitions = Lists.partition(newArrayList(metricKeys), 1000); | ||||
for (List<String> partition : partitions) { | for (List<String> partition : partitions) { | ||||
dtos.addAll(session.getMapper(MeasureMapper.class).selectByComponentAndMetrics(componentKey, partition)); | |||||
dtos.addAll(mapper(session).selectByComponentAndMetrics(componentKey, partition)); | |||||
} | } | ||||
return dtos; | return dtos; | ||||
} | } | ||||
public MeasureDto findByComponentKeyAndMetricKey(String componentKey, String metricKey, DbSession session) { | public MeasureDto findByComponentKeyAndMetricKey(String componentKey, String metricKey, DbSession session) { | ||||
return session.getMapper(MeasureMapper.class).selectByComponentAndMetric(componentKey, metricKey); | |||||
return mapper(session).selectByComponentAndMetric(componentKey, metricKey); | |||||
} | } | ||||
@Override | @Override |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.server.measure.persistence; | |||||
import com.google.common.annotations.VisibleForTesting; | |||||
import org.sonar.api.ServerComponent; | |||||
import org.sonar.api.utils.System2; | |||||
import org.sonar.core.measure.db.MetricDto; | |||||
import org.sonar.core.measure.db.MetricMapper; | |||||
import org.sonar.core.persistence.DaoComponent; | |||||
import org.sonar.core.persistence.DbSession; | |||||
import org.sonar.server.db.BaseDao; | |||||
import java.util.Date; | |||||
import java.util.List; | |||||
public class MetricDao extends BaseDao<MetricMapper, MetricDto, String> implements ServerComponent, DaoComponent { | |||||
public MetricDao() { | |||||
this(System2.INSTANCE); | |||||
} | |||||
@VisibleForTesting | |||||
public MetricDao(System2 system) { | |||||
super(MetricMapper.class, system); | |||||
} | |||||
@Override | |||||
protected MetricDto doGetNullableByKey(DbSession session, String key) { | |||||
return mapper(session).selectByKey(key); | |||||
} | |||||
public List<MetricDto> findEnabled(DbSession session) { | |||||
return mapper(session).selectAllEnabled(); | |||||
} | |||||
@Override | |||||
protected MetricDto doInsert(DbSession session, MetricDto item) { | |||||
throw notImplemented(); | |||||
} | |||||
@Override | |||||
protected MetricDto doUpdate(DbSession session, MetricDto item) { | |||||
throw notImplemented(); | |||||
} | |||||
@Override | |||||
protected void doDeleteByKey(DbSession session, String key) { | |||||
throw notImplemented(); | |||||
} | |||||
@Override | |||||
public void synchronizeAfter(DbSession session, Date date) { | |||||
throw notImplemented(); | |||||
} | |||||
private static RuntimeException notImplemented() { | |||||
throw new IllegalStateException("Not implemented yet"); | |||||
} | |||||
} |
import org.sonar.server.authentication.ws.AuthenticationWs; | import org.sonar.server.authentication.ws.AuthenticationWs; | ||||
import org.sonar.server.batch.BatchIndex; | import org.sonar.server.batch.BatchIndex; | ||||
import org.sonar.server.batch.BatchWs; | import org.sonar.server.batch.BatchWs; | ||||
import org.sonar.server.batch.GlobalReferentialsAction; | |||||
import org.sonar.server.charts.ChartFactory; | import org.sonar.server.charts.ChartFactory; | ||||
import org.sonar.server.component.DefaultComponentFinder; | import org.sonar.server.component.DefaultComponentFinder; | ||||
import org.sonar.server.component.DefaultRubyComponentService; | import org.sonar.server.component.DefaultRubyComponentService; | ||||
import org.sonar.server.measure.MeasureFilterExecutor; | import org.sonar.server.measure.MeasureFilterExecutor; | ||||
import org.sonar.server.measure.MeasureFilterFactory; | import org.sonar.server.measure.MeasureFilterFactory; | ||||
import org.sonar.server.measure.persistence.MeasureDao; | import org.sonar.server.measure.persistence.MeasureDao; | ||||
import org.sonar.server.measure.persistence.MetricDao; | |||||
import org.sonar.server.measure.ws.TimeMachineWs; | import org.sonar.server.measure.ws.TimeMachineWs; | ||||
import org.sonar.server.notifications.NotificationCenter; | import org.sonar.server.notifications.NotificationCenter; | ||||
import org.sonar.server.notifications.NotificationService; | import org.sonar.server.notifications.NotificationService; | ||||
RuleDao.class, | RuleDao.class, | ||||
ActiveRuleDao.class, | ActiveRuleDao.class, | ||||
MeasureDao.class, | MeasureDao.class, | ||||
MetricDao.class, | |||||
ComponentDao.class, | ComponentDao.class, | ||||
DbClient.class, | DbClient.class, | ||||
MeasureFilterDao.class, | MeasureFilterDao.class, | ||||
DefaultServerUpgradeStatus.class, | DefaultServerUpgradeStatus.class, | ||||
DatabaseMigrator.class, | DatabaseMigrator.class, | ||||
// batch | |||||
BatchIndex.class, | |||||
BatchWs.class, | |||||
// plugins | // plugins | ||||
ServerPluginJarsInstaller.class, | ServerPluginJarsInstaller.class, | ||||
ServerPluginJarInstaller.class, | ServerPluginJarInstaller.class, | ||||
pico.addSingleton(Periods.class); | pico.addSingleton(Periods.class); | ||||
pico.addSingleton(ServerWs.class); | pico.addSingleton(ServerWs.class); | ||||
// batch | |||||
pico.addSingleton(BatchIndex.class); | |||||
pico.addSingleton(GlobalReferentialsAction.class); | |||||
pico.addSingleton(BatchWs.class); | |||||
// update center | // update center | ||||
pico.addSingleton(UpdateCenterClient.class); | pico.addSingleton(UpdateCenterClient.class); | ||||
pico.addSingleton(UpdateCenterMatrixFactory.class); | pico.addSingleton(UpdateCenterMatrixFactory.class); |
import org.junit.runner.RunWith; | import org.junit.runner.RunWith; | ||||
import org.mockito.Mock; | import org.mockito.Mock; | ||||
import org.mockito.runners.MockitoJUnitRunner; | import org.mockito.runners.MockitoJUnitRunner; | ||||
import org.sonar.server.db.DbClient; | |||||
import org.sonar.server.ws.WsTester; | import org.sonar.server.ws.WsTester; | ||||
import java.io.File; | import java.io.File; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import static org.fest.assertions.Assertions.assertThat; | import static org.fest.assertions.Assertions.assertThat; | ||||
import static org.mockito.Mockito.mock; | |||||
import static org.mockito.Mockito.when; | import static org.mockito.Mockito.when; | ||||
@RunWith(MockitoJUnitRunner.class) | @RunWith(MockitoJUnitRunner.class) | ||||
@Before | @Before | ||||
public void before() throws IOException { | public void before() throws IOException { | ||||
tester = new WsTester(new BatchWs(batchIndex)); | |||||
tester = new WsTester(new BatchWs(batchIndex, new GlobalReferentialsAction(mock(DbClient.class)))); | |||||
} | } | ||||
@Test | @Test |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.server.batch; | |||||
import org.junit.Before; | |||||
import org.junit.Test; | |||||
import org.junit.runner.RunWith; | |||||
import org.mockito.Mock; | |||||
import org.mockito.runners.MockitoJUnitRunner; | |||||
import org.sonar.core.measure.db.MetricDto; | |||||
import org.sonar.core.persistence.DbSession; | |||||
import org.sonar.server.db.DbClient; | |||||
import org.sonar.server.measure.persistence.MetricDao; | |||||
import org.sonar.server.ws.WsTester; | |||||
import static com.google.common.collect.Lists.newArrayList; | |||||
import static org.mockito.Mockito.mock; | |||||
import static org.mockito.Mockito.when; | |||||
@RunWith(MockitoJUnitRunner.class) | |||||
public class GlobalReferentialsActionTest { | |||||
@Mock | |||||
DbSession session; | |||||
@Mock | |||||
MetricDao metricDao; | |||||
WsTester tester; | |||||
@Before | |||||
public void setUp() throws Exception { | |||||
DbClient dbClient = mock(DbClient.class); | |||||
when(dbClient.openSession(false)).thenReturn(session); | |||||
when(dbClient.metricDao()).thenReturn(metricDao); | |||||
tester = new WsTester(new BatchWs(mock(BatchIndex.class), new GlobalReferentialsAction(dbClient))); | |||||
} | |||||
@Test | |||||
public void return_global_referentials() throws Exception { | |||||
when(metricDao.findEnabled(session)).thenReturn(newArrayList( | |||||
MetricDto.createFor("coverage").setDescription("Coverage by unit tests").setValueType("PERCENT").setQualitative(true) | |||||
.setWorstValue(0d).setBestValue(100d).setOptimizedBestValue(false).setDirection(1).setEnabled(true) | |||||
)); | |||||
WsTester.TestRequest request = tester.newGetRequest("batch", "global"); | |||||
request.execute().assertJson(getClass(), "return_global_referentials.json"); | |||||
} | |||||
} |
assertThat(dao.existsByKey(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc"), session)).isTrue(); | assertThat(dao.existsByKey(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc"), session)).isTrue(); | ||||
assertThat(dao.existsByKey(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "unknown"), session)).isFalse(); | assertThat(dao.existsByKey(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "unknown"), session)).isFalse(); | ||||
} | } | ||||
@Test(expected = IllegalStateException.class) | |||||
public void insert() throws Exception { | |||||
dao.insert(session, MeasureDto.createFor(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc"))); | |||||
} | |||||
} | } |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.server.measure.persistence; | |||||
import org.junit.After; | |||||
import org.junit.Before; | |||||
import org.junit.Test; | |||||
import org.sonar.core.measure.db.MetricDto; | |||||
import org.sonar.core.persistence.AbstractDaoTestCase; | |||||
import org.sonar.core.persistence.DbSession; | |||||
import static org.fest.assertions.Assertions.assertThat; | |||||
public class MetricDaoTest extends AbstractDaoTestCase { | |||||
DbSession session; | |||||
MetricDao dao; | |||||
@Before | |||||
public void createDao() { | |||||
session = getMyBatis().openSession(false); | |||||
dao = new MetricDao(); | |||||
} | |||||
@After | |||||
public void tearDown() throws Exception { | |||||
session.close(); | |||||
} | |||||
@Test | |||||
public void get_by_key() throws Exception { | |||||
setupData("shared"); | |||||
MetricDto result = dao.getNullableByKey(session, "coverage"); | |||||
assertThat(result.getId()).isEqualTo(2); | |||||
assertThat(result.getName()).isEqualTo("coverage"); | |||||
assertThat(result.getValueType()).isEqualTo("PERCENT"); | |||||
assertThat(result.getDescription()).isEqualTo("Coverage by unit tests"); | |||||
assertThat(result.getDirection()).isEqualTo(1); | |||||
assertThat(result.isQualitative()).isTrue(); | |||||
assertThat(result.isUserManaged()).isFalse(); | |||||
assertThat(result.getWorstValue()).isEqualTo(0d); | |||||
assertThat(result.getBestValue()).isEqualTo(100d); | |||||
assertThat(result.isOptimizedBestValue()).isFalse(); | |||||
assertThat(result.isEnabled()).isTrue(); | |||||
// Disabled metrics are returned | |||||
result = dao.getNullableByKey(session, "disabled"); | |||||
assertThat(result.getId()).isEqualTo(3); | |||||
assertThat(result.isEnabled()).isFalse(); | |||||
} | |||||
@Test | |||||
public void find_all_enabled() throws Exception { | |||||
setupData("shared"); | |||||
assertThat(dao.findEnabled(session)).hasSize(2); | |||||
} | |||||
} |
{ | |||||
"timestamp": 0, | |||||
"metrics": [ | |||||
{ | |||||
"id": 0, | |||||
"key": "coverage", | |||||
"valueType": "PERCENT", | |||||
"description": "Coverage by unit tests", | |||||
"direction": 1, | |||||
"name": "coverage", | |||||
"qualitative": true, | |||||
"userManaged": false, | |||||
"worstValue": 0.0, | |||||
"bestValue": 100.0, | |||||
"optimizedBestValue": false | |||||
} | |||||
], | |||||
"globalSettings": {} | |||||
} |
<!-- | |||||
~ SonarQube, open source software quality management tool. | |||||
~ Copyright (C) 2008-2014 SonarSource | |||||
~ mailto:contact AT sonarsource DOT com | |||||
~ | |||||
~ SonarQube is free software; you can redistribute it and/or | |||||
~ modify it under the terms of the GNU Lesser General Public | |||||
~ License as published by the Free Software Foundation; either | |||||
~ version 3 of the License, or (at your option) any later version. | |||||
~ | |||||
~ SonarQube is distributed in the hope that it will be useful, | |||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
~ Lesser General Public License for more details. | |||||
~ | |||||
~ You should have received a copy of the GNU Lesser General Public License | |||||
~ along with this program; if not, write to the Free Software Foundation, | |||||
~ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
--> | |||||
<dataset> | |||||
<metrics id="1" name="ncloc" val_type="INT" description="Non Commenting Lines of Code" domain="Size" short_name="Lines of code" | |||||
qualitative="[false]" enabled="[true]" worst_value="[null]" optimized_best_value="[null]" best_value="[null]" direction="-1" hidden="[false]"/> | |||||
<metrics id="2" name="coverage" val_type="PERCENT" description="Coverage by unit tests" domain="Tests" short_name="Coverage" | |||||
qualitative="[true]" enabled="[true]" worst_value="0" optimized_best_value="[false]" best_value="100" direction="1" hidden="[false]"/> | |||||
<metrics id="3" name="disabled" val_type="INT" description="[null]" domain="[null]" short_name="disabled" | |||||
qualitative="[false]" enabled="[false]" worst_value="0" optimized_best_value="[true]" best_value="100" direction="1" hidden="[false]"/> | |||||
</dataset> |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.core.measure.db; | |||||
import org.sonar.core.persistence.Dto; | |||||
import javax.annotation.CheckForNull; | |||||
import javax.annotation.Nullable; | |||||
public class MetricDto extends Dto<String> { | |||||
private int id; | |||||
private String name; | |||||
private String valueType; | |||||
private String description; | |||||
private int direction; | |||||
private boolean qualitative; | |||||
private boolean userManaged; | |||||
private Double worstValue; | |||||
private Double bestValue; | |||||
private Boolean optimizedBestValue; | |||||
private boolean enabled; | |||||
private MetricDto() { | |||||
// Nothing here | |||||
} | |||||
public int getId() { | |||||
return id; | |||||
} | |||||
public MetricDto setId(int id) { | |||||
this.id = id; | |||||
return this; | |||||
} | |||||
public String getName() { | |||||
return name; | |||||
} | |||||
public MetricDto setName(String name) { | |||||
this.name = name; | |||||
return this; | |||||
} | |||||
public String getValueType() { | |||||
return valueType; | |||||
} | |||||
public MetricDto setValueType(String valueType) { | |||||
this.valueType = valueType; | |||||
return this; | |||||
} | |||||
/** | |||||
* @return null for manual metrics | |||||
*/ | |||||
@CheckForNull | |||||
public String getDescription() { | |||||
return description; | |||||
} | |||||
public MetricDto setDescription(@Nullable String description) { | |||||
this.description = description; | |||||
return this; | |||||
} | |||||
public int getDirection() { | |||||
return direction; | |||||
} | |||||
public MetricDto setDirection(int direction) { | |||||
this.direction = direction; | |||||
return this; | |||||
} | |||||
public boolean isQualitative() { | |||||
return qualitative; | |||||
} | |||||
public MetricDto setQualitative(boolean qualitative) { | |||||
this.qualitative = qualitative; | |||||
return this; | |||||
} | |||||
public boolean isUserManaged() { | |||||
return userManaged; | |||||
} | |||||
public MetricDto setUserManaged(boolean userManaged) { | |||||
this.userManaged = userManaged; | |||||
return this; | |||||
} | |||||
@CheckForNull | |||||
public Double getWorstValue() { | |||||
return worstValue; | |||||
} | |||||
public MetricDto setWorstValue(@Nullable Double worstValue) { | |||||
this.worstValue = worstValue; | |||||
return this; | |||||
} | |||||
@CheckForNull | |||||
public Double getBestValue() { | |||||
return bestValue; | |||||
} | |||||
public MetricDto setBestValue(@Nullable Double bestValue) { | |||||
this.bestValue = bestValue; | |||||
return this; | |||||
} | |||||
/** | |||||
* @return null for manual metrics | |||||
*/ | |||||
@CheckForNull | |||||
public Boolean isOptimizedBestValue() { | |||||
return optimizedBestValue; | |||||
} | |||||
public MetricDto setOptimizedBestValue(@Nullable Boolean optimizedBestValue) { | |||||
this.optimizedBestValue = optimizedBestValue; | |||||
return this; | |||||
} | |||||
public boolean isEnabled() { | |||||
return enabled; | |||||
} | |||||
public MetricDto setEnabled(boolean enabled) { | |||||
this.enabled = enabled; | |||||
return this; | |||||
} | |||||
@Override | |||||
public String getKey() { | |||||
return name; | |||||
} | |||||
public static MetricDto createFor(String key) { | |||||
return new MetricDto().setName(key); | |||||
} | |||||
} |
/* | |||||
* SonarQube, open source software quality management tool. | |||||
* Copyright (C) 2008-2014 SonarSource | |||||
* mailto:contact AT sonarsource DOT com | |||||
* | |||||
* SonarQube is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* SonarQube is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.core.measure.db; | |||||
import org.apache.ibatis.annotations.Param; | |||||
import java.util.List; | |||||
public interface MetricMapper { | |||||
MetricDto selectByKey(@Param("key") String key); | |||||
List<MetricDto> selectAllEnabled(); | |||||
} |
import org.apache.ibatis.builder.xml.XMLMapperBuilder; | import org.apache.ibatis.builder.xml.XMLMapperBuilder; | ||||
import org.apache.ibatis.logging.LogFactory; | import org.apache.ibatis.logging.LogFactory; | ||||
import org.apache.ibatis.mapping.Environment; | import org.apache.ibatis.mapping.Environment; | ||||
import org.apache.ibatis.session.Configuration; | |||||
import org.apache.ibatis.session.ExecutorType; | |||||
import org.apache.ibatis.session.SqlSession; | |||||
import org.apache.ibatis.session.SqlSessionFactory; | |||||
import org.apache.ibatis.session.SqlSessionFactoryBuilder; | |||||
import org.apache.ibatis.session.*; | |||||
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; | import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; | ||||
import org.apache.ibatis.type.JdbcType; | import org.apache.ibatis.type.JdbcType; | ||||
import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
import org.sonar.core.component.ComponentDto; | import org.sonar.core.component.ComponentDto; | ||||
import org.sonar.core.component.db.ComponentMapper; | import org.sonar.core.component.db.ComponentMapper; | ||||
import org.sonar.core.config.Logback; | import org.sonar.core.config.Logback; | ||||
import org.sonar.core.dashboard.ActiveDashboardDto; | |||||
import org.sonar.core.dashboard.ActiveDashboardMapper; | |||||
import org.sonar.core.dashboard.DashboardDto; | |||||
import org.sonar.core.dashboard.DashboardMapper; | |||||
import org.sonar.core.dashboard.WidgetDto; | |||||
import org.sonar.core.dashboard.WidgetMapper; | |||||
import org.sonar.core.dashboard.WidgetPropertyDto; | |||||
import org.sonar.core.dashboard.WidgetPropertyMapper; | |||||
import org.sonar.core.dashboard.*; | |||||
import org.sonar.core.dependency.DependencyDto; | import org.sonar.core.dependency.DependencyDto; | ||||
import org.sonar.core.dependency.DependencyMapper; | import org.sonar.core.dependency.DependencyMapper; | ||||
import org.sonar.core.dependency.ResourceSnapshotDto; | import org.sonar.core.dependency.ResourceSnapshotDto; | ||||
import org.sonar.core.duplication.DuplicationUnitDto; | import org.sonar.core.duplication.DuplicationUnitDto; | ||||
import org.sonar.core.graph.jdbc.GraphDto; | import org.sonar.core.graph.jdbc.GraphDto; | ||||
import org.sonar.core.graph.jdbc.GraphDtoMapper; | import org.sonar.core.graph.jdbc.GraphDtoMapper; | ||||
import org.sonar.core.issue.db.ActionPlanDto; | |||||
import org.sonar.core.issue.db.ActionPlanMapper; | |||||
import org.sonar.core.issue.db.ActionPlanStatsDto; | |||||
import org.sonar.core.issue.db.ActionPlanStatsMapper; | |||||
import org.sonar.core.issue.db.IssueChangeDto; | |||||
import org.sonar.core.issue.db.IssueChangeMapper; | |||||
import org.sonar.core.issue.db.IssueDto; | |||||
import org.sonar.core.issue.db.IssueFilterDto; | |||||
import org.sonar.core.issue.db.IssueFilterFavouriteDto; | |||||
import org.sonar.core.issue.db.IssueFilterFavouriteMapper; | |||||
import org.sonar.core.issue.db.IssueFilterMapper; | |||||
import org.sonar.core.issue.db.IssueMapper; | |||||
import org.sonar.core.issue.db.IssueStatsMapper; | |||||
import org.sonar.core.measure.db.MeasureDto; | |||||
import org.sonar.core.measure.db.MeasureFilterDto; | |||||
import org.sonar.core.measure.db.MeasureFilterMapper; | |||||
import org.sonar.core.measure.db.MeasureMapper; | |||||
import org.sonar.core.issue.db.*; | |||||
import org.sonar.core.measure.db.*; | |||||
import org.sonar.core.notification.db.NotificationQueueDto; | import org.sonar.core.notification.db.NotificationQueueDto; | ||||
import org.sonar.core.notification.db.NotificationQueueMapper; | import org.sonar.core.notification.db.NotificationQueueMapper; | ||||
import org.sonar.core.permission.GroupWithPermissionDto; | |||||
import org.sonar.core.permission.PermissionTemplateDto; | |||||
import org.sonar.core.permission.PermissionTemplateGroupDto; | |||||
import org.sonar.core.permission.PermissionTemplateMapper; | |||||
import org.sonar.core.permission.PermissionTemplateUserDto; | |||||
import org.sonar.core.permission.UserWithPermissionDto; | |||||
import org.sonar.core.permission.*; | |||||
import org.sonar.core.persistence.migration.v44.Migration44Mapper; | import org.sonar.core.persistence.migration.v44.Migration44Mapper; | ||||
import org.sonar.core.properties.PropertiesMapper; | import org.sonar.core.properties.PropertiesMapper; | ||||
import org.sonar.core.properties.PropertyDto; | import org.sonar.core.properties.PropertyDto; | ||||
import org.sonar.core.purge.PurgeMapper; | import org.sonar.core.purge.PurgeMapper; | ||||
import org.sonar.core.purge.PurgeableSnapshotDto; | import org.sonar.core.purge.PurgeableSnapshotDto; | ||||
import org.sonar.core.qualitygate.db.ProjectQgateAssociationDto; | |||||
import org.sonar.core.qualitygate.db.ProjectQgateAssociationMapper; | |||||
import org.sonar.core.qualitygate.db.QualityGateConditionDto; | |||||
import org.sonar.core.qualitygate.db.QualityGateConditionMapper; | |||||
import org.sonar.core.qualitygate.db.QualityGateDto; | |||||
import org.sonar.core.qualitygate.db.QualityGateMapper; | |||||
import org.sonar.core.qualityprofile.db.ActiveRuleDto; | |||||
import org.sonar.core.qualityprofile.db.ActiveRuleMapper; | |||||
import org.sonar.core.qualityprofile.db.ActiveRuleParamDto; | |||||
import org.sonar.core.qualityprofile.db.QualityProfileDto; | |||||
import org.sonar.core.qualityprofile.db.QualityProfileMapper; | |||||
import org.sonar.core.resource.ResourceDto; | |||||
import org.sonar.core.resource.ResourceIndexDto; | |||||
import org.sonar.core.resource.ResourceIndexerMapper; | |||||
import org.sonar.core.resource.ResourceKeyUpdaterMapper; | |||||
import org.sonar.core.resource.ResourceMapper; | |||||
import org.sonar.core.resource.SnapshotDto; | |||||
import org.sonar.core.qualitygate.db.*; | |||||
import org.sonar.core.qualityprofile.db.*; | |||||
import org.sonar.core.resource.*; | |||||
import org.sonar.core.rule.RuleDto; | import org.sonar.core.rule.RuleDto; | ||||
import org.sonar.core.rule.RuleMapper; | import org.sonar.core.rule.RuleMapper; | ||||
import org.sonar.core.rule.RuleParamDto; | import org.sonar.core.rule.RuleParamDto; | ||||
import org.sonar.core.technicaldebt.db.RequirementMigrationDto; | import org.sonar.core.technicaldebt.db.RequirementMigrationDto; | ||||
import org.sonar.core.template.LoadedTemplateDto; | import org.sonar.core.template.LoadedTemplateDto; | ||||
import org.sonar.core.template.LoadedTemplateMapper; | import org.sonar.core.template.LoadedTemplateMapper; | ||||
import org.sonar.core.user.AuthorDto; | |||||
import org.sonar.core.user.AuthorMapper; | |||||
import org.sonar.core.user.GroupDto; | |||||
import org.sonar.core.user.GroupMembershipDto; | |||||
import org.sonar.core.user.GroupMembershipMapper; | |||||
import org.sonar.core.user.GroupRoleDto; | |||||
import org.sonar.core.user.RoleMapper; | |||||
import org.sonar.core.user.UserDto; | |||||
import org.sonar.core.user.UserMapper; | |||||
import org.sonar.core.user.UserRoleDto; | |||||
import org.sonar.core.user.*; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
private final Logback logback; | private final Logback logback; | ||||
private SqlSessionFactory sessionFactory; | private SqlSessionFactory sessionFactory; | ||||
//TODO this queue should directly be an IndexQueue. Pending move of persistence to sonar-server | |||||
// TODO this queue should directly be an IndexQueue. Pending move of persistence to sonar-server | |||||
private WorkQueue queue; | private WorkQueue queue; | ||||
public MyBatis(Database database, Logback logback, WorkQueue queue) { | public MyBatis(Database database, Logback logback, WorkQueue queue) { | ||||
loadAlias(conf, "WidgetProperty", WidgetPropertyDto.class); | loadAlias(conf, "WidgetProperty", WidgetPropertyDto.class); | ||||
loadAlias(conf, "MeasureModel", MeasureModel.class); | loadAlias(conf, "MeasureModel", MeasureModel.class); | ||||
loadAlias(conf, "Measure", MeasureDto.class); | loadAlias(conf, "Measure", MeasureDto.class); | ||||
loadAlias(conf, "Metric", MetricDto.class); | |||||
loadAlias(conf, "Issue", IssueDto.class); | loadAlias(conf, "Issue", IssueDto.class); | ||||
loadAlias(conf, "IssueChange", IssueChangeDto.class); | loadAlias(conf, "IssueChange", IssueChangeDto.class); | ||||
loadAlias(conf, "IssueFilter", IssueFilterDto.class); | loadAlias(conf, "IssueFilter", IssueFilterDto.class); | ||||
org.sonar.api.database.model.MeasureMapper.class, SnapshotDataMapper.class, SnapshotSourceMapper.class, ActionPlanMapper.class, ActionPlanStatsMapper.class, | org.sonar.api.database.model.MeasureMapper.class, SnapshotDataMapper.class, SnapshotSourceMapper.class, ActionPlanMapper.class, ActionPlanStatsMapper.class, | ||||
NotificationQueueMapper.class, CharacteristicMapper.class, | NotificationQueueMapper.class, CharacteristicMapper.class, | ||||
GroupMembershipMapper.class, QualityProfileMapper.class, ActiveRuleMapper.class, | GroupMembershipMapper.class, QualityProfileMapper.class, ActiveRuleMapper.class, | ||||
MeasureMapper.class, QualityGateMapper.class, QualityGateConditionMapper.class, ComponentMapper.class, ProjectQgateAssociationMapper.class | |||||
MeasureMapper.class, MetricMapper.class, QualityGateMapper.class, QualityGateConditionMapper.class, ComponentMapper.class, ProjectQgateAssociationMapper.class | |||||
}; | }; | ||||
loadMappers(conf, mappers); | loadMappers(conf, mappers); | ||||
configureLogback(mappers); | configureLogback(mappers); |
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<!-- | |||||
~ SonarQube, open source software quality management tool. | |||||
~ Copyright (C) 2008-2014 SonarSource | |||||
~ mailto:contact AT sonarsource DOT com | |||||
~ | |||||
~ SonarQube is free software; you can redistribute it and/or | |||||
~ modify it under the terms of the GNU Lesser General Public | |||||
~ License as published by the Free Software Foundation; either | |||||
~ version 3 of the License, or (at your option) any later version. | |||||
~ | |||||
~ SonarQube is distributed in the hope that it will be useful, | |||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
~ Lesser General Public License for more details. | |||||
~ | |||||
~ You should have received a copy of the GNU Lesser General Public License | |||||
~ along with this program; if not, write to the Free Software Foundation, | |||||
~ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
--> | |||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||||
<mapper namespace="org.sonar.core.measure.db.MetricMapper"> | |||||
<sql id="metricColumns"> | |||||
m.id, | |||||
m.name, | |||||
m.val_type as valueType, | |||||
m.description, | |||||
m.direction, | |||||
m.qualitative, | |||||
m.user_managed as userManaged, | |||||
m.worst_value as worstValue, | |||||
m.best_value as bestValue, | |||||
m.optimized_best_value as optimizedBestValue, | |||||
m.enabled | |||||
</sql> | |||||
<select id="selectByKey" parameterType="map" resultType="Metric"> | |||||
SELECT | |||||
<include refid="metricColumns"/> | |||||
FROM metrics m | |||||
<where> | |||||
AND m.name=#{key} | |||||
</where> | |||||
</select> | |||||
<select id="selectAllEnabled" parameterType="map" resultType="Metric"> | |||||
SELECT | |||||
<include refid="metricColumns"/> | |||||
FROM metrics m | |||||
<where> | |||||
AND m.enabled=${_true} | |||||
</where> | |||||
</select> | |||||
</mapper> |