/**
   * @deprecated since it was introduced in 0.9.0; for backwards compatibility only, may be removed
   *     at any point
   */
  @Deprecated
  public static RegisteredType of(CatalogItem<?, ?> item) {
    if (item == null) return null;
    TypeImplementationPlan impl = null;
    if (item.getPlanYaml() != null) {
      impl = new BasicTypeImplementationPlan(null, item.getPlanYaml());
    } else if (item.getJavaType() != null) {
      impl = new JavaClassNameTypeImplementationPlan(item.getJavaType());
    } else {
      throw new IllegalStateException(
          "Unsupported catalog item " + item + " when trying to create RegisteredType");
    }

    BasicRegisteredType type =
        (BasicRegisteredType)
            spec(item.getSymbolicName(), item.getVersion(), impl, item.getCatalogItemJavaType());
    type.displayName = item.getDisplayName();
    type.description = item.getDescription();
    type.iconUrl = item.getIconUrl();

    type.disabled = item.isDisabled();
    type.deprecated = item.isDeprecated();
    if (item.getLibraries() != null) type.bundles.addAll(item.getLibraries());
    // aliases aren't on item
    if (item.tags() != null) type.tags.addAll(item.tags().getTags());

    // these things from item we ignore: javaType, specType, registeredTypeName ...
    return type;
  }
  private boolean isABrooklynPolicy(Optional<String> policyType, ManagementContext mgmt) {
    if (!policyType.isPresent()) {
      return false;
    }

    Class clazz;
    CatalogItem catalogItem = CatalogUtils.getCatalogItemOptionalVersion(mgmt, policyType.get());
    if (catalogItem != null) {
      clazz = catalogItem.getCatalogItemJavaType();
    } else {
      try {
        clazz = Class.forName(policyType.get());
      } catch (ClassNotFoundException e) {
        return false;
      }
    }
    return Policy.class.isAssignableFrom(clazz);
  }
 /** @deprecated since 0.7.0, see {@link #newBasicMemento(BrooklynObject)} */
 @Deprecated
 public static CatalogItemMemento newCatalogItemMemento(CatalogItem<?, ?> catalogItem) {
   if (catalogItem instanceof CatalogItemDo<?, ?>) {
     catalogItem = ((CatalogItemDo<?, ?>) catalogItem).getDto();
   }
   BasicCatalogItemMemento.Builder builder = BasicCatalogItemMemento.builder();
   populateBrooklynObjectMementoBuilder(catalogItem, builder);
   builder
       .catalogItemJavaType(catalogItem.getCatalogItemJavaType())
       .catalogItemType(catalogItem.getCatalogItemType())
       .description(catalogItem.getDescription())
       .iconUrl(catalogItem.getIconUrl())
       .javaType(catalogItem.getJavaType())
       .libraries(catalogItem.getLibraries())
       .symbolicName(catalogItem.getSymbolicName())
       .specType(catalogItem.getSpecType())
       .version(catalogItem.getVersion())
       .planYaml(catalogItem.getPlanYaml())
       .deprecated(catalogItem.isDeprecated())
       .disabled(catalogItem.isDisabled());
   return builder.build();
 }
  @SuppressWarnings({"unchecked"})
  @Override
  public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(
      CatalogItem<T, SpecT> item, Set<String> encounteredTypes) {
    // Ignore old-style java type catalog items - there is a different (deprecated) transformer for
    // that
    if (item.getPlanYaml() == null) {
      throw new PlanNotRecognizedException("Old style catalog item " + item + " not supported.");
    }
    if (encounteredTypes.contains(item.getSymbolicName())) {
      throw new IllegalStateException(
          "Already encountered types "
              + encounteredTypes
              + " must not contain catalog item being resolver "
              + item.getSymbolicName());
    }

    // Not really clear what should happen to the top-level attributes, ignored until a good use
    // case appears.
    return (SpecT)
        CampResolver.createSpecFromFull(
            mgmt, RegisteredTypes.of(item), item.getCatalogItemJavaType(), encounteredTypes, null);
  }