private static void populateBrooklynObjectMementoBuilder(BrooklynObject instance, AbstractMemento.Builder<?> builder) { if (Proxy.isProxyClass(instance.getClass())) { throw new IllegalStateException("Attempt to create memento from proxy "+instance+" (would fail with wrong type)"); } OsgiClassPrefixer prefixer = new OsgiClassPrefixer(); Optional<String> typePrefix = prefixer.getPrefix(instance.getClass()); builder.id = instance.getId(); builder.displayName = instance.getDisplayName(); builder.catalogItemId = instance.getCatalogItemId(); builder.searchPath = instance.getCatalogItemIdSearchPath(); builder.type = (typePrefix.isPresent() ? typePrefix.get() : "") + instance.getClass().getName(); builder.typeClass = instance.getClass(); if (instance instanceof EntityAdjunct) { builder.uniqueTag = ((EntityAdjunct)instance).getUniqueTag(); } for (Object tag : instance.tags().getTags()) { builder.tags.add(tag); } // CatalogItems return empty support, so this is safe even through they don't support relations for (RelationshipType<?,? extends BrooklynObject> relationship: instance.relations().getRelationshipTypes()) { @SuppressWarnings({ "unchecked", "rawtypes" }) Set relations = instance.relations().getRelations((RelationshipType)relationship); Set<String> relationIds = Sets.newLinkedHashSet(); for (Object r: relations) relationIds.add( ((BrooklynObject)r).getId() ); builder.relations.put(relationship.getRelationshipTypeName(), relationIds); } }
@Override public void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeStringField("id", value.getId()); } @Override
private static String errorMessage(BrooklynObject object, Iterable<ConfigKey<?>> violations) { StringBuilder message = new StringBuilder("Error configuring ") .append(object.getDisplayName()) .append(": ["); Iterator<ConfigKey<?>> it = violations.iterator(); while (it.hasNext()) { ConfigKey<?> config = it.next(); message.append(config.getName()) .append(":") .append(config.getConstraint()); if (it.hasNext()) { message.append(", "); } } return message.append("]").toString(); }
String contextName = ""; if (obj!=null) { contextName = obj.getCatalogItemId(); if (Strings.isBlank(contextName)) contextName= obj.getDisplayName();
@Nullable protected ClassLoader getCustomClassLoaderForBrooklynObject(LookupContext lookupContext, BrooklynObjectType type, String objectId) { BrooklynObject item = lookupContext.peek(type, objectId); String catalogItemId = (item == null) ? null : item.getCatalogItemId(); // TODO enrichers etc aren't yet known -- would need to backtrack to the entity to get them from bundles if (catalogItemId == null) { return null; } // See RebindIteration.BrooklynObjectInstantiator.load(), for handling where catalog item is missing; // similar logic here. final ManagementContext managementContext = lookupContext.lookupManagementContext(); RegisteredType catalogItem = managementContext.getTypeRegistry().get(catalogItemId); if (catalogItem == null) { // TODO do we need to only log once, rather than risk log.warn too often? I think this only happens on rebind, so ok. LOG.warn("Unable to load catalog item "+catalogItemId +" for custom class loader of " + type + " " + objectId + "; will use default class loader"); return null; } else { final BrooklynClassLoadingContextSequential ctx = new BrooklynClassLoadingContextSequential(managementContext); ctx.add(CatalogUtils.newClassLoadingContextForCatalogItems(managementContext, item.getCatalogItemId(), item.getCatalogItemIdSearchPath())); return ClassLoaderFromBrooklynClassLoadingContext.of(ctx); } }
public static String getIconUrl(BrooklynObject object) { if (object==null) return null; NamedStringTag fromTag = BrooklynTags.findFirst(BrooklynTags.ICON_URL, object.tags().getTags()); if (fromTag!=null) return fromTag.getContents(); ManagementContext mgmt = ((BrooklynObjectInternal)object).getManagementContext(); if (mgmt==null) return null; BrooklynTypeRegistry registry = mgmt.getTypeRegistry(); if (registry==null) return null; RegisteredType item = registry.get( object.getCatalogItemId() ); if (item==null) return null; return item.getIconUrl(); }
public static void setCatalogItemIdOnAddition(Entity entity, BrooklynObject itemBeingAdded) { if (entity.getCatalogItemId()!=null) { if (itemBeingAdded.getCatalogItemId()==null) { if (log.isDebugEnabled()) BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity), "Catalog item addition: "+entity+" from "+entity.getCatalogItemId()+" applying its catalog item ID to "+itemBeingAdded); final BrooklynObjectInternal addInternal = (BrooklynObjectInternal) itemBeingAdded; addInternal.setCatalogItemIdAndSearchPath(entity.getCatalogItemId(), entity.getCatalogItemIdSearchPath()); } else { if (!itemBeingAdded.getCatalogItemId().equals(entity.getCatalogItemId())) { // not a problem, but something to watch out for log.debug("Cross-catalog item detected: "+entity+" from "+entity.getCatalogItemId()+" has "+itemBeingAdded+" from "+itemBeingAdded.getCatalogItemId()); } } } else if (itemBeingAdded.getCatalogItemId()!=null) { if (log.isDebugEnabled()) BrooklynLogging.log(log, BrooklynLogging.levelDebugOrTraceIfReadOnly(entity), "Catalog item addition: "+entity+" without catalog item ID has "+itemBeingAdded+" from "+itemBeingAdded.getCatalogItemId()); } }
@Test(dataProvider = "brooklynObjects") public void testCannotUpdateConfigToInvalidValue(BrooklynObject object) { try { object.config().set(EntityRequiringConfigKeyInRange.RANGE, -1); fail("Expected exception when calling config().set with invalid value on " + object); } catch (Exception e) { Throwable t = Exceptions.getFirstThrowableOfType(e, ConstraintViolationException.class); assertNotNull(t, "Original exception was: " + Exceptions.collapseText(e)); } }
@Override public boolean apply(String input, BrooklynObject context) { return context != null && context.getDisplayName().equals(input); } }
@Override public void onUnmanaged(BrooklynObject instance) { if (running && persister != null) { PersisterDeltaImpl delta = new PersisterDeltaImpl(); if (instance instanceof Entity) { delta.removedEntityIds.add(instance.getId()); } else if (instance instanceof Location) { delta.removedLocationIds.add(instance.getId()); } else if (instance instanceof Policy) { delta.removedPolicyIds.add(instance.getId()); } else if (instance instanceof Enricher) { delta.removedEnricherIds.add(instance.getId()); } else if (instance instanceof CatalogItem) { delta.removedCatalogItemIds.add(instance.getId()); } else if (instance instanceof ManagedBundle) { delta.removedBundleIds.add(instance.getId()); } else { throw new IllegalStateException("Unexpected brooklyn type: "+instance); } persister.delta(delta, exceptionHandler); } }
@Nonnull static String getDisplayNameOrName(HasName o1) { String n1 = null; if (o1 instanceof BrooklynObject) n1 = ((BrooklynObject)o1).getDisplayName(); if (Strings.isEmpty(n1) && o1 instanceof HasConfig && ((HasConfig)o1).getConfig()!=null) n1 = Strings.toString(((HasConfig)o1).getConfig().get("displayName")); // prefer display name if set if (Strings.isEmpty(n1)) n1 = o1.getName(); if (n1==null) { // put last return "~~~"; } return n1; }
public void add(BrooklynObject instance) { BrooklynObjectType type = BrooklynObjectType.of(instance); getUnsafeCollectionOfType(type).add(instance); if (type==BrooklynObjectType.CATALOG_ITEM) { removedCatalogItemIds.remove(instance.getId()); } }
public void addIfNotRemoved(BrooklynObject instance) { BrooklynObjectType type = BrooklynObjectType.of(instance); if (!getRemovedIdsOfType(type).contains(instance.getId())) { getUnsafeCollectionOfType(type).add(instance); } }
public void remove(BrooklynObject instance) { BrooklynObjectType type = BrooklynObjectType.of(instance); getUnsafeCollectionOfType(type).remove(instance); getRemovedIdsOfType(type).add(instance.getId()); }
@Override public void onManageFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) { Exceptions.propagateIfFatal(e); String errmsg = "problem managing "+type.toCamelCase()+" "+instance.getId()+" ("+instance+")"; exceptions.add(new IllegalStateException(errmsg, e)); onErrorImpl(errmsg, e); }
@Override public void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) { Exceptions.propagateIfFatal(e); String errmsg = "problem rebinding "+type.toCamelCase()+" "+instance.getId()+" ("+instance+")"; switch (type) { case FEED: case ENRICHER: case POLICY: switch (addPolicyFailureMode) { case FAIL_FAST: throw new IllegalStateException("Rebind: aborting due to "+errmsg, e); case FAIL_AT_END: addPolicyFailures.add(new IllegalStateException(errmsg, e)); break; case CONTINUE: warn(errmsg+"; continuing", e); creationFailedIds.add(instance.getId()); break; default: throw new IllegalStateException("Unexpected state '"+addPolicyFailureMode+"' for addPolicyFailureMode"); } break; default: exceptions.add(new IllegalStateException(errmsg, e)); onErrorImpl(errmsg, e); break; } }
private <T extends BrooklynObject> ManagementTransitionMode updateTransitionMode(BrooklynObjectManagerInternal<T> boManager, T bo) { ManagementTransitionMode oldTransitionMode = boManager.getLastManagementTransitionMode(bo.getId()); Boolean isNowReadOnly = rebindContext.isReadOnly(bo); BrooklynObjectManagementMode modeBefore, modeAfter; if (oldTransitionMode==null) { modeBefore = BrooklynObjectManagementMode.UNMANAGED_PERSISTED; } else { modeBefore = oldTransitionMode.getModeAfter(); } if (isRebindingActiveAgain()) { Preconditions.checkState(!Boolean.TRUE.equals(isNowReadOnly)); Preconditions.checkState(modeBefore==BrooklynObjectManagementMode.MANAGED_PRIMARY); modeAfter = BrooklynObjectManagementMode.MANAGED_PRIMARY; } else if (isNowReadOnly) { modeAfter = BrooklynObjectManagementMode.LOADED_READ_ONLY; } else { modeAfter = BrooklynObjectManagementMode.MANAGED_PRIMARY; } ManagementTransitionMode newTransitionMode = ManagementTransitionMode.transitioning(modeBefore, modeAfter); boManager.setManagementTransitionMode(bo, newTransitionMode); return oldTransitionMode; }
@Override public void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e) { rebindFailures.put(instance, new IllegalStateException("problem rebinding "+type.toCamelCase()+" "+instance.getId()+" ("+instance+")", e)); super.onRebindFailed(type, instance, e); }
@SuppressWarnings("unchecked") @VisibleForTesting public LookupContextImpl add(BrooklynObject object) { if (object!=null) { ((Map<String,BrooklynObject>) getMapFor(BrooklynObjectType.of(object))).put(object.getId(), object); } return this; } };