]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5560 - Updated BaseDao to scroll during synchronization
authorStephane Gamard <stephane.gamard@sonarsource.com>
Mon, 8 Sep 2014 10:31:18 +0000 (12:31 +0200)
committerStephane Gamard <stephane.gamard@sonarsource.com>
Mon, 8 Sep 2014 15:48:50 +0000 (17:48 +0200)
server/sonar-server/src/main/java/org/sonar/server/activity/db/ActivityDao.java
server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.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
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/db/ActiveRuleDao.java
server/sonar-server/src/main/java/org/sonar/server/rule/db/RuleDao.java

index 27fff1d30f6e841b911beb3ced7a2bf5c4c3a729..f2c9b9561e3487e52a06c224fb0364d93674ef4f 100644 (file)
@@ -26,7 +26,6 @@ import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.BaseDao;
 import org.sonar.server.search.IndexDefinition;
 
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -60,8 +59,8 @@ public class ActivityDao extends BaseDao<ActivityMapper, ActivityDto, String> {
   }
 
   @Override
-  protected Iterable<ActivityDto> findAfterDate(DbSession session, Date date) {
-    return mapper(session).selectAll();
+  protected String getSynchronizationStatementName() {
+    return "selectAll";
   }
 
   public List<ActivityDto> findAll(DbSession session) {
index 9724eda67f3d133e4681387fcc3367e422f1a4c7..0259ce17ac66e91447b834a886dd832b3ff09418 100644 (file)
  */
 package org.sonar.server.db;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import org.apache.ibatis.session.ResultContext;
+import org.apache.ibatis.session.ResultHandler;
 import org.sonar.api.utils.System2;
 import org.sonar.core.persistence.DaoComponent;
 import org.sonar.core.persistence.DbSession;
@@ -33,9 +36,15 @@ import org.sonar.server.search.action.UpsertNestedItem;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
+
 import java.io.Serializable;
+import java.sql.Timestamp;
 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
@@ -101,27 +110,27 @@ import java.util.Date;
  * - RuleTagDto tag add(RuleTagDto tag, RuleKey key)
  * - RuleParamDto param add(RuleParamDto param, RuleDto rule)
  *
- * @param <M> iBatis Mapper class
- * @param <E> Produced DTO class from this dao
- * @param <K> DTO Key class
+ * @param <MAPPER> iBatis Mapper class
+ * @param <DTO> Produced DTO class from this dao
+ * @param <KEY> DTO Key class
  */
-public abstract class BaseDao<M, E extends Dto<K>, K extends Serializable> implements Dao<E, K>, DaoComponent {
+public abstract class BaseDao<MAPPER, DTO extends Dto<KEY>, KEY extends Serializable> implements Dao<DTO, KEY>, DaoComponent {
 
   protected IndexDefinition indexDefinition;
-  private Class<M> mapperClass;
+  private Class<MAPPER> mapperClass;
   private System2 system2;
 
   private boolean hasIndex() {
     return indexDefinition != null;
   }
 
-  protected BaseDao(@Nullable IndexDefinition indexDefinition, Class<M> mapperClass, System2 system2) {
+  protected BaseDao(@Nullable IndexDefinition indexDefinition, Class<MAPPER> mapperClass, System2 system2) {
     this.mapperClass = mapperClass;
     this.indexDefinition = indexDefinition;
     this.system2 = system2;
   }
 
-  protected BaseDao(Class<M> mapperClass, System2 system2) {
+  protected BaseDao(Class<MAPPER> mapperClass, System2 system2) {
     this(null, mapperClass, system2);
   }
 
@@ -129,16 +138,16 @@ public abstract class BaseDao<M, E extends Dto<K>, K extends Serializable> imple
     return indexDefinition != null ? this.indexDefinition.getIndexType() : null;
   }
 
-  protected M mapper(DbSession session) {
+  protected MAPPER mapper(DbSession session) {
     return session.getMapper(mapperClass);
   }
 
-  public E getNullableByKey(DbSession session, K key) {
+  public DTO getNullableByKey(DbSession session, KEY key) {
     return doGetNullableByKey(session, key);
   }
 
-  public E getByKey(DbSession session, K key) {
-    E value = doGetNullableByKey(session, key);
+  public DTO getByKey(DbSession session, KEY key) {
+    DTO value = doGetNullableByKey(session, key);
     if (value == null) {
       throw new NotFoundException(String.format("Key '%s' not found", key));
     }
@@ -146,32 +155,32 @@ public abstract class BaseDao<M, E extends Dto<K>, K extends Serializable> imple
   }
 
   @Override
-  public E update(DbSession session, E item) {
+  public DTO update(DbSession session, DTO item) {
     Date now = new Date(system2.now());
     update(session, item, now);
     return item;
   }
 
   @Override
-  public E update(DbSession session, E item, E... others) {
+  public DTO update(DbSession session, DTO item, DTO... others) {
     Date now = new Date(system2.now());
     update(session, item, now);
-    for (E other : others) {
+    for (DTO other : others) {
       update(session, other, now);
     }
     return item;
   }
 
   @Override
-  public Collection<E> update(DbSession session, Collection<E> items) {
+  public Collection<DTO> update(DbSession session, Collection<DTO> items) {
     Date now = new Date(system2.now());
-    for (E item : items) {
+    for (DTO item : items) {
       update(session, item, now);
     }
     return items;
   }
 
-  private void update(DbSession session, E item, Date now) {
+  private void update(DbSession session, DTO item, Date now) {
     try {
       item.setUpdatedAt(now);
       doUpdate(session, item);
@@ -184,31 +193,31 @@ public abstract class BaseDao<M, E extends Dto<K>, K extends Serializable> imple
   }
 
   @Override
-  public E insert(DbSession session, E item) {
+  public DTO insert(DbSession session, DTO item) {
     insert(session, item, new Date(system2.now()));
     return item;
   }
 
   @Override
-  public Collection<E> insert(DbSession session, Collection<E> items) {
+  public Collection<DTO> insert(DbSession session, Collection<DTO> items) {
     Date now = new Date(system2.now());
-    for (E item : items) {
+    for (DTO item : items) {
       insert(session, item, now);
     }
     return items;
   }
 
   @Override
-  public E insert(DbSession session, E item, E... others) {
+  public DTO insert(DbSession session, DTO item, DTO... others) {
     Date now = new Date(system2.now());
     insert(session, item, now);
-    for (E other : others) {
+    for (DTO other : others) {
       insert(session, other, now);
     }
     return item;
   }
 
-  private void insert(DbSession session, E item, Date now) {
+  private void insert(DbSession session, DTO item, Date now) {
     if (item.getCreatedAt() == null) {
       item.setCreatedAt(now);
     }
@@ -216,7 +225,7 @@ public abstract class BaseDao<M, E extends Dto<K>, K extends Serializable> imple
     try {
       doInsert(session, item);
       if (hasIndex()) {
-        session.enqueue(new UpsertDto<E>(getIndexType(), item));
+        session.enqueue(new UpsertDto<DTO>(getIndexType(), item));
       }
     } catch (Exception e) {
       throw new IllegalStateException("Fail to insert item in db: " + item, e);
@@ -224,54 +233,54 @@ public abstract class BaseDao<M, E extends Dto<K>, K extends Serializable> imple
   }
 
   @Override
-  public void delete(DbSession session, E item) {
+  public void delete(DbSession session, DTO item) {
     deleteByKey(session, item.getKey());
   }
 
   @Override
-  public void delete(DbSession session, E item, E... others) {
+  public void delete(DbSession session, DTO item, DTO... others) {
     delete(session, item);
-    for (E e : others) {
+    for (DTO e : others) {
       delete(session, e);
     }
   }
 
   @Override
-  public void delete(DbSession session, Collection<E> items) {
-    for (E item : items) {
+  public void delete(DbSession session, Collection<DTO> items) {
+    for (DTO item : items) {
       delete(session, item);
     }
   }
 
   @Override
-  public void deleteByKey(DbSession session, K key) {
+  public void deleteByKey(DbSession session, KEY key) {
     Preconditions.checkNotNull(key, "Missing key");
     try {
       doDeleteByKey(session, key);
       if (hasIndex()) {
-        session.enqueue(new DeleteKey<K>(getIndexType(), key));
+        session.enqueue(new DeleteKey<KEY>(getIndexType(), key));
       }
     } catch (Exception e) {
       throw new IllegalStateException("Fail to delete item from db: " + key, e);
     }
   }
 
-  protected final void enqueueUpdate(Object nestedItem, K key, DbSession session) {
+  protected final void enqueueUpdate(Object nestedItem, KEY key, DbSession session) {
     if (hasIndex()) {
-      session.enqueue(new UpsertNestedItem<K>(
+      session.enqueue(new UpsertNestedItem<KEY>(
         this.getIndexType(), key, nestedItem));
     }
   }
 
-  public void enqueueDelete(Object nestedItem, K key, DbSession session) {
+  public void enqueueDelete(Object nestedItem, KEY key, DbSession session) {
     if (hasIndex()) {
-      session.enqueue(new DeleteNestedItem<K>(
+      session.enqueue(new DeleteNestedItem<KEY>(
         this.getIndexType(), key, nestedItem));
       session.commit();
     }
   }
 
-  public void enqueueInsert(Object nestedItem, K key, DbSession session) {
+  public void enqueueInsert(Object nestedItem, KEY key, DbSession session) {
     if (hasIndex()) {
       this.enqueueUpdate(nestedItem, key, session);
     }
@@ -279,28 +288,51 @@ public abstract class BaseDao<M, E extends Dto<K>, K extends Serializable> imple
 
   @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));
+
+    ResultHandler synchronizeDtos = new ResultHandler() {
+      @Override
+      public void handleResult(ResultContext resultContext) {
+        DTO dto = (DTO) resultContext.getResultObject();
+        System.out.println("dto = " + dto);
+        session.enqueue(new UpsertDto<DTO>(getIndexType(), dto, true));
+      }
+    };
+
+    try {
+      Map<String, Object> params = newHashMap();
+      params.put("date", new Timestamp(date.getTime()));
+      session.select(getSynchronizeStatementFQN(), params, synchronizeDtos);
+    } 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);
   }
 
-  protected E doUpdate(DbSession session, E item) {
+  protected DTO doUpdate(DbSession session, DTO item) {
     throw notImplemented(this);
   }
 
-  protected void doDeleteByKey(DbSession session, K key) {
+  protected void doDeleteByKey(DbSession session, KEY key) {
     throw notImplemented(this);
   }
 
index 24ae9bf7d31039f50e3a34a077b52c99f7b0d458..a4d8c40ac5bf2768e5b5d41b4489e90a4946e337 100644 (file)
@@ -29,8 +29,6 @@ import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.BaseDao;
 import org.sonar.server.search.IndexDefinition;
 
-import java.util.Date;
-
 public class IssueAuthorizationDao extends BaseDao<IssueAuthorizationMapper, IssueAuthorizationDto, String> implements DaoComponent {
 
   public IssueAuthorizationDao() {
@@ -63,10 +61,5 @@ public class IssueAuthorizationDao extends BaseDao<IssueAuthorizationMapper, Iss
     return issueAuthorization;
   }
 
-  @Override
-  protected Iterable<IssueAuthorizationDto> findAfterDate(DbSession session, Date date) {
-    // TODO ?
-    // return mapper(session).selectAfterDate(new Timestamp(date.getTime()));
-    return null;
-  }
+  // TODO DO not forget to implement "selectAfterDate" In xml mapping file.
 }
index 390e39d49b8707b7ebe55399b93ebe263636252d..1354d41ee47b5e2be199e005b9a7bbac7e20e7d9 100644 (file)
@@ -29,9 +29,6 @@ import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.BaseDao;
 import org.sonar.server.search.IndexDefinition;
 
-import java.sql.Timestamp;
-import java.util.Date;
-
 public class IssueDao extends BaseDao<IssueMapper, IssueDto, String> implements DaoComponent {
 
   public IssueDao() {
@@ -63,7 +60,7 @@ public class IssueDao extends BaseDao<IssueMapper, IssueDto, String> implements
   }
 
   @Override
-  protected Iterable<IssueDto> findAfterDate(DbSession session, Date date) {
-    return mapper(session).selectAfterDate(new Timestamp(date.getTime()));
+  protected String getSynchronizationStatementName() {
+    return "selectAfterDate";
   }
 }
index 1cd5966e5fb8af377bac2e64a27797c189198cf3..76994dbf49bc58ddc771bbe6bf34337f6484fece 100644 (file)
@@ -36,8 +36,6 @@ import org.sonar.server.rule.db.RuleDao;
 import org.sonar.server.search.IndexDefinition;
 
 import javax.annotation.CheckForNull;
-import java.sql.Timestamp;
-import java.util.Date;
 import java.util.List;
 
 public class ActiveRuleDao extends BaseDao<ActiveRuleMapper, ActiveRuleDto, ActiveRuleKey> {
@@ -117,11 +115,6 @@ public class ActiveRuleDao extends BaseDao<ActiveRuleMapper, ActiveRuleDto, Acti
     }
   }
 
-  @Override
-  protected Iterable<ActiveRuleDto> findAfterDate(DbSession session, Date date) {
-    return mapper(session).selectAfterDate(new Timestamp(date.getTime()));
-  }
-
   /**
    * Finder methods for Rules
    */
index 0e7b19a4ca59f145ae97ca8f8ac63de4f35bd1f9..101659f898e3d37bbcc82dedd3a28f44c3a5705a 100644 (file)
@@ -31,8 +31,6 @@ import org.sonar.server.db.BaseDao;
 import org.sonar.server.search.IndexDefinition;
 
 import javax.annotation.CheckForNull;
-import java.sql.Timestamp;
-import java.util.Date;
 import java.util.List;
 
 public class RuleDao extends BaseDao<RuleMapper, RuleDto, RuleKey> {
@@ -72,11 +70,6 @@ public class RuleDao extends BaseDao<RuleMapper, RuleDto, RuleKey> {
     throw new UnsupportedOperationException("Rules cannot be deleted");
   }
 
-  @Override
-  protected Iterable<RuleDto> findAfterDate(DbSession session, Date date) {
-    return mapper(session).selectAfterDate(new Timestamp(date.getTime()));
-  }
-
   /**
    * @deprecated use keys.
    */