diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index ef81d130863..69e50a4d429 100644 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -19,6 +19,7 @@ package com.cloud.api; import java.text.DecimalFormat; import java.util.List; +import java.util.Set; import com.cloud.api.commands.QueryAsyncJobResultCmd; import com.cloud.api.response.AccountResponse; @@ -92,6 +93,7 @@ import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.user.UserAccount; import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; import com.cloud.vm.InstanceGroup; import com.cloud.vm.VirtualMachine; @@ -168,7 +170,7 @@ public interface ResponseGenerator { RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn); - void createTemplateResponse(List responses, VirtualMachineTemplate template, Long zoneId, boolean isAdmin, + void createTemplateResponse(List responses, Pair templateZonePair, boolean isAdmin, Account account); ListResponse createTemplateResponse2(VirtualMachineTemplate template, Long zoneId); @@ -195,8 +197,7 @@ public interface ResponseGenerator { EventResponse createEventResponse(Event event); - ListResponse createIsoResponse(List isos, Long zoneId, boolean onlyReady, boolean isAdmin, - Account account); + ListResponse createIsoResponse(Set> isoZonePairSet, boolean onlyReady, Account account); TemplateResponse createIsoResponse(VirtualMachineTemplate result); diff --git a/api/src/com/cloud/api/commands/ListIsosCmd.java b/api/src/com/cloud/api/commands/ListIsosCmd.java index ae42cd95310..619cbdbad78 100755 --- a/api/src/com/cloud/api/commands/ListIsosCmd.java +++ b/api/src/com/cloud/api/commands/ListIsosCmd.java @@ -19,6 +19,7 @@ package com.cloud.api.commands; import java.util.List; +import java.util.Set; import org.apache.log4j.Logger; @@ -33,6 +34,7 @@ import com.cloud.template.VirtualMachineTemplate; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.user.Account; import com.cloud.user.UserContext; +import com.cloud.utils.Pair; @Implementation(description="Lists all available ISO files.", responseObject=TemplateResponse.class) public class ListIsosCmd extends BaseListCmd { @@ -137,7 +139,7 @@ public class ListIsosCmd extends BaseListCmd { @Override public void execute(){ - List isos = _mgr.listIsos(this); + Set> isoZonePairSet = _mgr.listIsos(this); TemplateFilter isoFilterObj = null; try { @@ -152,23 +154,12 @@ public class ListIsosCmd extends BaseListCmd { } boolean isAdmin = false; - boolean isAccountSpecific = true; Account account = UserContext.current().getAccount(); if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) { - isAdmin = true; - if ((accountName == null) || (domainId == null)) { - isAccountSpecific = false; - } + isAdmin = true; } - boolean onlyReady = (isoFilterObj == TemplateFilter.featured) || - (isoFilterObj == TemplateFilter.selfexecutable) || - (isoFilterObj == TemplateFilter.sharedexecutable) || - (isoFilterObj == TemplateFilter.executable && isAccountSpecific) || - (isoFilterObj == TemplateFilter.community); - - - ListResponse response = _responseGenerator.createIsoResponse(isos, zoneId, onlyReady, isAdmin, account); + ListResponse response = _responseGenerator.createIsoResponse(isoZonePairSet, isAdmin, account); response.setResponseName(getName()); this.setResponseObject(response); } diff --git a/api/src/com/cloud/api/commands/ListTemplatesCmd.java b/api/src/com/cloud/api/commands/ListTemplatesCmd.java index b02c1fbbeee..dc538d9d3a8 100644 --- a/api/src/com/cloud/api/commands/ListTemplatesCmd.java +++ b/api/src/com/cloud/api/commands/ListTemplatesCmd.java @@ -20,6 +20,7 @@ package com.cloud.api.commands; import java.util.ArrayList; import java.util.List; +import java.util.Set; import org.apache.log4j.Logger; @@ -35,6 +36,7 @@ import com.cloud.template.VirtualMachineTemplate; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.user.Account; import com.cloud.user.UserContext; +import com.cloud.utils.Pair; @Implementation(description="List all public, private, and privileged templates.", responseObject=TemplateResponse.class) public class ListTemplatesCmd extends BaseListCmd { @@ -118,35 +120,19 @@ public class ListTemplatesCmd extends BaseListCmd { @Override public void execute(){ - List templates = _mgr.listTemplates(this); - TemplateFilter templateFilterObj; - try { - templateFilterObj = TemplateFilter.valueOf(templateFilter); - } catch (IllegalArgumentException e) { - // how did we get this far? The request should've been rejected already before the response stage... - templateFilterObj = TemplateFilter.selfexecutable; - } - + Set> templateZonePairSet = _mgr.listTemplates(this); + boolean isAdmin = false; - boolean isAccountSpecific = true; Account account = UserContext.current().getAccount(); if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN) || (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) { isAdmin = true; - if ((accountName == null) || (domainId == null)) { - isAccountSpecific = false; - } } - boolean showDomr = (templateFilterObj != TemplateFilter.selfexecutable); - ListResponse response = new ListResponse(); List templateResponses = new ArrayList(); - for (VirtualMachineTemplate template : templates) { - if (!showDomr && template.getTemplateType() == Storage.TemplateType.SYSTEM) { - continue; - } - _responseGenerator.createTemplateResponse(templateResponses, template, zoneId, isAdmin, account); + for (Pair template : templateZonePairSet) { + _responseGenerator.createTemplateResponse(templateResponses, template, isAdmin, account); } response.setResponses(templateResponses); diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index ebb3cdc97a0..16b55ae0fd3 100644 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -21,6 +21,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import com.cloud.alert.Alert; import com.cloud.api.ServerApiException; @@ -101,6 +102,7 @@ import com.cloud.template.VirtualMachineTemplate; import com.cloud.user.Account; import com.cloud.user.UserAccount; import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; import com.cloud.vm.InstanceGroup; import com.cloud.vm.VirtualMachine; @@ -309,14 +311,14 @@ public interface ManagementService { * @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters. * @return list of ISOs */ - List listIsos(ListIsosCmd cmd); + Set> listIsos(ListIsosCmd cmd); /** * List templates that match the specified criteria. * @param cmd The command that wraps the (optional) templateId, name, keyword, templateFilter, bootable, account, and zoneId parameters. * @return list of ISOs */ - List listTemplates(ListTemplatesCmd cmd); + Set> listTemplates(ListTemplatesCmd cmd); /** * Search for disk offerings based on search criteria diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 6b08b61054c..b8275836544 100644 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -139,6 +139,7 @@ import com.cloud.user.UserContext; import com.cloud.user.UserStatisticsVO; import com.cloud.uservm.UserVm; import com.cloud.utils.net.NetUtils; +import com.cloud.utils.Pair; import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroupVO; @@ -1492,9 +1493,10 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public void createTemplateResponse(List responses, VirtualMachineTemplate template, Long zoneId, boolean isAdmin, Account account) { - List templateHostRefsForTemplate = ApiDBUtils.listTemplateHostBy(template.getId(), zoneId); - + public void createTemplateResponse(List responses, Pair templateZonePair, boolean isAdmin, Account account) { + List templateHostRefsForTemplate = ApiDBUtils.listTemplateHostBy(templateZonePair.first(), templateZonePair.second()); + VMTemplateVO template = ApiDBUtils.findTemplateById(templateZonePair.first()); + for (VMTemplateHostVO templateHostRef : templateHostRefsForTemplate) { TemplateResponse templateResponse = new TemplateResponse(); @@ -2009,11 +2011,13 @@ public class ApiResponseHelper implements ResponseGenerator { } @Override - public ListResponse createIsoResponse(List isos, Long zoneId, boolean onlyReady, boolean isAdmin, Account account) { + public ListResponse createIsoResponse(Set> isoZonePairSet, boolean isAdmin, Account account) { ListResponse response = new ListResponse(); List isoResponses = new ArrayList(); - for (VirtualMachineTemplate iso : isos) { + + for (Pair isoZonePair : isoZonePairSet) { + VMTemplateVO iso = ApiDBUtils.findTemplateById(isoZonePair.first()); if ( iso.getTemplateType() == TemplateType.PERHOST ) { TemplateResponse isoResponse = new TemplateResponse(); isoResponse.setId(iso.getId()); @@ -2031,12 +2035,8 @@ public class ApiResponseHelper implements ResponseGenerator { continue; } - List isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), zoneId); - for (VMTemplateHostVO isoHost : isoHosts) { - if (onlyReady && isoHost.getDownloadState() != Status.DOWNLOADED) { - continue; - } - + List isoHosts = ApiDBUtils.listTemplateHostBy(iso.getId(), isoZonePair.second()); + for (VMTemplateHostVO isoHost : isoHosts) { TemplateResponse isoResponse = new TemplateResponse(); isoResponse.setId(iso.getId()); isoResponse.setName(iso.getName()); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 1a4c242784a..8c9d1f1cb65 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -41,9 +41,11 @@ import java.util.Collections; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.Executors; @@ -1562,7 +1564,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List listIsos(ListIsosCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { + public Set> listIsos(ListIsosCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { TemplateFilter isoFilter = TemplateFilter.valueOf(cmd.getIsoFilter()); Long accountId = null; Account account = UserContext.current().getAccount(); @@ -1598,7 +1600,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List listTemplates(ListTemplatesCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { + public Set> listTemplates(ListTemplatesCmd cmd) throws IllegalArgumentException, InvalidParameterValueException { TemplateFilter templateFilter = TemplateFilter.valueOf(cmd.getTemplateFilter()); Long accountId = null; Account account = UserContext.current().getAccount(); @@ -1634,7 +1636,7 @@ public class ManagementServerImpl implements ManagementServer { return listTemplates(cmd.getId(), cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, accountId, cmd.getPageSizeVal(), cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, isAccountSpecific, showDomr); } - private List listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long accountId, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean isAccountSpecific, boolean showDomr) throws InvalidParameterValueException { + private Set> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Long accountId, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean isAccountSpecific, boolean showDomr) throws InvalidParameterValueException { VMTemplateVO template = null; if (templateId != null) { template = _templateDao.findById(templateId); @@ -1667,16 +1669,15 @@ public class ManagementServerImpl implements ManagementServer { domain = _domainDao.findById(DomainVO.ROOT_DOMAIN); } - List templates = new ArrayList(); + Set> templateZonePairSet = new HashSet>(); if (template == null) { - templates = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, bootable, account, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr); - } else { - templates = new ArrayList(); - templates.add(template); + templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, bootable, account, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr); + } else { + templateZonePairSet.add(new Pair(template.getId(), zoneId)); } - return templates; + return templateZonePairSet; } @Override diff --git a/server/src/com/cloud/storage/dao/VMTemplateDao.java b/server/src/com/cloud/storage/dao/VMTemplateDao.java index ae7302d0fac..bd39bb433d1 100644 --- a/server/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDao.java @@ -19,12 +19,14 @@ package com.cloud.storage.dao; import java.util.List; +import java.util.Set; import com.cloud.domain.DomainVO; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.VMTemplateVO; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.db.GenericDao; /* @@ -56,7 +58,7 @@ public interface VMTemplateDao extends GenericDao { public List findIsosByIdAndPath(Long domainId, Long accountId, String path); public List listReadyTemplates(); public List listByAccountId(long accountId); - public List searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, + public Set> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr); public long addTemplateToZone(VMTemplateVO tmplt, long zoneId); diff --git a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 9c244340100..50d52f530eb 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -23,8 +23,11 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -41,6 +44,7 @@ import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; import com.cloud.user.Account; +import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -61,6 +65,12 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem private final String SELECT_ALL = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; + + private final String SELECT_TEMPLATE_HOST_REF = "SELECT t.id, h.data_center_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; + + private final String SELECT_TEMPLATE_ZONE_REF = "SELECT t.id, tzr.zone_id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t INNER JOIN template_zone_ref tzr on (t.id = tzr.template_id) "; protected SearchBuilder TemplateNameSearch; protected SearchBuilder UniqueNameSearch; @@ -113,6 +123,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem SearchCriteria sc = PublicIsoSearch.create(); sc.setParameters("public", 1); sc.setParameters("format", "ISO"); + sc.setParameters("type", TemplateType.PERHOST.toString()); return listBy(sc); } @@ -200,6 +211,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem PublicIsoSearch = createSearchBuilder(); PublicIsoSearch.and("public", PublicIsoSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ); PublicIsoSearch.and("format", PublicIsoSearch.entity().getFormat(), SearchCriteria.Op.EQ); + PublicIsoSearch.and("type", PublicIsoSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); tmpltTypeHyperSearch = createSearchBuilder(); tmpltTypeHyperSearch.and("templateType", tmpltTypeHyperSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); @@ -234,12 +246,14 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } @Override - public List searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady,boolean showDomr) { + public Set> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso, Boolean bootable, Account account, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady,boolean showDomr) { Transaction txn = Transaction.currentTxn(); txn.start(); - List templates = new ArrayList(); + + Set> templateZonePairList = new HashSet>(); PreparedStatement pstmt = null; - ResultSet rs = null; + ResultSet rs = null; + String sql = SELECT_TEMPLATE_ZONE_REF; try { short accountType; String accountId = null; @@ -252,20 +266,16 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem String guestOSJoin = ""; StringBuilder templateHostRefJoin = new StringBuilder(); - String templateZoneRef = ""; + if (isIso && !hyperType.equals(HypervisorType.None)) { guestOSJoin = " INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) "; } if (onlyReady){ - templateHostRefJoin.append(" INNER JOIN template_host_ref thr on (t.id = thr.template_id) "); - if(zoneId != null){ - templateHostRefJoin.append("INNER JOIN host h on (thr.host_id = h.id)"); - } - }else if (zoneId != null){ - templateZoneRef = " INNER JOIN template_zone_ref tzr on (t.id = tzr.template_id) "; + templateHostRefJoin.append(" INNER JOIN template_host_ref thr on (t.id = thr.template_id) INNER JOIN host h on (thr.host_id = h.id)"); + sql = SELECT_TEMPLATE_HOST_REF; } - String sql = SELECT_ALL + guestOSJoin + templateHostRefJoin + templateZoneRef; + sql += guestOSJoin + templateHostRefJoin; String whereClause = ""; if (templateFilter == TemplateFilter.featured) { @@ -291,7 +301,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } else if (templateFilter == TemplateFilter.all && accountType == Account.ACCOUNT_TYPE_ADMIN) { whereClause += " WHERE "; } else if (accountType != Account.ACCOUNT_TYPE_ADMIN) { - return templates; + return templateZonePairList; } if (whereClause.equals("")) { @@ -300,25 +310,20 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem whereClause += " AND "; } - sql += whereClause + getExtrasWhere(templateFilter, name, keyword, isIso, bootable, hyperType, zoneId, onlyReady, showDomr) + getOrderByLimit(pageSize, startIndex); + sql += whereClause + getExtrasWhere(templateFilter, name, keyword, isIso, bootable, hyperType, zoneId, onlyReady, showDomr, accountType) + getOrderByLimit(pageSize, startIndex); pstmt = txn.prepareStatement(sql); rs = pstmt.executeQuery(); while (rs.next()) { - VMTemplateVO tmplt = toEntityBean(rs, false); - if (zoneId != null) { - VMTemplateZoneVO vtzvo = _templateZoneDao.findByZoneTemplate(zoneId, tmplt.getId()); - if (vtzvo != null){ - templates.add(tmplt); - } - } else { - templates.add(tmplt); - } + Pair templateZonePair = new Pair(rs.getLong(1), rs.getLong(2)); + templateZonePairList.add(templateZonePair); } - if(isIso && (account.getType() == Account.ACCOUNT_TYPE_NORMAL)){ - List publicIsos = publicIsoSearch(); - templates.addAll(publicIsos); + if(isIso && templateZonePairList.size() < pageSize && templateFilter != TemplateFilter.community){ + List publicIsos = publicIsoSearch(); + for( int i=0; i < publicIsos.size(); i++){ + templateZonePairList.add(new Pair(publicIsos.get(i).getId(), null)); + } } } catch (Exception e) { s_logger.warn("Error listing templates", e); @@ -336,10 +341,10 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } } - return templates; + return templateZonePairList; } - private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, boolean showDomr) { + private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, boolean showDomr, short accountType) { String sql = ""; if (keyword != null) { sql += " t.name LIKE \"%" + keyword + "%\" AND"; @@ -348,7 +353,10 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } if (isIso) { - sql += " t.format = 'ISO'"; + sql += " t.format = 'ISO'"; + if (accountType == Account.ACCOUNT_TYPE_NORMAL){ + sql += " AND t.public = 1 "; + } if (!hyperType.equals(HypervisorType.None)) { sql += " AND goh.hypervisor_type = '" + hyperType.toString() + "'"; } @@ -372,7 +380,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem sql += " AND tzr.zone_id = " +zoneId; } if (!showDomr){ - sql += " AND t.type = '" +Storage.TemplateType.SYSTEM.toString() + "'"; + sql += " AND t.type != '" +Storage.TemplateType.SYSTEM.toString() + "'"; } sql += " AND t.removed IS NULL";