Github user aledsage commented on a diff in the pull request: https://github.com/apache/brooklyn-server/pull/873#discussion_r149049524 --- Diff: core/src/main/java/org/apache/brooklyn/core/typereg/BundleUpgradeParser.java --- @@ -312,6 +335,90 @@ public static boolean contains(Iterable<VersionRangedName> names, VersionedName public static boolean contains(VersionRangedName range, VersionedName name) { return range.getSymbolicName().equals(name.getSymbolicName()) && range.getOsgiVersionRange().includes(name.getOsgiVersion()); } + + @Beta + public static void storeInManagementContext(CatalogUpgrades catalogUpgrades, ManagementContext managementContext) { + ((BasicBrooklynTypeRegistry)managementContext.getTypeRegistry()).storeCatalogUpgradesInstructions(catalogUpgrades); + } + + @Beta @Nonnull + public static CatalogUpgrades getFromManagementContext(ManagementContext managementContext) { + CatalogUpgrades result = ((BasicBrooklynTypeRegistry)managementContext.getTypeRegistry()).getCatalogUpgradesInstructions(); + if (result!=null) { + return result; + } + return builder().build(); + } + + @Beta + public static String getBundleUpgradedIfNecessary(ManagementContext mgmt, String vName) { + if (vName==null) return null; + Maybe<OsgiManager> osgi = ((ManagementContextInternal)mgmt).getOsgiManager(); + if (osgi.isAbsent()) { + // ignore upgrades if not osgi + return vName; + } + if (osgi.get().getManagedBundle(VersionedName.fromString(vName))!=null) { + // bundle installed, prefer that to upgrade + return vName; + } + return getItemUpgradedIfNecessary(mgmt, vName, (cu,vn) -> cu.getUpgradesForBundle(vn)); + } + @Beta + public static String getTypeUpgradedIfNecessary(ManagementContext mgmt, String vName) { + if (vName==null || mgmt.getTypeRegistry().get(vName)!=null) { + // item found (or n/a), prefer that to upgrade + return vName; + } + // callers should use BrooklynTags.newUpgradedFromTag if creating a spec, + // then warn on instantiation, done only for entities currently. + // (yoml will allow us to have one code path for all the different creation routines.) + // persistence/rebind also warns. + return getItemUpgradedIfNecessary(mgmt, vName, (cu,vn) -> cu.getUpgradesForType(vn)); + } + + private interface LookupFunction { + public Set<VersionedName> lookup(CatalogUpgrades cu, VersionedName vn); + } + private static String getItemUpgradedIfNecessary(ManagementContext mgmt, String vName, LookupFunction lookupF) { + Set<VersionedName> r = lookupF.lookup(getFromManagementContext(mgmt), VersionedName.fromString(vName)); + if (!r.isEmpty()) return r.iterator().next().toString(); + + if (log.isTraceEnabled()) { + log.trace("Could not find '"+vName+"' and no upgrades specified; subsequent failure or warning possible unless that is a direct java class reference"); + } + return vName; + } + + /** This method is used internally to mark places we need to update when we switch to persisting and loading + * registered type IDs instead of java types, as noted on RebindIteration.load */ + @Beta + public static boolean markerForCodeThatLoadsJavaTypesButShouldLoadRegisteredType() { + // return true if we use registered types, and update callers not to need this method + return false; + } + + @Beta + CatalogUpgrades withTypeCleared(VersionedName versionedName) { + return builder().addAll(this).clearUpgradesProvidedByType(versionedName).build(); + } + @Beta + CatalogUpgrades withBundleCleared(VersionedName versionedName) { + return builder().addAll(this).clearUpgradesProvidedByType(versionedName).build(); --- End diff -- Should this instead call `clearUpgradesProvidedByBundle`?
---