/*
* RHQ Management Platform
* Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.domain.criteria;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.rhq.core.domain.resource.CreateDeletePolicy;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceCreationDataType;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageOrdering;
/**
* @author Joseph Marques
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("unused")
public class ResourceTypeCriteria extends Criteria {
private static final long serialVersionUID = 2L;
private Integer filterParentId; // required overrides
private String filterName;
private String filterDescription;
private ResourceCategory filterCategory;
private ResourceCreationDataType filterCreationDataType;
private CreateDeletePolicy filterCreateDeletePolicy;
private Boolean filterSupportsManualAdd;
private String filterPluginName; // needs overrides
private Integer filterBundleTypeId; // needs overrides
private Boolean filterDeleted = false; // by default, we don't want to fetch resource types that are marked deleted
private Boolean filterIgnored = false; // by default, we don't want to fetch types the user requested to be ignored
private Set<ResourceCategory> filterCategories; // needs overrides
private Boolean filterParentResourceTypesEmpty; // needs overrides
private String filterTargetingBundleType;
private boolean fetchChildResourceTypes;
private boolean fetchParentResourceTypes;
private boolean fetchPluginConfigurationDefinition;
private boolean fetchResourceConfigurationDefinition;
private boolean fetchMetricDefinitions;
private boolean fetchEventDefinitions;
private boolean fetchOperationDefinitions;
private boolean fetchProcessScans;
private boolean fetchPackageTypes;
private boolean fetchProductVersions;
private boolean fetchBundleType;
private boolean fetchResources;
private boolean fetchDriftDefinitionTemplates;
private boolean fetchBundleConfiguration;
private boolean fetchExplicitlyTargetingBundleTypes;
private PageOrdering sortName;
private PageOrdering sortCategory;
private PageOrdering sortPluginName; // needs overrides
public ResourceTypeCriteria() {
filterOverrides.put("parentId", "" //
+ "id IN ( SELECT innerRt.id " //
+ " FROM ResourceType innerRt " //
+ " JOIN innerRt.parentResourceTypes innerParentRt " //
+ " WHERE innerParentRt.id IN ( ? ) )");
filterOverrides.put("pluginName", "plugin like ?");
filterOverrides.put("bundleTypeId", "bundleType.id = ?");
filterOverrides.put("categories", "category in ( ? )");
filterOverrides.put("parentResourceTypesEmpty", "" //
+ "id IN ( SELECT innerRt.id FROM ResourceType innerRt " //
+ " LEFT JOIN innerRt.parentResourceTypes innerParentRt" //
+ " WHERE ( ? = true AND innerRt.parentResourceTypes IS EMPTY ) " //
+ " OR ( ? = false AND innerRt.parentResourceTypes IS NOT EMPTY ) )");
// the double nesting is necessary so that we can capture the 2 conditions we're checking here using
// a single IN check against the resourceType.id. The expression is concatenated to the table alias
// during query generation and it might happen that the second part of the OR clause wouldn't correctly
// match against the right table if it weren't nested.
filterOverrides.put("targetingBundleTypeId", //
"id IN (SELECT rt.id FROM ResourceType rt" + //
" WHERE rt.id IN (SELECT innerRt.id FROM ResourceType innerRt" + //
" JOIN innerRt.explicitlyTargetingBundleTypes bt" + //
" WHERE bt.name LIKE ?)" + //
" OR" + //
" rt.id IN (SELECT innerRt.id FROM ResourceType innerRt, BundleType bt" + //
" WHERE bt.explicitlyTargetedResourceTypes IS EMPTY" + //
" AND bt.name LIKE ?)" + //
" )");
sortOverrides.put("pluginName", "plugin");
}
@Override
public Class<ResourceType> getPersistentClass() {
return ResourceType.class;
}
public void addFilterParentId(Integer filterParentId) {
this.filterParentId = filterParentId;
}
public void addFilterName(String filterName) {
this.filterName = filterName;
}
public void addFilterDescription(String filterDescription) {
this.filterDescription = filterDescription;
}
public void addFilterCategory(ResourceCategory filterCategory) {
this.filterCategory = filterCategory;
}
public void addFilterCreationDataType(ResourceCreationDataType filterCreationDataType) {
this.filterCreationDataType = filterCreationDataType;
}
public void addFilterCreateDeletePolicy(CreateDeletePolicy filterCreateDeletePolicy) {
this.filterCreateDeletePolicy = filterCreateDeletePolicy;
}
public void addFilterSupportsManualAdd(Boolean filterSupportsManualAdd) {
this.filterSupportsManualAdd = filterSupportsManualAdd;
}
public void addFilterPluginName(String filterPluginName) {
this.filterPluginName = filterPluginName;
}
public void addFilterBundleTypeId(Integer filterBundleTypeId) {
this.filterBundleTypeId = filterBundleTypeId;
}
public void addFilterDeleted(boolean deleted) {
this.filterDeleted = deleted;
}
public void addFilterDeleted(Boolean deleted) {
this.filterDeleted = deleted;
}
public void addFilterIgnored(boolean ignored) {
this.filterIgnored = ignored;
}
public void addFilterIgnored(Boolean ignored) {
this.filterIgnored = ignored;
}
public void addFilterCategories(ResourceCategory... filterCategories) {
this.filterCategories = new HashSet<ResourceCategory>(Arrays.asList(filterCategories));
}
/**
* If set to true this is equivalent to asking only for top level resource types. In other words,
* those types whose parent will be the platform.
*
* @param filterParentResourceTypesEmpty
*/
public void addFilterParentResourceTypesEmpty(boolean filterParentResourceTypesEmpty) {
this.filterParentResourceTypesEmpty = filterParentResourceTypesEmpty;
}
/**
* Only include resource types that are can be target of deployment of given bundle type.
* <p/>
* Note that due to a limitation in query generation, it is recommended to set the criteria
* to case sensitive ({@link #setCaseSensitive(boolean)}) when using this filter, otherwise
* some results might be missed.
*
* @param bundleType the name of the bundle type that can target the returned resource types.
* @since 4.13
*/
public void addFilterTargetingBundleType(String bundleType) {
this.filterTargetingBundleType = bundleType;
}
public void fetchChildResourceTypes(boolean fetchChildResourceTypes) {
this.fetchChildResourceTypes = fetchChildResourceTypes;
}
public void fetchParentResourceTypes(boolean fetchParentResourceTypes) {
this.fetchParentResourceTypes = fetchParentResourceTypes;
}
public void fetchPluginConfigurationDefinition(boolean fetchPluginConfigurationDefinition) {
this.fetchPluginConfigurationDefinition = fetchPluginConfigurationDefinition;
}
public void fetchResourceConfigurationDefinition(boolean fetchResourceConfigurationDefinition) {
this.fetchResourceConfigurationDefinition = fetchResourceConfigurationDefinition;
}
public void fetchMetricDefinitions(boolean fetchMetricDefinitions) {
this.fetchMetricDefinitions = fetchMetricDefinitions;
}
public void fetchEventDefinitions(boolean fetchEventDefinitions) {
this.fetchEventDefinitions = fetchEventDefinitions;
}
public void fetchOperationDefinitions(boolean fetchOperationDefinitions) {
this.fetchOperationDefinitions = fetchOperationDefinitions;
}
public void fetchProcessScans(boolean fetchProcessScans) {
this.fetchProcessScans = fetchProcessScans;
}
public void fetchPackageTypes(boolean fetchPackageTypes) {
this.fetchPackageTypes = fetchPackageTypes;
}
public void fetchProductVersions(boolean fetchProductVersions) {
this.fetchProductVersions = fetchProductVersions;
}
public void fetchBundleType(boolean fetchBundleType) {
this.fetchBundleType = fetchBundleType;
}
public void fetchResources(boolean fetchResources) {
this.fetchResources = fetchResources;
}
public void fetchDriftDefinitionTemplates(boolean fetchDriftDefinitionTemplates) {
this.fetchDriftDefinitionTemplates = fetchDriftDefinitionTemplates;
}
public void fetchBundleConfiguration(boolean fetchBundleConfiguration) {
this.fetchBundleConfiguration = fetchBundleConfiguration;
}
/**
* Whether to fetch the bundle types explicitly targeting the returned resource types.
*
* @since 4.13
*/
public void fetchExplicitlyTargetingBundleTypes(boolean fetchExplicitlyTargetingBundleTypes) {
this.fetchExplicitlyTargetingBundleTypes = fetchExplicitlyTargetingBundleTypes;
}
public void addSortName(PageOrdering sortName) {
addSortField("name");
this.sortName = sortName;
}
public void addSortCategory(PageOrdering sortCategory) {
addSortField("category");
this.sortCategory = sortCategory;
}
public void addSortPluginName(PageOrdering sortPluginName) {
addSortField("pluginName");
this.sortPluginName = sortPluginName;
}
/**
* Deprecated due to a simpler but more powerful subcategory design.
* Please see https://bugzilla.redhat.com/show_bug.cgi?id=1069545
*/
@Deprecated
public void fetchSubCategories(boolean notused) {
}
/**
* Deprecated due to a simpler but more powerful subcategory design.
* Please see https://bugzilla.redhat.com/show_bug.cgi?id=1069545
*/
@Deprecated
public void fetchSubCategory(boolean notused) {
}
}