metadataTypes = (null == metadataTypes) ? EnumSet.noneOf(MetadataType.class) : metadataTypes;
final Map<Integer, ResourceType> cachedTypes = new HashMap<Integer, ResourceType>();
List<Integer> typesNeeded = new ArrayList<Integer>();
EnumSet<MetadataType> metadataTypesNeeded = EnumSet.noneOf(MetadataType.class);
ResourceTypeCriteria criteria = new ResourceTypeCriteria();
criteria.addFilterIgnored(null); // we will cache both unignored and ignored types
if (resourceTypeIds == null) {
//preload all
} else {
for (Integer typeId : resourceTypeIds) {
// we need to query for data if:
// 1. we don't have the resource type in our cache at all, or...
// 2. we have the basic resource type but no additional metadata, but the caller is asking for additional metadata
// 3. we have the resource type and some additional metadata, but the caller is asking for metadata that we don't have
if (!typeCache.containsKey(typeId) // 1.
|| (!metadataTypes.isEmpty() && (!typeCacheLevel.containsKey(typeId) // 2.
|| !typeCacheLevel.get(typeId).containsAll(metadataTypes)))) // 3.
{
// add this type to the types we need to fetch
typesNeeded.add(typeId);
// make sure we fetch the metadata needed for this type
if (metadataTypesNeeded.size() < metadataTypes.size()) {
EnumSet<MetadataType> metadataTypesCached = typeCacheLevel.get(typeId);
if (metadataTypesCached == null) {
metadataTypesNeeded = metadataTypes;
} else {
for (MetadataType metadataType : metadataTypes) {
if (!metadataTypesCached.contains(metadataType)) {
metadataTypesNeeded.add(metadataType);
}
}
}
}
} else {
cachedTypes.put(typeId, typeCache.get(typeId));
}
}
if (typesNeeded.isEmpty()) {
if (callback != null) {
callback.onTypesLoaded(cachedTypes);
}
return;
}
criteria.addFilterIds(typesNeeded.toArray(new Integer[typesNeeded.size()]));
}
for (MetadataType metadataType : metadataTypesNeeded) {
switch (metadataType) {
case children:
criteria.fetchChildResourceTypes(true);
break;
case content:
criteria.fetchPackageTypes(true);
break;
case events:
criteria.fetchEventDefinitions(true);
break;
case measurements:
criteria.fetchMetricDefinitions(true);
break;
case operations:
criteria.fetchOperationDefinitions(true);
break;
case parentTypes:
criteria.fetchParentResourceTypes(true);
break;
case pluginConfigurationDefinition:
criteria.fetchPluginConfigurationDefinition(true);
break;
case processScans:
criteria.fetchProcessScans(true);
break;
case productVersions:
criteria.fetchProductVersions(true);
break;
case resourceConfigurationDefinition:
criteria.fetchResourceConfigurationDefinition(true);
break;
case driftDefinitionTemplates:
criteria.fetchDriftDefinitionTemplates(true);
break;
case bundleConfiguration:
criteria.fetchBundleConfiguration(true);
break;
default:
Log.error("Metadata type [" + metadataType.name() + "] not incorporated into ResourceType criteria.");
}
}
criteria.setPageControl(PageControl.getUnlimitedInstance());
Log.info("Loading [" + typesNeeded.size() + "] types with facets=[" + metadataTypesNeeded + "]...");
if ((topLevelServerAndServiceTypes == null) && metadataTypesNeeded.contains(MetadataType.children)) {
// Perform a one-time load of server and service types with no parent types. These types are implicitly