From: Stephane Gamard Date: Tue, 9 Sep 2014 13:05:27 +0000 (+0200) Subject: Merge branch 'master' into issues-in-es X-Git-Tag: 5.0-RC1~1049 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d7a4731e80067b0ba11ca1d60c0b0eb3eca7277a;p=sonarqube.git Merge branch 'master' into issues-in-es Conflicts: server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java --- d7a4731e80067b0ba11ca1d60c0b0eb3eca7277a diff --cc server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java index 9724eda67f3,c0f8ea5b98f..12e48a0e914 --- a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java @@@ -33,9 -37,16 +37,15 @@@ import org.sonar.server.search.action.U import javax.annotation.CheckForNull; import javax.annotation.Nullable; - import java.io.Serializable; + import java.sql.Timestamp; + import java.util.ArrayList; import java.util.Collection; import java.util.Date; + import java.util.List; + import java.util.Map; + + import static com.google.common.collect.Maps.newHashMap; /** * naming convention for DAO @@@ -277,22 -300,44 +299,51 @@@ public abstract class BaseDao findAfterDate(final DbSession session, Date date) { ++ return session.selectList(getSynchronizeStatementFQN(), getSynchronizationParams(date)); ++ } ++ ++ // Synchronization methods + - ResultHandler synchronizeDtos = new ResultHandler() { ++ protected ResultHandler getSynchronizationResultHandler(final DbSession session){ ++ return new ResultHandler() { + @Override + public void handleResult(ResultContext resultContext) { + DTO dto = (DTO) resultContext.getResultObject(); + session.enqueue(new UpsertDto(getIndexType(), dto, true)); + } + }; ++ } + ++ protected Map getSynchronizationParams(Date date){ ++ Map params = newHashMap(); ++ params.put("date", new Timestamp(date.getTime())); ++ return params; ++ } ++ + @Override + public final void synchronizeAfter(final DbSession session, Date date) { - for (E dto : this.findAfterDate(session, date)) { - session.enqueue(new UpsertDto(getIndexType(), dto, true)); + try { - Map params = newHashMap(); - params.put("date", new Timestamp(date.getTime())); - session.select(getSynchronizeStatementFQN(), params, synchronizeDtos); ++ session.select(getSynchronizeStatementFQN(), getSynchronizationParams(date), getSynchronizationResultHandler(session)); + } catch (Exception e) { + throw new IllegalStateException(e); } session.commit(); } - @VisibleForTesting - public final List findAfterDate(final DbSession session, Date date) { - return session.selectList(getSynchronizeStatementFQN(), new Timestamp(date.getTime())); - } - + private String getSynchronizeStatementFQN() { + return mapperClass.getName() + "." + this.getSynchronizationStatementName(); + } + @CheckForNull - protected abstract E doGetNullableByKey(DbSession session, K key); + protected abstract DTO doGetNullableByKey(DbSession session, KEY key); - protected Iterable findAfterDate(final DbSession session, Date date) { - throw notImplemented(this); + protected String getSynchronizationStatementName() { + return "selectAfterDate"; } - protected E doInsert(DbSession session, E item) { + protected DTO doInsert(DbSession session, DTO item) { throw notImplemented(this); } diff --cc server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java index 3cf1008ca30,37beefb3ceb..38ba30fc39e --- a/server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/DbClient.java @@@ -64,9 -64,9 +65,10 @@@ public class DbClient implements Server private final ActivityDao activityDao; private final AuthorizationDao authorizationDao; private final UserDao userDao; + private final GroupDao groupDao; private final IssueDao issueDao; private final IssueAuthorizationDao issueAuthorizationDao; + private final ActionPlanDao actionPlanDao; public DbClient(Database db, MyBatis myBatis, DaoComponent... daoComponents) { this.db = db; @@@ -89,9 -89,9 +91,10 @@@ activityDao = getDao(map, ActivityDao.class); authorizationDao = getDao(map, AuthorizationDao.class); userDao = getDao(map, UserDao.class); + groupDao = getDao(map, GroupDao.class); issueDao = getDao(map, IssueDao.class); issueAuthorizationDao = getDao(map, IssueAuthorizationDao.class); + actionPlanDao = getDao(map, ActionPlanDao.class); } public Database database() { @@@ -162,10 -162,10 +165,14 @@@ return userDao; } + public GroupDao groupDao() { + return groupDao; + } + + public ActionPlanDao actionPlanDao() { + return actionPlanDao; + } + private K getDao(Map map, Class clazz) { return (K) map.get(clazz); } diff --cc server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java index 4548ec1beee,a4d8c40ac5b..2c7335fbb7c --- a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java @@@ -21,21 -21,14 +21,27 @@@ package org.sonar.server.issue.db; import com.google.common.annotations.VisibleForTesting; ++import com.google.common.collect.ImmutableList; ++import org.apache.ibatis.session.ResultContext; ++import org.apache.ibatis.session.ResultHandler; import org.sonar.api.utils.System2; +import org.sonar.api.web.UserRole; import org.sonar.core.issue.db.IssueAuthorizationDto; import org.sonar.core.issue.db.IssueAuthorizationMapper; import org.sonar.core.persistence.DaoComponent; import org.sonar.core.persistence.DbSession; import org.sonar.server.db.BaseDao; import org.sonar.server.search.IndexDefinition; ++import org.sonar.server.search.action.UpsertDto; + +import java.util.Date; ++import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.google.common.collect.Maps.newHashMap; + + public class IssueAuthorizationDao extends BaseDao implements DaoComponent { public IssueAuthorizationDao() { @@@ -49,38 -42,24 +55,85 @@@ @Override protected IssueAuthorizationDto doGetNullableByKey(DbSession session, String key) { - return mapper(session).selectByKey(key); + throw new IllegalStateException("Not implemented"); } ++ + @Override - protected IssueAuthorizationDto doUpdate(DbSession session, IssueAuthorizationDto issueAuthorization) { - // TODO ? - // mapper(session).update(issueAuthorization); - return issueAuthorization; ++ protected ResultHandler getSynchronizationResultHandler(final DbSession session) { ++ return new ResultHandler() { ++ private final Map authorizationDtoMap = new HashMap(); ++ private int count = 0; ++ @Override ++ public void handleResult(ResultContext context) { ++ Map row = (Map) context.getResultObject(); ++ System.out.println(row); ++ ++ String project = row.get("project"); ++ String user = row.get("user"); ++ String group = row.get("permission_group"); ++ IssueAuthorizationDto issueAuthorizationDto = authorizationDtoMap.get(project); ++ if (issueAuthorizationDto == null) { ++ issueAuthorizationDto = new IssueAuthorizationDto() ++ .setProject(project) ++ .setPermission(UserRole.USER); ++ } ++ if (group != null) { ++ issueAuthorizationDto.addGroup(group); ++ } ++ if (user != null) { ++ issueAuthorizationDto.addUser(user); ++ } ++ authorizationDtoMap.put(project, issueAuthorizationDto); ++ count++; ++ ++ //TODO this sort of breaks the scrollable RS. Should be inline. ++ //Check if this is the last ++ if (count == context.getResultCount()) { ++ for(IssueAuthorizationDto authorization:authorizationDtoMap.values()){ ++ session.enqueue(new UpsertDto(getIndexType(), authorization, true)); ++ } ++ } ++ } ++ }; + } + @Override - protected Iterable findAfterDate(DbSession session, Date date) { - protected IssueAuthorizationDto doInsert(DbSession session, IssueAuthorizationDto issueAuthorization) { - // TODO ? - // Preconditions.checkNotNull(issueAuthorization.getKey(), "Cannot insert IssueAuthorization with empty key!"); - // Preconditions.checkNotNull(issueAuthorization.getPermission(), "Cannot insert IssueAuthorization with no permission!"); - // mapper(session).insert(issueAuthorization); - return issueAuthorization; ++ public List findAfterDate(DbSession session, Date date) { + + Map params = newHashMap(); + params.put("date", date); + params.put("permission", UserRole.USER); + + Map authorizationDtoMap = newHashMap(); + + List> rows = session.selectList("org.sonar.core.issue.db.IssueAuthorizationMapper.selectAfterDate", params); + for (Map row : rows) { + String project = row.get("project"); + String user = row.get("user"); + String group = row.get("permission_group"); + IssueAuthorizationDto issueAuthorizationDto = authorizationDtoMap.get(project); + if (issueAuthorizationDto == null) { + issueAuthorizationDto = new IssueAuthorizationDto() + .setProject(project) + .setPermission(UserRole.USER); + } + if (group != null) { + issueAuthorizationDto.addGroup(group); + } + if (user != null) { + issueAuthorizationDto.addUser(user); + } + authorizationDtoMap.put(project, issueAuthorizationDto); + } + - return authorizationDtoMap.values(); ++ return ImmutableList.copyOf(authorizationDtoMap.values()); + } + - // TODO DO not forget to implement "selectAfterDate" In xml mapping file. ++ @Override ++ protected Map getSynchronizationParams(Date date) { ++ Map params = super.getSynchronizationParams(date); ++ params.put("permission", UserRole.USER); ++ return params; + } } diff --cc server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java index 45ea1ad6b33,1354d41ee47..e37624bdf6b --- a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java @@@ -62,9 -59,8 +59,9 @@@ public class IssueDao extends BaseDao findAfterDate(DbSession session, Date date) { - return mapper(session).selectAfterDate(new Timestamp(date.getTime())); + protected String getSynchronizationStatementName() { + return "selectAfterDate"; } }