]> source.dussan.org Git - sonarqube.git/commitdiff
Merge branch 'master' into issues-in-es
authorStephane Gamard <stephane.gamard@sonarsource.com>
Tue, 9 Sep 2014 13:05:27 +0000 (15:05 +0200)
committerStephane Gamard <stephane.gamard@sonarsource.com>
Tue, 9 Sep 2014 13:05:27 +0000 (15:05 +0200)
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

1  2 
server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java
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
server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java

index 9724eda67f3d133e4681387fcc3367e422f1a4c7,c0f8ea5b98fc8d0d36eff0f6736bf345a2f64bdd..12e48a0e914708332ecfcd5ecde70400031b5a99
@@@ -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<MAPPER, D
      }
    }
  
 -  @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);
    }
  
index 3cf1008ca3058729506938e2c2b5ecd6bbb56995,37beefb3ceb8535ba8deb8ffb50daca8afdc6cef..38ba30fc39e154c6618ba6c2bbf230ac91d23f6f
@@@ -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;
      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);
    }
index 4548ec1beeea11f3b8026161be940826124dca47,a4d8c40ac5bf2768e5b5d41b4489e90a4946e337..2c7335fbb7ce417af0e84973bfa9cae1098980ae
  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;
 +  }
  }
index 45ea1ad6b33d61804cf8730ec8a1a363fe38eb34,1354d41ee47b5e2be199e005b9a7bbac7e20e7d9..e37624bdf6b67bce3386583d585bbbb416d782e0
@@@ -62,9 -59,8 +59,9 @@@ public class IssueDao extends BaseDao<I
      return issue;
    }
  
 +
    @Override
-   protected Iterable<IssueDto> findAfterDate(DbSession session, Date date) {
-     return mapper(session).selectAfterDate(new Timestamp(date.getTime()));
+   protected String getSynchronizationStatementName() {
+     return "selectAfterDate";
    }
  }