/*
* RHQ Management Platform
* Copyright (C) 2005-2014 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.List;
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.measurement.AvailabilityType;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.util.CriteriaUtils;
import org.rhq.core.domain.util.PageOrdering;
/**
* @author Joseph Marques
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("unused")
public class ResourceCriteria extends TaggedCriteria {
private static final long serialVersionUID = 3L;
private String filterName;
private String filterResourceKey;
private InventoryStatus filterInventoryStatus = InventoryStatus.COMMITTED; // default
private List<InventoryStatus> filterInventoryStatuses; // needs overrides
private String filterVersion;
private String filterDescription;
private Integer filterResourceTypeId; // needs overrides
private String filterResourceTypeName; // needs overrides
private List<ResourceCategory> filterResourceCategories; // needs overrides
private List<Integer> filterResourceTypeIds;
private String filterPluginName; // needs overrides
private Integer filterParentResourceId; // needs overrides
private String filterParentResourceName; // needs overrides
private Integer filterParentResourceTypeId; // needs overrides
private ResourceCategory filterParentResourceCategory; // needs overrides
private List<InventoryStatus> filterParentInventoryStatuses; // needs overrides
private String filterAgentName; // needs overrides
private Integer filterAgentId; // needs overrides
private AvailabilityType filterCurrentAvailability; // needs overrides
private Long filterStartItime;
private Long filterEndItime;
private List<Integer> filterExplicitGroupIds; // requires overrides
private List<Integer> filterImplicitGroupIds; // requires overrides
private Integer filterRootResourceId; // requires overrides
private boolean fetchResourceType;
private boolean fetchChildResources;
private boolean fetchParentResource;
private boolean fetchResourceConfiguration;
private boolean fetchPluginConfiguration;
private boolean fetchAgent;
private boolean fetchAlertDefinitions;
private boolean fetchResourceConfigurationUpdates;
private boolean fetchPluginConfigurationUpdates;
private boolean fetchImplicitGroups;
private boolean fetchExplicitGroups;
private boolean fetchContentServiceRequests;
private boolean fetchCreateChildResourceRequests;
private boolean fetchDeleteResourceRequests;
private boolean fetchOperationHistories;
private boolean fetchInstalledPackages;
private boolean fetchInstalledPackageHistory;
private boolean fetchResourceRepos;
private boolean fetchSchedules;
private boolean fetchCurrentAvailability;
private boolean fetchResourceErrors;
private boolean fetchEventSources;
private boolean fetchProductVersion;
private boolean fetchDriftDefinitions;
private PageOrdering sortName;
private PageOrdering sortInventoryStatus;
private PageOrdering sortVersion;
private PageOrdering sortResourceTypeName; // needs overrides
private PageOrdering sortResourceCategory; // needs overrides
private PageOrdering sortPluginName; // needs overrides
private PageOrdering sortParentResourceName; // needs overrides
private PageOrdering sortAgentName; // needs overrides
private PageOrdering sortCurrentAvailability; // needs overrides
private PageOrdering sortResourceAncestry; // needs overrides
/**
* Note: This constructor sets by default:
* <pre>filterInventoryStatus = InventoryStatus.COMMITTED</pre>
*
* <p>For other implicit defaults see {@link Criteria#Criteria()}</p>
*
* @see Criteria#Criteria()
*/
public ResourceCriteria() {
filterOverrides.put("resourceTypeId", "resourceType.id = ?");
filterOverrides.put("resourceTypeName", "resourceType.name like ?");
filterOverrides.put("resourceCategories", "resourceType.category IN ( ? )");
filterOverrides.put("pluginName", "resourceType.plugin like ?");
filterOverrides.put("parentResourceId", "parentResource.id = ?");
filterOverrides.put("parentResourceName", "parentResource.name like ?");
filterOverrides.put("parentResourceTypeId", "parentResource.resourceType.id = ?");
filterOverrides.put("parentResourceCategory", "parentResource.resourceType.category = ?");
filterOverrides.put("agentName", "agent.name like ?");
filterOverrides.put("agentId", "agent.id = ?");
filterOverrides.put("currentAvailability", "currentAvailability.availabilityType = ?");
filterOverrides.put("startItime", "itime >= ?");
filterOverrides.put("endItime", "itime <= ?");
filterOverrides.put("explicitGroupIds", "" //
+ "id IN ( SELECT ires.id " //
+ " FROM Resource ires " //
+ " JOIN ires.explicitGroups explicitGroup " //
+ " WHERE explicitGroup.id IN ( ? ) )");
filterOverrides.put("implicitGroupIds", "" //
+ "id IN ( SELECT ires.id " //
+ " FROM Resource ires " //
+ " JOIN ires.implicitGroups implicitGroup " //
+ " WHERE implicitGroup.id IN ( ? ) )");
filterOverrides.put("rootResourceId", "agent.id = (SELECT r2.agent.id FROM Resource r2 where r2.id = ?)");
filterOverrides.put("resourceTypeIds", "resourceType.id IN (?)");
filterOverrides.put("inventoryStatuses", "inventoryStatus IN ( ? )");
filterOverrides.put("parentInventoryStatuses", "parentResource.inventoryStatus IN ( ? )");
sortOverrides.put("resourceTypeName", "resourceType.name");
sortOverrides.put("resourceCategory", "resourceType.category");
sortOverrides.put("pluginName", "resourceType.plugin");
sortOverrides.put("parentResourceName", "parentResource.name");
sortOverrides.put("agentName", "agent.name");
sortOverrides.put("currentAvailability", "currentAvailability.availabilityType");
sortOverrides.put("resourceAncestry", "ancestry");
}
@Override
public Class<Resource> getPersistentClass() {
return Resource.class;
}
public void addFilterName(String filterName) {
this.filterName = filterName;
}
public void addFilterResourceKey(String filterResourceKey) {
this.filterResourceKey = filterResourceKey;
}
/**
* Note, by default this filter is set to COMMITTED. This must be explicitly set to null to get all
* Resources.
*
* @param filterInventoryStatus
*/
public void addFilterInventoryStatus(InventoryStatus filterInventoryStatus) {
this.filterInventoryStatus = filterInventoryStatus;
}
/**
* Note, setting this filter will set filterInventoryStatus to null since that is a mutually exclusive filter.
*
* @param filterInventoryStatuses
*/
public void addFilterInventoryStatuses(List<InventoryStatus> filterInventoryStatuses) {
this.filterInventoryStatuses = filterInventoryStatuses;
this.filterInventoryStatus = null;
}
public void addFilterVersion(String filterVersion) {
this.filterVersion = filterVersion;
}
public void addFilterDescription(String filterDescription) {
this.filterDescription = filterDescription;
}
public void addFilterResourceTypeId(Integer filterResourceTypeId) {
this.filterResourceTypeId = filterResourceTypeId;
}
public void addFilterResourceTypeIds(Integer... filterResourceTypeIds) {
this.filterResourceTypeIds = Arrays.asList(filterResourceTypeIds);
}
public void addFilterResourceTypeName(String filterResourceTypeName) {
this.filterResourceTypeName = filterResourceTypeName;
}
public void addFilterResourceCategories(ResourceCategory... filterResourceCategories) {
this.filterResourceCategories = CriteriaUtils.getListIgnoringNulls(filterResourceCategories);
}
public void addFilterPluginName(String filterPluginName) {
this.filterPluginName = filterPluginName;
}
public void setStrictFilterPluginName(boolean strict) {
Set<String> strictFilters = new HashSet<String>(Arrays.asList(getStrictFilters()));
if (strict) {
strictFilters.add("pluginName");
} else {
strictFilters.remove("pluginName");
}
setStrictFilters(strictFilters.toArray(new String[strictFilters.size()]));
}
public void setCaseSensitiveFilterPluginName(boolean caseSensitive) {
Set<String> caseSensitiveFilters = new HashSet<String>(Arrays.asList(getCaseSensitiveFilters()));
if (caseSensitive) {
caseSensitiveFilters.add("pluginName");
} else {
caseSensitiveFilters.remove("pluginName");
}
setCaseSensitiveFilters(caseSensitiveFilters.toArray(new String[caseSensitiveFilters.size()]));
}
public void addFilterParentResourceId(Integer filterParentResourceId) {
this.filterParentResourceId = filterParentResourceId;
}
public void addFilterParentResourceName(String filterParentResourceName) {
this.filterParentResourceName = filterParentResourceName;
}
public void addFilterParentResourceTypeId(int filterParentResourceTypeId) {
this.filterParentResourceTypeId = filterParentResourceTypeId;
}
public void addFilterParentResourceCategory(ResourceCategory filterParentResourceCategory) {
this.filterParentResourceCategory = filterParentResourceCategory;
}
public void addFilterParentInventoryStatuses(List<InventoryStatus> filterParentInventoryStatuses) {
this.filterParentInventoryStatuses = filterParentInventoryStatuses;
}
public void addFilterAgentName(String filterAgentName) {
this.filterAgentName = filterAgentName;
}
public void addFilterAgentId(Integer filterAgentId) {
this.filterAgentId = filterAgentId;
}
public void addFilterCurrentAvailability(AvailabilityType filterCurrentAvailability) {
this.filterCurrentAvailability = filterCurrentAvailability;
}
public void addFilterStartItime(long itime) {
filterStartItime = itime;
}
public void addFilterEndItime(long itime) {
filterEndItime = itime;
}
public void addFilterExplicitGroupIds(Integer... filterExplicitGroupIds) {
this.filterExplicitGroupIds = CriteriaUtils.getListIgnoringNulls(filterExplicitGroupIds);
}
public void addFilterImplicitGroupIds(Integer... filterImplicitGroupIds) {
this.filterImplicitGroupIds = CriteriaUtils.getListIgnoringNulls(filterImplicitGroupIds);
}
public void addFilterRootResourceId(Integer filterRootResourceId) {
this.filterRootResourceId = filterRootResourceId;
}
public void fetchResourceType(boolean fetchResourceType) {
this.fetchResourceType = fetchResourceType;
}
/**
* Requires MANAGE_INVENTORY
* @param fetchChildResources
*/
public void fetchChildResources(boolean fetchChildResources) {
this.fetchChildResources = fetchChildResources;
}
/**
* Requires MANAGE_INVENTORY
* @param fetchParentResource
*/
public void fetchParentResource(boolean fetchParentResource) {
this.fetchParentResource = fetchParentResource;
}
/**
* @param fetchResourceConfiguration if true fetch the current resource configuration for the Resource. The
* "current" configuration is that which has been most recently reported and stored server-side, the agent is not
* queried. For agent-side configuration look for methods reporting "live" configuration.
*/
public void fetchResourceConfiguration(boolean fetchResourceConfiguration) {
this.fetchResourceConfiguration = fetchResourceConfiguration;
}
public void fetchPluginConfiguration(boolean fetchPluginConfiguration) {
this.fetchPluginConfiguration = fetchPluginConfiguration;
}
public void fetchAgent(boolean fetchAgent) {
this.fetchAgent = fetchAgent;
}
public void fetchAlertDefinitions(boolean fetchAlertDefinitions) {
this.fetchAlertDefinitions = fetchAlertDefinitions;
}
public void fetchResourceConfigurationUpdates(boolean fetchResourceConfigurationUpdates) {
this.fetchResourceConfigurationUpdates = fetchResourceConfigurationUpdates;
}
public void fetchPluginConfigurationUpdates(boolean fetchPluginConfigurationUpdates) {
this.fetchPluginConfigurationUpdates = fetchPluginConfigurationUpdates;
}
public void fetchImplicitGroups(boolean fetchImplicitGroups) {
this.fetchImplicitGroups = fetchImplicitGroups;
}
public void fetchExplicitGroups(boolean fetchExplicitGroups) {
this.fetchExplicitGroups = fetchExplicitGroups;
}
public void fetchContentServiceRequests(boolean fetchContentServiceRequests) {
this.fetchContentServiceRequests = fetchContentServiceRequests;
}
public void fetchCreateChildResourceRequests(boolean fetchCreateChildResourceRequests) {
this.fetchCreateChildResourceRequests = fetchCreateChildResourceRequests;
}
public void fetchDeleteResourceRequests(boolean fetchDeleteResourceRequests) {
this.fetchDeleteResourceRequests = fetchDeleteResourceRequests;
}
public void fetchOperationHistories(boolean fetchOperationHistories) {
this.fetchOperationHistories = fetchOperationHistories;
}
public void fetchInstalledPackages(boolean fetchInstalledPackages) {
this.fetchInstalledPackages = fetchInstalledPackages;
}
public void fetchInstalledPackageHistory(boolean fetchInstalledPackageHistory) {
this.fetchInstalledPackageHistory = fetchInstalledPackageHistory;
}
public void fetchResourceRepos(boolean fetchResourceRepos) {
this.fetchResourceRepos = fetchResourceRepos;
}
public void fetchSchedules(boolean fetchSchedules) {
this.fetchSchedules = fetchSchedules;
}
public void fetchCurrentAvailability(boolean fetchCurrentAvailability) {
this.fetchCurrentAvailability = fetchCurrentAvailability;
}
public void fetchResourceErrors(boolean fetchResourceErrors) {
this.fetchResourceErrors = fetchResourceErrors;
}
public void fetchEventSources(boolean fetchEventSources) {
this.fetchEventSources = fetchEventSources;
}
public void fetchProductVersion(boolean fetchProductVersion) {
this.fetchProductVersion = fetchProductVersion;
}
public void fetchDriftDefinitions(boolean fetchDriftDefinitions) {
this.fetchDriftDefinitions = fetchDriftDefinitions;
}
public void addSortName(PageOrdering sortName) {
addSortField("name");
this.sortName = sortName;
}
public void addSortInventoryStatus(PageOrdering sortInventoryStatus) {
addSortField("inventoryStatus");
this.sortInventoryStatus = sortInventoryStatus;
}
public void addSortVersion(PageOrdering sortVersion) {
addSortField("version");
this.sortVersion = sortVersion;
}
public void addSortResourceTypeName(PageOrdering sortResourceTypeName) {
addSortField("resourceTypeName");
this.sortResourceTypeName = sortResourceTypeName;
}
public void addSortResourceCategory(PageOrdering sortResourceCategory) {
addSortField("resourceCategory");
this.sortResourceCategory = sortResourceCategory;
}
public void addSortPluginName(PageOrdering sortPluginName) {
addSortField("pluginName");
this.sortPluginName = sortPluginName;
}
public void addSortParentResourceName(PageOrdering sortParentResourceName) {
addSortField("parentResourceName");
this.sortParentResourceName = sortParentResourceName;
}
public void addSortAgentName(PageOrdering sortAgentName) {
addSortField("agentName");
this.sortAgentName = sortAgentName;
}
public void addSortCurrentAvailability(PageOrdering sortCurrentAvailability) {
addSortField("currentAvailability");
this.sortCurrentAvailability = sortCurrentAvailability;
}
public void addSortResourceAncestry(PageOrdering sortAncestry) {
addSortField("resourceAncestry");
this.sortResourceAncestry = sortAncestry;
}
/** subclasses should override as necessary */
public boolean isInventoryManagerRequired() {
return (this.fetchChildResources || this.fetchParentResource);
}
}