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
}
}
- @Override
- public final void synchronizeAfter(final DbSession session, Date date) {
++ @VisibleForTesting
++ public List<DTO> 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<DTO>(getIndexType(), dto, true));
+ }
+ };
++ }
+
++ protected Map getSynchronizationParams(Date date){
++ Map<String, Object> 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<E>(getIndexType(), dto, true));
+ try {
- Map<String, Object> 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<DTO> 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<E> 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);
}
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;
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() {
return userDao;
}
+ public GroupDao groupDao() {
+ return groupDao;
+ }
+
+ public ActionPlanDao actionPlanDao() {
+ return actionPlanDao;
+ }
+
private <K> K getDao(Map<Class, DaoComponent> map, Class<K> clazz) {
return (K) map.get(clazz);
}
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<IssueAuthorizationMapper, IssueAuthorizationDto, String> implements DaoComponent {
public IssueAuthorizationDao() {
@Override
protected IssueAuthorizationDto doGetNullableByKey(DbSession session, String key) {
- return mapper(session).selectByKey(key);
+ throw new IllegalStateException("Not implemented");
}
- protected IssueAuthorizationDto doUpdate(DbSession session, IssueAuthorizationDto issueAuthorization) {
- // TODO ?
- // mapper(session).update(issueAuthorization);
- return issueAuthorization;
++
+ @Override
++ protected ResultHandler getSynchronizationResultHandler(final DbSession session) {
++ return new ResultHandler() {
++ private final Map<String, IssueAuthorizationDto> authorizationDtoMap = new HashMap<String, IssueAuthorizationDto>();
++ private int count = 0;
++ @Override
++ public void handleResult(ResultContext context) {
++ Map<String, String> row = (Map<String, String>) 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<IssueAuthorizationDto>(getIndexType(), authorization, true));
++ }
++ }
++ }
++ };
+ }
+
@Override
- protected Iterable<IssueAuthorizationDto> 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<IssueAuthorizationDto> findAfterDate(DbSession session, Date date) {
+
+ Map<String, Object> params = newHashMap();
+ params.put("date", date);
+ params.put("permission", UserRole.USER);
+
+ Map<String, IssueAuthorizationDto> authorizationDtoMap = newHashMap();
+
+ List<Map<String, String>> rows = session.selectList("org.sonar.core.issue.db.IssueAuthorizationMapper.selectAfterDate", params);
+ for (Map<String, String> 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.<IssueAuthorizationDto>copyOf(authorizationDtoMap.values());
+ }
+
- // TODO DO not forget to implement "selectAfterDate" In xml mapping file.
++ @Override
++ protected Map getSynchronizationParams(Date date) {
++ Map<String, Object> params = super.getSynchronizationParams(date);
++ params.put("permission", UserRole.USER);
++ return params;
+ }
}