import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
-import javax.annotation.Nullable;
import org.apache.ibatis.logging.LogFactory;
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.sonar.api.Startable;
-import org.sonar.api.utils.log.Loggers;
import org.sonar.db.ce.CeActivityMapper;
import org.sonar.db.ce.CeQueueMapper;
import org.sonar.db.ce.CeScannerContextMapper;
this.database = database;
}
- /**
- * @deprecated please use try-with-resources
- */
- @Deprecated
- public static void closeQuietly(@Nullable DbSession session) {
- if (session != null) {
- try {
- session.close();
- } catch (Exception e) {
- Loggers.get(MyBatis.class).warn("Fail to close db session", e);
- // do not re-throw the exception
- }
- }
- }
-
@Override
public void start() {
LogFactory.useSlf4jLogging();
@Override
protected void after() {
if (session != null) {
- MyBatis.closeQuietly(session);
+ session.close();
}
db.stop();
started = false;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
-import org.apache.ibatis.session.ResultContext;
-import org.apache.ibatis.session.ResultHandler;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.issue.IssueDto;
import org.sonar.db.issue.IssueMapper;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
}
public List<DefaultIssue> loadForComponentUuid(String componentUuid) {
- DbSession session = dbClient.openSession(false);
- final List<DefaultIssue> result = new ArrayList<>();
- try {
- session.getMapper(IssueMapper.class).selectNonClosedByComponentUuid(componentUuid, new ResultHandler() {
- @Override
- public void handleResult(ResultContext resultContext) {
- DefaultIssue issue = ((IssueDto) resultContext.getResultObject()).toDefaultIssue();
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ List<DefaultIssue> result = new ArrayList<>();
+ dbSession.getMapper(IssueMapper.class).selectNonClosedByComponentUuid(componentUuid, resultContext -> {
+ DefaultIssue issue = ((IssueDto) resultContext.getResultObject()).toDefaultIssue();
- // TODO this field should be set outside this class
- if (!isActive(issue.ruleKey()) || ruleRepository.getByKey(issue.ruleKey()).getStatus() == RuleStatus.REMOVED) {
- issue.setOnDisabledRule(true);
- // TODO to be improved, why setOnDisabledRule(true) is not enough ?
- issue.setBeingClosed(true);
- }
- // FIXME
- issue.setSelectedAt(System.currentTimeMillis());
- result.add(issue);
+ // TODO this field should be set outside this class
+ if (!isActive(issue.ruleKey()) || ruleRepository.getByKey(issue.ruleKey()).getStatus() == RuleStatus.REMOVED) {
+ issue.setOnDisabledRule(true);
+ // TODO to be improved, why setOnDisabledRule(true) is not enough ?
+ issue.setBeingClosed(true);
}
+ // FIXME
+ issue.setSelectedAt(System.currentTimeMillis());
+ result.add(issue);
});
return result;
- } finally {
- MyBatis.closeQuietly(session);
}
}
* Uuids of all the components that have open issues on this project.
*/
public Set<String> loadUuidsOfComponentsWithOpenIssues() {
- DbSession session = dbClient.openSession(false);
- try {
- return dbClient.issueDao().selectComponentUuidsOfOpenIssuesForProjectUuid(session, treeRootHolder.getRoot().getUuid());
- } finally {
- MyBatis.closeQuietly(session);
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ return dbClient.issueDao().selectComponentUuidsOfOpenIssuesForProjectUuid(dbSession, treeRootHolder.getRoot().getUuid());
}
}
}
import org.sonar.core.issue.tracking.LineHashSequence;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.filemove.MovedFilesRepository;
import org.sonar.server.computation.task.projectanalysis.filemove.MovedFilesRepository.OriginalFile;
if (component.getType() != Component.Type.FILE) {
return EMPTY_LINE_HASH_SEQUENCE;
}
-
- DbSession session = dbClient.openSession(false);
- try {
+
+ try (DbSession session = dbClient.openSession(false)) {
List<String> hashes = dbClient.fileSourceDao().selectLineHashes(session, effectiveUuid);
if (hashes == null || hashes.isEmpty()) {
return EMPTY_LINE_HASH_SEQUENCE;
}
return new LineHashSequence(hashes);
- } finally {
- MyBatis.closeQuietly(session);
}
}
import org.apache.commons.lang.math.NumberUtils;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.measure.custom.CustomMeasureDto;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.ComponentVisitor;
@Override
public void execute() {
new DepthTraversalTypeAwareCrawler(
- new TypeAwareVisitorAdapter(CrawlerDepthLimit.LEAVES, ComponentVisitor.Order.PRE_ORDER) {
- @Override
- public void visitAny(Component component) {
- copy(component);
- }
- }).visit(treeRootHolder.getRoot());
+ new TypeAwareVisitorAdapter(CrawlerDepthLimit.LEAVES, ComponentVisitor.Order.PRE_ORDER) {
+ @Override
+ public void visitAny(Component component) {
+ copy(component);
+ }
+ }).visit(treeRootHolder.getRoot());
}
private void copy(Component component) {
}
private List<CustomMeasureDto> loadCustomMeasures(Component component) {
- DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession session = dbClient.openSession(false)) {
return dbClient.customMeasureDao().selectByComponentUuid(session, component.getUuid());
- } finally {
- MyBatis.closeQuietly(session);
}
}
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.component.Component;
import org.sonar.server.computation.task.projectanalysis.component.TreeRootHolder;
@Override
public void execute() {
- DbSession dbSession = dbClient.openSession(false);
- try {
+ try (DbSession dbSession = dbClient.openSession(false)) {
Component project = treeRootHolder.getRoot();
dbClient.snapshotDao().switchIsLastFlagAndSetProcessedStatus(dbSession, project.getUuid(), analysisMetadataHolder.getUuid());
dbClient.componentDao().applyBChangesForRootComponentUuid(dbSession, project.getUuid());
dbSession.commit();
-
- } finally {
- MyBatis.closeQuietly(dbSession);
}
}
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.event.EventDto;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.server.computation.task.projectanalysis.component.Component;
@Override
public void execute() {
- final DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession dbSession = dbClient.openSession(false)) {
long analysisDate = analysisMetadataHolder.getAnalysisDate();
- new DepthTraversalTypeAwareCrawler(new PersistEventComponentVisitor(session, analysisDate))
+ new DepthTraversalTypeAwareCrawler(new PersistEventComponentVisitor(dbSession, analysisDate))
.visit(treeRootHolder.getRoot());
- session.commit();
- } finally {
- MyBatis.closeQuietly(session);
+ dbSession.commit();
}
}
import org.sonar.core.util.CloseableIterator;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.protobuf.DbFileSources;
import org.sonar.db.source.FileSourceDto;
import org.sonar.db.source.FileSourceDto.Type;
@Override
public void execute() {
// Don't use batch insert for file_sources since keeping all data in memory can produce OOM for big files
- DbSession session = dbClient.openSession(false);
- try {
- new DepthTraversalTypeAwareCrawler(new FileSourceVisitor(session))
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ new DepthTraversalTypeAwareCrawler(new FileSourceVisitor(dbSession))
.visit(treeRootHolder.getRoot());
- } finally {
- MyBatis.closeQuietly(session);
}
}
import org.sonar.core.util.CloseableIterator;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.issue.IssueChangeDto;
import org.sonar.db.issue.IssueChangeMapper;
import org.sonar.db.issue.IssueDto;
@Override
public void execute() {
- DbSession session = dbClient.openSession(true);
- IssueMapper mapper = session.getMapper(IssueMapper.class);
- IssueChangeMapper changeMapper = session.getMapper(IssueChangeMapper.class);
+ try (DbSession dbSession = dbClient.openSession(true);
+ CloseableIterator<DefaultIssue> issues = issueCache.traverse()) {
- CloseableIterator<DefaultIssue> issues = issueCache.traverse();
- try {
+ IssueMapper mapper = dbSession.getMapper(IssueMapper.class);
+ IssueChangeMapper changeMapper = dbSession.getMapper(IssueChangeMapper.class);
while (issues.hasNext()) {
DefaultIssue issue = issues.next();
boolean saved = persistIssueIfRequired(mapper, issue);
insertChanges(changeMapper, issue);
}
}
- session.flushStatements();
- session.commit();
- } finally {
- MyBatis.closeQuietly(session);
- issues.close();
+ dbSession.flushStatements();
+ dbSession.commit();
}
}
import org.sonar.api.i18n.I18n;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.component.ComponentLinkDto;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.scanner.protocol.output.ScannerReport.ComponentLink.ComponentLinkType;
@Override
public void execute() {
- DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession session = dbClient.openSession(false)) {
new DepthTraversalTypeAwareCrawler(new ProjectLinkVisitor(session))
.visit(treeRootHolder.getRoot());
session.commit();
- } finally {
- MyBatis.closeQuietly(session);
}
}
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.protobuf.DbFileSources;
import org.sonar.db.source.FileSourceDto;
import org.sonar.db.source.FileSourceDto.Type;
@Override
public void execute() {
- DbSession session = dbClient.openSession(true);
- try {
- TestDepthTraversalTypeAwareVisitor visitor = new TestDepthTraversalTypeAwareVisitor(session);
+ try (DbSession dbSession = dbClient.openSession(true)) {
+ TestDepthTraversalTypeAwareVisitor visitor = new TestDepthTraversalTypeAwareVisitor(dbSession);
new DepthTraversalTypeAwareCrawler(visitor).visit(treeRootHolder.getRoot());
- session.commit();
+ dbSession.commit();
if (visitor.hasUnprocessedCoverageDetails) {
LOG.warn("Some coverage tests are not taken into account during analysis of project '{}'", visitor.getProjectKey());
}
- } finally {
- MyBatis.closeQuietly(session);
}
}
import org.sonar.db.BatchSession;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.issue.IssueChangeDto;
import org.sonar.db.issue.IssueChangeMapper;
}
public void save(Iterable<DefaultIssue> issues) {
- DbSession session = dbClient.openSession(true);
- try {
+ try (DbSession session = dbClient.openSession(true)) {
doSave(session, issues);
- } finally {
- MyBatis.closeQuietly(session);
}
}
// Batch session can not be used for updates. It does not return the number of updated rows,
// required for detecting conflicts.
long now = system2.now();
-
+
Map<Boolean, List<DefaultIssue>> issuesNewOrUpdated = StreamSupport.stream(issues.spliterator(), true).collect(Collectors.groupingBy(DefaultIssue::isNew));
List<DefaultIssue> issuesToInsert = firstNonNull(issuesNewOrUpdated.get(true), emptyList());
List<DefaultIssue> issuesToUpdate = firstNonNull(issuesNewOrUpdated.get(false), emptyList());
-
+
Collection<String> inserted = insert(session, issuesToInsert, now);
Collection<String> updated = update(issuesToUpdate, now);
-
+
Collection<String> issuesInsertedOrUpdated = new ArrayList<>(issuesToInsert.size() + issuesToUpdate.size());
issuesInsertedOrUpdated.addAll(inserted);
issuesInsertedOrUpdated.addAll(updated);
private Collection<String> update(List<DefaultIssue> issuesToUpdate, long now) {
Collection<String> updated = new ArrayList<>();
if (!issuesToUpdate.isEmpty()) {
- DbSession session = dbClient.openSession(false);
- try {
- IssueChangeMapper issueChangeMapper = session.getMapper(IssueChangeMapper.class);
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ IssueChangeMapper issueChangeMapper = dbSession.getMapper(IssueChangeMapper.class);
for (DefaultIssue issue : issuesToUpdate) {
- String key = doUpdate(session, now, issue);
+ String key = doUpdate(dbSession, now, issue);
updated.add(key);
insertChanges(issueChangeMapper, issue);
}
- session.commit();
- } finally {
- MyBatis.closeQuietly(session);
+ dbSession.commit();
}
}
return updated;
import org.sonar.api.utils.Durations;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.rule.RuleDto;
import org.sonar.server.issue.notification.NewIssuesStatistics.Metric;
import org.sonar.server.user.index.UserDoc;
public NewIssuesNotification setStatistics(String projectName, NewIssuesStatistics.Stats stats) {
setDefaultMessage(stats.countForMetric(SEVERITY) + " new issues on " + projectName + ".\n");
- DbSession dbSession = dbClient.openSession(false);
- try {
+ try (DbSession dbSession = dbClient.openSession(false)) {
setSeverityStatistics(stats);
setAssigneesStatistics(stats);
setTagsStatistics(stats);
setComponentsStatistics(dbSession, stats);
setRuleStatistics(dbSession, stats);
- } finally {
- MyBatis.closeQuietly(dbSession);
}
return this;
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.metric.MetricDto;
import org.sonar.server.component.ComponentFinder;
@Override
public void handle(Request request, Response response) throws Exception {
- DbSession dbSession = dbClient.openSession(false);
-
- try {
+ try (DbSession dbSession = dbClient.openSession(false)) {
ComponentDto project = componentFinder.getByUuidOrKey(dbSession, request.param(CreateAction.PARAM_PROJECT_ID), request.param(CreateAction.PARAM_PROJECT_KEY),
PROJECT_ID_AND_KEY);
checkPermissions(userSession, project);
List<MetricDto> metrics = searchMetrics(dbSession, project);
writeResponse(response.newJsonWriter(), metrics);
- } finally {
- MyBatis.closeQuietly(dbSession);
}
}
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.SnapshotDto;
import org.sonar.db.measure.custom.CustomMeasureDto;
.setPage(request.mandatoryParamAsInt(WebService.Param.PAGE),
request.mandatoryParamAsInt(WebService.Param.PAGE_SIZE));
- DbSession dbSession = dbClient.openSession(false);
- try {
+ try (DbSession dbSession = dbClient.openSession(false)) {
ComponentDto component = componentFinder.getByUuidOrKey(dbSession, projectUuid, projectKey, PROJECT_ID_AND_KEY);
checkPermissions(userSession, component);
Long lastAnalysisDateMs = searchLastSnapshotDate(dbSession, component);
Map<Integer, MetricDto> metricsById = metricsById(dbSession, customMeasures);
writeResponse(response, customMeasures, nbCustomMeasures, component, metricsById, usersByLogin, lastAnalysisDateMs, searchOptions, fieldsToReturn);
- } finally {
- MyBatis.closeQuietly(dbSession);
}
}
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.measure.custom.CustomMeasureDto;
import org.sonar.db.metric.MetricDto;
String description = request.param(PARAM_DESCRIPTION);
checkParameters(value, description);
- DbSession dbSession = dbClient.openSession(true);
- try {
+ try (DbSession dbSession = dbClient.openSession(true)) {
CustomMeasureDto customMeasure = dbClient.customMeasureDao().selectOrFail(dbSession, id);
MetricDto metric = dbClient.metricDao().selectOrFailById(dbSession, customMeasure.getMetricId());
ComponentDto component = dbClient.componentDao().selectOrFailByUuid(dbSession, customMeasure.getComponentUuid());
JsonWriter json = response.newJsonWriter();
customMeasureJsonWriter.write(json, customMeasure, metric, component, user, true, CustomMeasureJsonWriter.OPTIONAL_FIELDS);
json.close();
- } finally {
- MyBatis.closeQuietly(dbSession);
}
}
import org.sonar.api.measures.MetricFinder;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.metric.MetricDto;
import static com.google.common.collect.FluentIterable.from;
@Override
public Metric findById(int id) {
- DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession session = dbClient.openSession(false)) {
MetricDto dto = dbClient.metricDao().selectById(session, id);
if (dto != null && dto.isEnabled()) {
return ToMetric.INSTANCE.apply(dto);
}
return null;
- } finally {
- MyBatis.closeQuietly(session);
}
}
@Override
public Metric findByKey(String key) {
- DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession session = dbClient.openSession(false)) {
MetricDto dto = dbClient.metricDao().selectByKey(session, key);
if (dto != null && dto.isEnabled()) {
return ToMetric.INSTANCE.apply(dto);
}
return null;
- } finally {
- MyBatis.closeQuietly(session);
}
}
@Override
public Collection<Metric> findAll(List<String> metricKeys) {
- DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession session = dbClient.openSession(false)) {
List<MetricDto> dtos = dbClient.metricDao().selectByKeys(session, metricKeys);
return from(dtos).filter(IsEnabled.INSTANCE).transform(ToMetric.INSTANCE).toList();
- } finally {
- MyBatis.closeQuietly(session);
}
}
@Override
public Collection<Metric> findAll() {
- DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession session = dbClient.openSession(false)) {
List<MetricDto> dtos = dbClient.metricDao().selectEnabled(session);
return from(dtos).transform(ToMetric.INSTANCE).toList();
- } finally {
- MyBatis.closeQuietly(session);
}
}
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
public class DomainsAction implements MetricsWsAction {
@Override
public void handle(Request request, Response response) throws Exception {
- DbSession dbSession = dbClient.openSession(false);
- try {
+ try (DbSession dbSession = dbClient.openSession(false)) {
List<String> domains = dbClient.metricDao().selectEnabledDomains(dbSession);
JsonWriter json = response.newJsonWriter();
json.beginObject();
writeDomains(json, domains);
json.endObject();
json.close();
- } finally {
- MyBatis.closeQuietly(dbSession);
}
}
import org.sonar.api.utils.text.JsonWriter;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.metric.MetricDto;
import org.sonar.server.es.SearchOptions;
.setPage(request.mandatoryParamAsInt(Param.PAGE),
request.mandatoryParamAsInt(Param.PAGE_SIZE));
Boolean isCustom = request.paramAsBoolean(PARAM_IS_CUSTOM);
- DbSession dbSession = dbClient.openSession(false);
- try {
+ try (DbSession dbSession = dbClient.openSession(false)) {
List<MetricDto> metrics = dbClient.metricDao().selectEnabled(dbSession, isCustom, searchOptions.getOffset(), searchOptions.getLimit());
int nbMetrics = dbClient.metricDao().countEnabled(dbSession, isCustom);
JsonWriter json = response.newJsonWriter();
searchOptions.writeJson(json, nbMetrics);
json.endObject();
json.close();
- } finally {
- MyBatis.closeQuietly(dbSession);
}
}
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.dbcp.BasicDataSource;
-import org.apache.commons.dbutils.DbUtils;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.server.platform.db.migration.version.DatabaseVersion;
/**
}
private void completeDbAttributes(Map<String, Object> attributes) {
- DbSession dbSession = dbClient.openSession(false);
- Connection connection = dbSession.getConnection();
- try {
+ try (DbSession dbSession = dbClient.openSession(false);
+ Connection connection = dbSession.getConnection()) {
DatabaseMetaData metadata = connection.getMetaData();
attributes.put("Database", metadata.getDatabaseProductName());
attributes.put("Database Version", metadata.getDatabaseProductVersion());
attributes.put("Version Status", getMigrationStatus());
} catch (SQLException e) {
throw new IllegalStateException("Fail to get DB metadata", e);
-
- } finally {
- DbUtils.closeQuietly(connection);
- MyBatis.closeQuietly(dbSession);
}
}
}
import org.sonar.api.utils.log.Profiler;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.db.MyBatis;
import org.sonar.db.metric.MetricDto;
import static com.google.common.collect.FluentIterable.from;
void register(Iterable<Metric> metrics) {
Profiler profiler = Profiler.create(LOG).startInfo("Register metrics");
- DbSession session = dbClient.openSession(false);
- try {
+ try (DbSession session = dbClient.openSession(false)) {
save(session, metrics);
sanitizeQualityGates(session);
session.commit();
- } finally {
- MyBatis.closeQuietly(session);
}
profiler.stopDebug();
}