]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4711 Allow creation and query of empty projects
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 25 Sep 2013 16:27:15 +0000 (18:27 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 26 Sep 2013 12:21:47 +0000 (14:21 +0200)
sonar-core/src/main/java/org/sonar/core/permission/PermissionFacade.java
sonar-core/src/main/java/org/sonar/core/resource/DefaultResourcePermissions.java
sonar-core/src/main/java/org/sonar/core/resource/ResourceDao.java
sonar-core/src/main/java/org/sonar/core/resource/ResourceMapper.java
sonar-core/src/main/resources/org/sonar/core/resource/ResourceMapper.xml
sonar-core/src/test/java/org/sonar/core/permission/PermissionFacadeTest.java
sonar-core/src/test/java/org/sonar/core/resource/DefaultResourcePermissionsTest.java

index 08c5147caeba61ec2d7077849c83f9dc7d233701..d60b8dacbd3ce3984b978fbe4bb592b7dc3f0cea 100644 (file)
 
 package org.sonar.core.permission;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.ibatis.session.SqlSession;
 import org.sonar.api.ServerComponent;
+import org.sonar.api.config.Settings;
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.task.TaskComponent;
+import org.sonar.api.web.UserRole;
 import org.sonar.core.persistence.MyBatis;
-import org.sonar.core.user.*;
+import org.sonar.core.user.GroupDto;
+import org.sonar.core.user.GroupRoleDto;
+import org.sonar.core.user.RoleDao;
+import org.sonar.core.user.UserDao;
+import org.sonar.core.user.UserRoleDto;
 
 import javax.annotation.Nullable;
 
 import java.util.List;
 
+import static com.google.common.collect.Lists.newArrayList;
+
 /**
  * Internal use only
  *
@@ -44,12 +53,14 @@ public class PermissionFacade implements TaskComponent, ServerComponent {
   private final RoleDao roleDao;
   private final UserDao userDao;
   private final PermissionTemplateDao permissionTemplateDao;
+  private final Settings settings;
 
-  public PermissionFacade(MyBatis myBatis, RoleDao roleDao, UserDao userDao, PermissionTemplateDao permissionTemplateDao) {
+  public PermissionFacade(MyBatis myBatis, RoleDao roleDao, UserDao userDao, PermissionTemplateDao permissionTemplateDao, Settings settings) {
     this.myBatis = myBatis;
     this.roleDao = roleDao;
     this.userDao = userDao;
     this.permissionTemplateDao = permissionTemplateDao;
+    this.settings = settings;
   }
 
   public void insertUserPermission(@Nullable Long resourceId, Long userId, String permission, @Nullable SqlSession session) {
@@ -190,4 +201,71 @@ public class PermissionFacade implements TaskComponent, ServerComponent {
   public List<String> selectUserPermissions(String user, Long componentId) {
     return roleDao.selectUserPermissions(user, componentId);
   }
+
+  public void grantDefaultRoles(Long componentId, String qualifier) {
+    SqlSession session = myBatis.openSession();
+    try {
+      removeAllPermissions(componentId, session);
+      grantDefaultRoles(componentId, qualifier, UserRole.ADMIN, session);
+      grantDefaultRoles(componentId, qualifier, UserRole.USER, session);
+      grantDefaultRoles(componentId, qualifier, UserRole.CODEVIEWER, session);
+      session.commit();
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
+  private void grantDefaultRoles(Long resourceId, String qualifier, String role, SqlSession session) {
+    PermissionTemplateDto applicablePermissionTemplate = getDefaultPermissionTemplate(qualifier);
+
+    List<Long> groupIds = getEligibleGroups(role, applicablePermissionTemplate);
+    for (Long groupId : groupIds) {
+      insertGroupPermission(resourceId, groupId, role, session);
+    }
+
+    List<Long> userIds = getEligibleUsers(role, applicablePermissionTemplate);
+    for (Long userId : userIds) {
+      insertUserPermission(resourceId, userId, role, session);
+    }
+  }
+
+  private List<Long> getEligibleGroups(String role, PermissionTemplateDto permissionTemplate) {
+    List<Long> eligibleGroups = newArrayList();
+    List<PermissionTemplateGroupDto> groupsPermissions = permissionTemplate.getGroupsPermissions();
+    if (groupsPermissions != null) {
+      for (PermissionTemplateGroupDto groupPermission : groupsPermissions) {
+        if (role.equals(groupPermission.getPermission())) {
+          Long groupId = groupPermission.getGroupId() != null ? groupPermission.getGroupId() : null;
+          eligibleGroups.add(groupId);
+        }
+      }
+    }
+    return eligibleGroups;
+  }
+
+  private List<Long> getEligibleUsers(String role, PermissionTemplateDto permissionTemplate) {
+    List<Long> eligibleUsers = newArrayList();
+    List<PermissionTemplateUserDto> usersPermissions = permissionTemplate.getUsersPermissions();
+    if (usersPermissions != null) {
+      for (PermissionTemplateUserDto userPermission : usersPermissions) {
+        if (role.equals(userPermission.getPermission())) {
+          eligibleUsers.add(userPermission.getUserId());
+        }
+      }
+    }
+    return eligibleUsers;
+  }
+
+  private PermissionTemplateDto getDefaultPermissionTemplate(String qualifier) {
+    String qualifierTemplateKey = settings.getString("sonar.permission.template." + qualifier + ".default");
+    if (!StringUtils.isBlank(qualifierTemplateKey)) {
+      return getPermissionTemplate(qualifierTemplateKey);
+    }
+
+    String defaultTemplateKey = settings.getString("sonar.permission.template.default");
+    if (StringUtils.isBlank(defaultTemplateKey)) {
+      throw new IllegalStateException("At least one default permission template should be defined");
+    }
+    return getPermissionTemplate(defaultTemplateKey);
+  }
 }
index ffe91a333d4241a015c42b4c02d7f98aa2a0618e..4a8451af1ad922a8121a008aead584ceb123fe4a 100644 (file)
  */
 package org.sonar.core.resource;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.ibatis.session.SqlSession;
-import org.sonar.api.config.Settings;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.security.ResourcePermissions;
-import org.sonar.api.web.UserRole;
 import org.sonar.core.permission.PermissionFacade;
-import org.sonar.core.permission.PermissionTemplateDto;
-import org.sonar.core.permission.PermissionTemplateGroupDto;
-import org.sonar.core.permission.PermissionTemplateUserDto;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.user.UserDto;
 import org.sonar.core.user.UserMapper;
 
-import java.util.List;
-
-import static com.google.common.collect.Lists.newArrayList;
-
 /**
  * @since 3.2
  */
 public class DefaultResourcePermissions implements ResourcePermissions {
 
-  private final Settings settings;
   private final MyBatis myBatis;
   private final PermissionFacade permissionFacade;
 
-  public DefaultResourcePermissions(Settings settings, MyBatis myBatis, PermissionFacade permissionFacade) {
-    this.settings = settings;
+  public DefaultResourcePermissions(MyBatis myBatis, PermissionFacade permissionFacade) {
     this.myBatis = myBatis;
     this.permissionFacade = permissionFacade;
   }
@@ -90,78 +78,6 @@ public class DefaultResourcePermissions implements ResourcePermissions {
   }
 
   public void grantDefaultRoles(Resource resource) {
-    if (resource.getId() != null) {
-      SqlSession session = myBatis.openSession();
-      try {
-        removeRoles(resource, session);
-        grantDefaultRoles(resource, UserRole.ADMIN, session);
-        grantDefaultRoles(resource, UserRole.USER, session);
-        grantDefaultRoles(resource, UserRole.CODEVIEWER, session);
-        session.commit();
-      } finally {
-        MyBatis.closeQuietly(session);
-      }
-    }
-  }
-
-  private void removeRoles(Resource resource, SqlSession session) {
-    Long resourceId = Long.valueOf(resource.getId());
-    permissionFacade.removeAllPermissions(resourceId, session);
-  }
-
-  private void grantDefaultRoles(Resource resource, String role, SqlSession session) {
-    PermissionTemplateDto applicablePermissionTemplate = getPermissionTemplate(resource.getQualifier());
-
-    List<Long> groupIds = getEligibleGroups(role, applicablePermissionTemplate);
-    for (Long groupId : groupIds) {
-      Long resourceId = Long.valueOf(resource.getId());
-      permissionFacade.insertGroupPermission(resourceId, groupId, role, session);
-    }
-
-    List<Long> userIds = getEligibleUsers(role, applicablePermissionTemplate);
-    for (Long userId : userIds) {
-      Long resourceId = Long.valueOf(resource.getId());
-      permissionFacade.insertUserPermission(resourceId, userId, role, session);
-    }
-  }
-
-  private List<Long> getEligibleGroups(String role, PermissionTemplateDto permissionTemplate) {
-    List<Long> eligibleGroups = newArrayList();
-    List<PermissionTemplateGroupDto> groupsPermissions = permissionTemplate.getGroupsPermissions();
-    if (groupsPermissions != null) {
-      for (PermissionTemplateGroupDto groupPermission : groupsPermissions) {
-        if (role.equals(groupPermission.getPermission())) {
-          Long groupId = groupPermission.getGroupId() != null ? groupPermission.getGroupId() : null;
-          eligibleGroups.add(groupId);
-        }
-      }
-    }
-    return eligibleGroups;
-  }
-
-  private List<Long> getEligibleUsers(String role, PermissionTemplateDto permissionTemplate) {
-    List<Long> eligibleUsers = newArrayList();
-    List<PermissionTemplateUserDto> usersPermissions = permissionTemplate.getUsersPermissions();
-    if (usersPermissions != null) {
-      for (PermissionTemplateUserDto userPermission : usersPermissions) {
-        if (role.equals(userPermission.getPermission())) {
-          eligibleUsers.add(userPermission.getUserId());
-        }
-      }
-    }
-    return eligibleUsers;
-  }
-
-  private PermissionTemplateDto getPermissionTemplate(String qualifier) {
-    String qualifierTemplateKey = settings.getString("sonar.permission.template." + qualifier + ".default");
-    if (!StringUtils.isBlank(qualifierTemplateKey)) {
-      return permissionFacade.getPermissionTemplate(qualifierTemplateKey);
-    }
-
-    String defaultTemplateKey = settings.getString("sonar.permission.template.default");
-    if (StringUtils.isBlank(defaultTemplateKey)) {
-      throw new IllegalStateException("At least one default permission template should be defined");
-    }
-    return permissionFacade.getPermissionTemplate(defaultTemplateKey);
+    permissionFacade.grantDefaultRoles(Long.valueOf(resource.getId()), resource.getQualifier());
   }
 }
index da292f939b093dfaa3c2f76d3d81db4326072b8f..2b15762cd970e36941a011dec0ab0395fda51d36 100644 (file)
@@ -246,6 +246,21 @@ public class ResourceDao {
     }
   }
 
+  /**
+   * Return provisioned projects = enabled projects without snapshot
+   */
+  public List<Component> selectProvisionedProjects(Collection<String> qualifiers) {
+    if (qualifiers.isEmpty()) {
+      return Collections.emptyList();
+    }
+    SqlSession session = mybatis.openSession();
+    try {
+      return toComponents(session.getMapper(ResourceMapper.class).selectProvisionedProjects(qualifiers));
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+
   public static ComponentDto toComponent(ResourceDto resourceDto){
     return new ComponentDto()
       .setId(resourceDto.getId())
index 488dbe38b2b22fe4ab1ebee0ab209ebbd711a150..c3bcc36277ce12c82c8bf6eba3913c68a8b9fe91 100644 (file)
@@ -80,6 +80,8 @@ public interface ResourceMapper {
 
   List<ResourceDto> selectGhostsProjects(@Param("qualifiers") Collection<String> qualifier);
 
+  List<ResourceDto> selectProvisionedProjects(@Param("qualifiers") Collection<String> qualifier);
+
   void insert(ResourceDto resource);
 
   void update(ResourceDto resource);
index 3cec051123ac629f80c0cc29975ea409516795e7..e1ae650a3d1aba74f6d425139a94746a0b3288ff 100644 (file)
     </where>
   </select>
 
+  <select id="selectProvisionedProjects" parameterType="map" resultMap="resourceResultMap">
+    select p.* from projects p
+    left join snapshots s on s.project_id=p.id
+    <where>
+      and s.id is null
+      <if test="qualifiers != null and qualifiers.size() > 0">
+        and <foreach item="qualifier" index="index" collection="qualifiers" open="(" separator=" or " close=")">p.qualifier=#{qualifier}
+        </foreach>
+      </if>
+      and p.copy_resource_id is null
+    </where>
+  </select>
+
   <select id="selectAuthorizedChildrenComponentIds" parameterType="map" resultType="int">
     <include refid="selectAuthorizedChildrenComponentIdsQuery" />
   </select>
index 18cb8525186062257dbbf6a7306226da380fddf1..6c5e3fbacf5e27789a42b3a134c40df8119e3aeb 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.sonar.core.permission;
 
+import org.sonar.api.config.Settings;
+
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Before;
 import org.junit.Rule;
@@ -30,7 +32,6 @@ import org.sonar.core.persistence.AbstractDaoTestCase;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.user.RoleDao;
 import org.sonar.core.user.UserDao;
-
 import static org.fest.assertions.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -48,7 +49,8 @@ public class PermissionFacadeTest extends AbstractDaoTestCase {
     RoleDao roleDao = new RoleDao(getMyBatis());
     UserDao userDao = new UserDao(getMyBatis());
     permissionTemplateDao = new PermissionTemplateDao(getMyBatis());
-    permissionFacade = new PermissionFacade(getMyBatis(), roleDao, userDao, permissionTemplateDao);
+    Settings settings = new Settings();
+    permissionFacade = new PermissionFacade(getMyBatis(), roleDao, userDao, permissionTemplateDao, settings);
   }
 
   @Test
@@ -163,7 +165,7 @@ public class PermissionFacadeTest extends AbstractDaoTestCase {
     when(permissionTemplateDao.selectTemplateByKey("test_template")).thenReturn(permissionTemplateDto);
     when(permissionTemplateDao.selectPermissionTemplate("Test template")).thenReturn(templateWithPermissions);
 
-    permissionFacade = new PermissionFacade(null, null, null, permissionTemplateDao);
+    permissionFacade = new PermissionFacade(null, null, null, permissionTemplateDao, null);
 
     PermissionTemplateDto permissionTemplate = permissionFacade.getPermissionTemplate("test_template");
 
@@ -176,7 +178,7 @@ public class PermissionFacadeTest extends AbstractDaoTestCase {
 
     permissionTemplateDao = mock(PermissionTemplateDao.class);
 
-    permissionFacade = new PermissionFacade(null, null, null, permissionTemplateDao);
+    permissionFacade = new PermissionFacade(null, null, null, permissionTemplateDao, null);
     permissionFacade.getPermissionTemplate("unmatched");
   }
 
index 6edacf3d1635ae4e9610efc5e159ee9381b4d774..5f6b3af02b542d12a6e2c44cc5a7c848ae19054b 100644 (file)
@@ -48,8 +48,8 @@ public class DefaultResourcePermissionsTest extends AbstractDaoTestCase {
   public void initResourcePermissions() {
     settings = new Settings();
     PermissionFacade permissionFacade = new PermissionFacade(getMyBatis(),
-      new RoleDao(getMyBatis()), new UserDao(getMyBatis()), new PermissionTemplateDao(getMyBatis()));
-    permissions = new DefaultResourcePermissions(settings, getMyBatis(), permissionFacade);
+      new RoleDao(getMyBatis()), new UserDao(getMyBatis()), new PermissionTemplateDao(getMyBatis()), settings);
+    permissions = new DefaultResourcePermissions(getMyBatis(), permissionFacade);
   }
 
   @Test