http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java index 399f9dc..70224aa 100644 --- a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java +++ b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/CatalogEntitySpecResolver.java @@ -20,15 +20,10 @@ package org.apache.brooklyn.core.resolve.entity; import java.util.Set; -import org.apache.brooklyn.api.catalog.CatalogItem; -import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.catalog.internal.CatalogUtils; -import org.apache.brooklyn.core.mgmt.EntityManagementUtils; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext; -import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider; +import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,27 +36,25 @@ public class CatalogEntitySpecResolver extends AbstractEntitySpecResolver { super(RESOLVER_NAME); } + // in 0.9.0 we've changed this *not* to perform + // symbolicName = DeserializingClassRenamesProvider.findMappedName(symbolicName); + // in belief that this should only apply to *java* loads TODO-type-registry confirm this + @Override protected boolean canResolve(String type, BrooklynClassLoadingContext loader) { String localType = getLocalType(type); - CatalogItem<Entity, EntitySpec<?>> item = getCatalogItem(mgmt, localType); - if (item != null) { - try { - //Keeps behaviour of previous functionality, but probably should throw instead when using disabled items. - checkUsable(item); - return true; - } catch (IllegalStateException e) { - return false; - } - } else { - return false; - } + RegisteredType item = mgmt.getTypeRegistry().get(localType); + if (item==null) return false; + //Keeps behaviour of previous functionality, but caller might be interested if item is disabled + if (item.isDisabled()) return false; + + return true; } @Override public EntitySpec<?> resolve(String type, BrooklynClassLoadingContext loader, Set<String> parentEncounteredTypes) { String localType = getLocalType(type); - CatalogItem<Entity, EntitySpec<?>> item = getCatalogItem(mgmt, localType); + RegisteredType item = mgmt.getTypeRegistry().get(localType); if (item == null) return null; checkUsable(item); @@ -69,21 +62,14 @@ public class CatalogEntitySpecResolver extends AbstractEntitySpecResolver { //Take the symbolicName part of the catalog item only for recursion detection to prevent //cross referencing of different versions. Not interested in non-catalog item types. //Prevent catalog items self-referencing even if explicitly different version. - boolean nonRecursiveCall = !parentEncounteredTypes.contains(item.getSymbolicName()); - if (nonRecursiveCall) { - // CatalogItem generics are just getting in the way, better get rid of them, we - // are casting anyway. - @SuppressWarnings({ "rawtypes" }) - CatalogItem rawItem = item; - @SuppressWarnings({ "rawtypes", "unchecked" }) - AbstractBrooklynObjectSpec rawSpec = EntityManagementUtils.createCatalogSpec(mgmt, rawItem, parentEncounteredTypes); - return (EntitySpec<?>) rawSpec; - } else { - return null; - } + boolean recursiveCall = parentEncounteredTypes.contains(item.getSymbolicName()); + if (recursiveCall) return null; + return mgmt.getTypeRegistry().createSpec(item, + RegisteredTypeConstraints.alreadyVisited(parentEncounteredTypes), + EntitySpec.class); } - private void checkUsable(CatalogItem<Entity, EntitySpec<?>> item) { + private void checkUsable(RegisteredType item) { if (item.isDisabled()) { throw new IllegalStateException("Illegal use of disabled catalog item "+item.getSymbolicName()+":"+item.getVersion()); } else if (item.isDeprecated()) { @@ -91,9 +77,9 @@ public class CatalogEntitySpecResolver extends AbstractEntitySpecResolver { } } - protected CatalogItem<Entity,EntitySpec<?>> getCatalogItem(ManagementContext mgmt, String brooklynType) { - brooklynType = DeserializingClassRenamesProvider.findMappedName(brooklynType); - return CatalogUtils.getCatalogItemOptionalVersion(mgmt, Entity.class, brooklynType); - } +// protected CatalogItem<Entity,EntitySpec<?>> getCatalogItem(ManagementContext mgmt, String brooklynType) { +// brooklynType = DeserializingClassRenamesProvider.findMappedName(brooklynType); +// return CatalogUtils.getCatalogItemOptionalVersion(mgmt, Entity.class, brooklynType); +// } }
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java index b8ce013..047e11d 100644 --- a/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java +++ b/core/src/main/java/org/apache/brooklyn/core/resolve/entity/JavaEntitySpecResolver.java @@ -26,6 +26,7 @@ import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext; +import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider; import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.javalang.Reflections; @@ -37,6 +38,13 @@ public class JavaEntitySpecResolver extends AbstractEntitySpecResolver{ } @Override + protected String getLocalType(String type) { + type = super.getLocalType(type); + type = DeserializingClassRenamesProvider.findMappedName(type); + return type; + } + + @Override protected boolean canResolve(String type, BrooklynClassLoadingContext loader) { String localType = getLocalType(type); Maybe<?> javaType = tryLoadJavaType(localType, loader); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java index 3d418e4..0a9a229 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java @@ -18,22 +18,21 @@ */ package org.apache.brooklyn.core.typereg; +import javax.annotation.Nullable; + import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry; -import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; import org.apache.brooklyn.api.typereg.RegisteredType; +import org.apache.brooklyn.api.typereg.RegisteredTypeConstraint; +import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; -import org.apache.brooklyn.core.typereg.RegisteredTypes.JavaTypeImplementation; import org.apache.brooklyn.core.typereg.RegisteredTypes.RegisteredSpecType; -import org.apache.brooklyn.core.typereg.RegisteredTypes.TypeImplementation; -import org.apache.brooklyn.util.collections.MutableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; @@ -49,74 +48,73 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry { this.mgmt = mgmt; } - private static final Function<CatalogItem<?,?>,RegisteredType> CI_TO_RT = new Function<CatalogItem<?,?>, RegisteredType>() { - @Override - public RegisteredType apply(CatalogItem<?, ?> item) { - if (item==null) return null; - TypeImplementation impl = null; - if (item.getPlanYaml()!=null) { - impl = new TypeImplementation(null, item.getPlanYaml()); - } - if (item.getJavaType()!=null) { - impl = new JavaTypeImplementation(item.getJavaType()); - } - if (impl!=null) { - RegisteredSpecType type = new RegisteredSpecType(item.getSymbolicName(), item.getVersion(), - item.getCatalogItemJavaType(), impl); - type.bundles = MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries()); - type.displayName = item.getDisplayName(); - type.description = item.getDescription(); - type.iconUrl = item.getIconUrl(); - - // TODO - // disabled, deprecated - // javaType, specType, registeredTypeName ... - // tags ? - return type; - } - throw new IllegalStateException("Unsupported catalog item "+item+" when trying to create RegisteredType"); - } - }; - public Iterable<RegisteredType> getAll() { return getAll(Predicates.alwaysTrue()); } + @SuppressWarnings("deprecation") @Override public Iterable<RegisteredType> getAll(Predicate<? super RegisteredType> filter) { - return Iterables.filter(Iterables.transform(mgmt.getCatalog().getCatalogItems(), CI_TO_RT), filter); + return Iterables.filter(Iterables.transform(mgmt.getCatalog().getCatalogItems(), RegisteredTypes.CI_TO_RT), filter); } + @SuppressWarnings("deprecation") @Override - public RegisteredType get(String symbolicNameWithOptionalVersion, RegisteredTypeKind kind, Class<?> parentClass) { + public RegisteredType get(String symbolicName, String version, RegisteredTypeConstraint constraint) { + if (constraint==null) constraint = RegisteredTypeConstraints.any(); + if (version==null) version = BrooklynCatalog.DEFAULT_VERSION; + + // TODO lookup here, using constraints + + // fallback to catalog + CatalogItem<?, ?> item = mgmt.getCatalog().getCatalogItem(symbolicName, version); + // TODO apply constraint + return RegisteredTypes.CI_TO_RT.apply( item ); + } + + @Override + public RegisteredType get(String symbolicName, String version) { + return get(symbolicName, version, null); + } + + @Override + public RegisteredType get(String symbolicNameWithOptionalVersion, RegisteredTypeConstraint constraint) { if (CatalogUtils.looksLikeVersionedId(symbolicNameWithOptionalVersion)) { - String id = CatalogUtils.getSymbolicNameFromVersionedId(symbolicNameWithOptionalVersion); + String symbolicName = CatalogUtils.getSymbolicNameFromVersionedId(symbolicNameWithOptionalVersion); String version = CatalogUtils.getVersionFromVersionedId(symbolicNameWithOptionalVersion); - return get(id, version, kind, parentClass); + return get(symbolicName, version, constraint); } else { - return get(symbolicNameWithOptionalVersion, BrooklynCatalog.DEFAULT_VERSION, kind, parentClass); + return get(symbolicNameWithOptionalVersion, BrooklynCatalog.DEFAULT_VERSION, constraint); } } @Override - public RegisteredType get(String symbolicName, String version, RegisteredTypeKind kind, Class<?> parentClass) { - return CI_TO_RT.apply( mgmt.getCatalog().getCatalogItem(symbolicName, version) ); + public RegisteredType get(String symbolicNameWithOptionalVersion) { + return get(symbolicNameWithOptionalVersion, (RegisteredTypeConstraint)null); } + @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" }) @Override - public RegisteredType get(String symbolicName, String version) { - return get(symbolicName, version, null, null); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public <T extends AbstractBrooklynObjectSpec> T createSpec(RegisteredType type, Class<T> specKind) { + public <SpecT extends AbstractBrooklynObjectSpec<?,?>> SpecT createSpec(RegisteredType type, @Nullable RegisteredTypeConstraint constraint, Class<SpecT> specSuperType) { if (!(type instanceof RegisteredSpecType)) { throw new IllegalStateException("Cannot create spec from type "+type); } + if (constraint!=null) { + if (constraint.getKind()!=null && constraint.getKind()!=RegisteredTypeKind.SPEC) { + throw new IllegalStateException("Cannot create spec with constraint "+constraint); + } + if (constraint.getEncounteredTypes().contains(type.getSymbolicName())) { + // avoid recursive cycle + // TODO implement using java if permitted + } + } + constraint = RegisteredTypeConstraints.extendedWithSpecSuperType(constraint, specSuperType); + + // TODO look up in the actual registry - CatalogItem item = mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion()); - return (T) mgmt.getCatalog().createSpec(item); + // fallback: look up in (legacy) catalog + CatalogItem item = (CatalogItem) mgmt.getCatalog().getCatalogItem(type.getSymbolicName(), type.getVersion()); + return (SpecT) BasicBrooklynCatalog.internalCreateSpecWithTransformers(mgmt, item, constraint.getEncounteredTypes()); } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java new file mode 100644 index 0000000..7f49335 --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypeConstraints.java @@ -0,0 +1,152 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.brooklyn.core.typereg; + +import groovy.xml.Entity; + +import java.util.Set; + +import org.apache.brooklyn.api.entity.EntitySpec; +import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec; +import org.apache.brooklyn.api.objs.BrooklynObject; +import org.apache.brooklyn.api.objs.BrooklynObjectType; +import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind; +import org.apache.brooklyn.api.typereg.RegisteredTypeConstraint; +import org.apache.brooklyn.util.collections.MutableSet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.ImmutableSet; + +public class RegisteredTypeConstraints { + + private static final Logger log = LoggerFactory.getLogger(RegisteredTypeConstraints.BasicRegisteredTypeConstraint.class); + + public final static class BasicRegisteredTypeConstraint implements RegisteredTypeConstraint { + private RegisteredTypeKind kind; + private Class<?> javaSuperType; + private Set<String> encounteredTypes; + + private BasicRegisteredTypeConstraint() {} + + public BasicRegisteredTypeConstraint(RegisteredTypeConstraint source) { + if (source==null) return; + + this.kind = source.getKind(); + this.javaSuperType = source.getJavaSuperType(); + this.encounteredTypes = source.getEncounteredTypes(); + } + + @Override + public RegisteredTypeKind getKind() { + return kind; + } + + @Override + public Class<?> getJavaSuperType() { + if (javaSuperType==null) return Object.class; + return javaSuperType; + } + + @Override + public Set<String> getEncounteredTypes() { + if (encounteredTypes==null) return ImmutableSet.of(); + return ImmutableSet.<String>copyOf(encounteredTypes); + } + + @Override + public String toString() { + return super.toString()+"["+kind+","+javaSuperType+","+encounteredTypes+"]"; + } + } + + /** returns a constraint which allows anything */ + public static RegisteredTypeConstraint any() { + return new BasicRegisteredTypeConstraint(); + } + + public static RegisteredTypeConstraint alreadyVisited(Set<String> encounteredTypeSymbolicNames) { + BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint(); + result.encounteredTypes = encounteredTypeSymbolicNames; + return result; + } + public static RegisteredTypeConstraint alreadyVisited(Set<String> encounteredTypeSymbolicNames, String anotherEncounteredType) { + BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint(); + result.encounteredTypes = MutableSet.copyOf(encounteredTypeSymbolicNames); + if (anotherEncounteredType!=null) result.encounteredTypes.add(anotherEncounteredType); + return result; + } + + private static RegisteredTypeConstraint of(RegisteredTypeKind kind, Class<? extends BrooklynObject> javaSuperType) { + BasicRegisteredTypeConstraint result = new BasicRegisteredTypeConstraint(); + result.kind = kind; + result.javaSuperType = javaSuperType; + return result; + } + + public static RegisteredTypeConstraint spec(Class<? extends BrooklynObject> javaSuperType) { + return of(RegisteredTypeKind.SPEC, javaSuperType); + } + + public static <T extends AbstractBrooklynObjectSpec<?,?>> RegisteredTypeConstraint extendedWithSpecSuperType(RegisteredTypeConstraint source, Class<T> specSuperType) { + Class<?> superType = lookupTargetTypeForSpec(specSuperType); + BasicRegisteredTypeConstraint constraint = new BasicRegisteredTypeConstraint(source); + if (source==null) source = constraint; + if (source.getJavaSuperType()==null || source.getJavaSuperType().isAssignableFrom( superType )) { + // the constraint was weaker than present; return the new constraint + return constraint; + } + if (superType.isAssignableFrom( source.getJavaSuperType() )) { + // the constraint was already for something more specific; ignore what we've inferred here + return source; + } + // trickier situation; the constraint had a type not compatible with the spec type; log a warning and leave alone + // (e.g. caller specified some java super type which is not a super or sub of the spec target type; + // this may be because the caller specified a Spec as the type supertype, which is wrong; + // or they may have specified an interface along a different hierarchy, which we discouraged + // as it will make filtering/indexing more complex) + log.warn("Ambiguous spec supertypes ("+specSuperType+" for target "+source.getJavaSuperType()+"); " + + "it is recommended that any registered type constraint for a spec be compatible with the spec type"); + return source; + } + + /** given a spec, returns the class of the item it targets, for instance {@link EntitySpec} for {@link Entity} */ + private static <T extends AbstractBrooklynObjectSpec<?,?>> Class<? extends BrooklynObject> lookupTargetTypeForSpec(Class<T> specSuperType) { + if (specSuperType==null) return BrooklynObject.class; + BrooklynObjectType best = null; + + for (BrooklynObjectType t: BrooklynObjectType.values()) { + if (t.getSpecType()==null) continue; + if (!t.getSpecType().isAssignableFrom(specSuperType)) continue; + // on equality, exit immediately + if (t.getSpecType().equals(specSuperType)) return t.getInterfaceType(); + // else pick which is best + if (best==null) { best = t; continue; } + // if t is more specific, it is better (handles case when e.g. a Policy is a subclass of Entity) + if (best.getSpecType().isAssignableFrom(t.getSpecType())) { best = t; continue; } + } + if (best==null) { + log.warn("Unexpected spec supertype ("+specSuperType+"); treating as any "+BrooklynObject.class, new Throwable("Trace for unexpected spec supertype")); + return BrooklynObject.class; + } + // the spec is more specific, but we're not familiar with it here; return the best + return best.getInterfaceType(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java index 7c719f2..271add5 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicates.java @@ -20,6 +20,7 @@ package org.apache.brooklyn.core.typereg; import javax.annotation.Nullable; +import org.apache.brooklyn.api.catalog.BrooklynCatalog; import org.apache.brooklyn.api.entity.Application; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.location.Location; @@ -34,37 +35,37 @@ import com.google.common.base.Predicates; public class RegisteredTypePredicates { -// public static Predicate<RegisteredType> deprecated(final boolean deprecated) { -// return new DeprecatedEqualTo(deprecated); -// } -// -// private static class DeprecatedEqualTo implements Predicate<RegisteredType> { -// private final boolean deprecated; -// -// public DeprecatedEqualTo(boolean deprecated) { -// this.deprecated = deprecated; -// } -// @Override -// public boolean apply(@Nullable RegisteredType item) { -// return (item != null) && item.isDeprecated() == deprecated; -// } -// } -// -// public static Predicate<RegisteredType> disabled(boolean disabled) { -// return new DisabledEqualTo(disabled); -// } -// -// private static class DisabledEqualTo implements Predicate<RegisteredType> { -// private final boolean disabled; -// -// public DisabledEqualTo(boolean disabled) { -// this.disabled = disabled; -// } -// @Override -// public boolean apply(@Nullable RegisteredType item) { -// return (item != null) && item.isDisabled() == disabled; -// } -// } + public static Predicate<RegisteredType> deprecated(final boolean deprecated) { + return new DeprecatedEqualTo(deprecated); + } + + private static class DeprecatedEqualTo implements Predicate<RegisteredType> { + private final boolean deprecated; + + public DeprecatedEqualTo(boolean deprecated) { + this.deprecated = deprecated; + } + @Override + public boolean apply(@Nullable RegisteredType item) { + return (item != null) && item.isDeprecated() == deprecated; + } + } + + public static Predicate<RegisteredType> disabled(boolean disabled) { + return new DisabledEqualTo(disabled); + } + + private static class DisabledEqualTo implements Predicate<RegisteredType> { + private final boolean disabled; + + public DisabledEqualTo(boolean disabled) { + this.disabled = disabled; + } + @Override + public boolean apply(@Nullable RegisteredType item) { + return (item != null) && item.isDisabled() == disabled; + } + } @SuppressWarnings("unused") private static final Function<RegisteredType,String> ID_OF_ITEM_TRANSFORMER_ANONYMOUS = new Function<RegisteredType, String>() { @@ -140,6 +141,10 @@ public class RegisteredTypePredicates { } public static final Predicate<RegisteredType> IS_APPLICATION = javaTypeAssignableFrom(Application.class); + // TODO do we need this? introduced already deprecated in 0.9.0 so can be removed, or enabled + @Deprecated + public static final Predicate<RegisteredType> IS_TEMPLATE = IS_APPLICATION; + public static final Predicate<RegisteredType> IS_ENTITY = javaTypeAssignableFrom(Entity.class); public static final Predicate<RegisteredType> IS_LOCATION = javaTypeAssignableFrom(Location.class); public static final Predicate<RegisteredType> IS_POLICY = javaTypeAssignableFrom(Policy.class); @@ -161,20 +166,26 @@ public class RegisteredTypePredicates { } } -// public static Predicate<RegisteredType> isBestVersion(final ManagementContext mgmt) { -// return new IsBestVersion(mgmt); -// } -// -// private static class IsBestVersion implements Predicate<RegisteredType> { -// private final ManagementContext mgmt; -// -// public IsBestVersion(ManagementContext mgmt) { -// this.mgmt = mgmt; -// } -// @Override -// public boolean apply(@Nullable RegisteredType item) { -// return CatalogUtils.isBestVersion(mgmt, item); -// } -// } - + public static Predicate<RegisteredType> isBestVersion(final ManagementContext mgmt) { + return new IsBestVersion(mgmt); + } + + private static class IsBestVersion implements Predicate<RegisteredType> { + private final ManagementContext mgmt; + + public IsBestVersion(ManagementContext mgmt) { + this.mgmt = mgmt; + } + @Override + public boolean apply(@Nullable RegisteredType item) { + return isBestVersion(mgmt, item); + } + } + + public static boolean isBestVersion(ManagementContext mgmt, RegisteredType item) { + RegisteredType bestVersion = mgmt.getTypeRegistry().get(item.getSymbolicName(), BrooklynCatalog.DEFAULT_VERSION); + if (bestVersion==null) return false; + return (bestVersion.getVersion().equals(item.getVersion())); + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java index 0668d0a..6013f6d 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/RegisteredTypes.java @@ -21,15 +21,56 @@ package org.apache.brooklyn.core.typereg; import java.util.Collection; import java.util.List; +import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind; import org.apache.brooklyn.core.plan.PlanToSpecTransformer; +import org.apache.brooklyn.util.collections.MutableList; +import org.apache.brooklyn.util.javalang.JavaClassNames; import com.google.common.annotations.Beta; +import com.google.common.base.Function; public class RegisteredTypes { + /** @deprecated since it was introduced in 0.9.0; for backwards compatibility only, may be removed at any point */ + @Deprecated + static final Function<CatalogItem<?,?>,RegisteredType> CI_TO_RT = new Function<CatalogItem<?,?>, RegisteredType>() { + @Override + public RegisteredType apply(CatalogItem<?, ?> item) { + return of(item); + } + }; + + /** @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; + TypeImplementation impl = null; + if (item.getPlanYaml()!=null) { + impl = new TypeImplementation(null, item.getPlanYaml()); + } else if (item.getJavaType()!=null) { + impl = new JavaTypeImplementation(item.getJavaType()); + } else { + throw new IllegalStateException("Unsupported catalog item "+item+" when trying to create RegisteredType"); + } + + RegisteredSpecType type = new RegisteredSpecType(item.getSymbolicName(), item.getVersion(), + item.getCatalogItemJavaType(), impl); + type.bundles = MutableList.<OsgiBundleWithUrl>copyOf(item.getLibraries()); + type.displayName = item.getDisplayName(); + type.description = item.getDescription(); + type.iconUrl = item.getIconUrl(); + type.disabled = item.isDisabled(); + type.deprecated = item.isDeprecated(); + + // TODO + // javaType, specType, registeredTypeName ... + // tags ? + return type; + } + /** Visitor adapter which can be used to ensure all kinds are supported */ public static abstract class RegisteredTypeKindVisitor<T> { public T visit(RegisteredType type) { @@ -60,6 +101,8 @@ public class RegisteredTypes { String displayName; String description; String iconUrl; + boolean deprecated; + boolean disabled; // TODO ensure this is re-populated on rebind transient Class<?> javaType; @@ -106,9 +149,27 @@ public class RegisteredTypes { } @Override + public boolean isDisabled() { + return disabled; + } + + @Override + public boolean isDeprecated() { + return deprecated; + } + + @Override public Class<?> getJavaType() { return javaType; } + + @Override + public String toString() { + return JavaClassNames.simpleClassName(this)+"["+getId()+ + (isDisabled() ? ";DISABLED" : "")+ + (isDeprecated() ? ";deprecated" : "")+ + "]"; + } } // TODO @@ -131,12 +192,12 @@ public class RegisteredTypes { } public static class TypeImplementation { - final String kind; + final String format; final Object data; public TypeImplementation(String kind, Object data) { super(); - this.kind = kind; + this.format = kind; this.data = data; } @@ -145,8 +206,8 @@ public class RegisteredTypes { * but in general we should look to determine the kind as early as possible and use that * to retrieve the appropriate such transformer. */ - public String getKind() { - return kind; + public String getFormat() { + return format; } public Object getData() { @@ -155,18 +216,18 @@ public class RegisteredTypes { } public static class JavaTypeImplementation extends TypeImplementation { - public static final String KIND = "java"; + public static final String FORMAT = "java"; public JavaTypeImplementation(String javaType) { - super(KIND, javaType); + super(FORMAT, javaType); } public String getJavaType() { return (String)getData(); } } // // TODO remove, unless we want it // public static class CampYamlTypeImplementation extends TypeImplementation { -// public static final String KIND = "camp"; +// public static final String FORMAT = "camp"; // public CampYamlTypeImplementation(String javaType) { -// super(KIND, javaType); +// super(FORMAT, javaType); // } // public String getCampYaml() { return (String)getData(); } // } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java deleted file mode 100644 index a448418..0000000 --- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/CatalogTestUtils.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.core.catalog.internal; - -import org.apache.brooklyn.api.catalog.CatalogItem; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.catalog.internal.CatalogUtils; -import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext; - -import com.google.common.annotations.Beta; - -public class CatalogTestUtils { - - /** creates entity spec with the java type of a catalog item; - * would be nice to have this in {@link CatalogUtils}, - * but the logic for parsing the yaml is buried in camp code, - * so it's a little bit hard to make this a first class method. - * <p> - * (this impl ignores many things, including config and location.) - */ - @Beta - public static EntitySpec<?> createEssentialEntitySpec(ManagementContext mgmt, CatalogItem<?, ?> catalogItem) { - BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, catalogItem); - @SuppressWarnings({ "unchecked", "rawtypes" }) - EntitySpec<?> spec = EntitySpec.create( (Class)loader.loadClass(catalogItem.getJavaType()) ); - spec.catalogItemId(catalogItem.getId()); - return spec; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java index b434aa1..118ca39 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java @@ -18,34 +18,24 @@ */ package org.apache.brooklyn.core.mgmt.osgi; -import org.apache.brooklyn.util.osgi.OsgiTestResources; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.List; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleException; -import org.osgi.framework.launch.Framework; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; -import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.objs.BrooklynObject; import org.apache.brooklyn.api.policy.PolicySpec; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.catalog.internal.CatalogEntityItemDto; import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder; import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract; -import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; import org.apache.brooklyn.core.effector.Effectors; import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; import org.apache.brooklyn.core.objs.proxy.InternalEntityFactory; @@ -53,14 +43,23 @@ import org.apache.brooklyn.core.objs.proxy.InternalPolicyFactory; import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; import org.apache.brooklyn.core.test.entity.TestApplication; import org.apache.brooklyn.test.support.TestResourceUnavailableException; +import org.apache.brooklyn.util.collections.MutableList; +import org.apache.brooklyn.util.core.osgi.OsgiTestBase; import org.apache.brooklyn.util.core.osgi.Osgis; import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.os.Os; +import org.apache.brooklyn.util.osgi.OsgiTestResources; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleException; +import org.osgi.framework.launch.Framework; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; -import org.apache.brooklyn.util.core.osgi.OsgiTestBase; /** @@ -135,18 +134,18 @@ public class OsgiVersionMoreEntityTest { } } - protected CatalogItem<?, ?> addCatalogItemWithTypeAsName(String type, String version, String ...libraries) { + protected RegisteredType addCatalogItemWithTypeAsName(String type, String version, String ...libraries) { return addCatalogItemWithNameAndType(type, version, type, libraries); } - protected CatalogItem<?, ?> addCatalogItemWithNameAndType(String symName, String version, String type, String ...libraries) { + protected RegisteredType addCatalogItemWithNameAndType(String symName, String version, String type, String ...libraries) { return addCatalogItemWithNameAndType(mgmt, symName, version, type, libraries); } @SuppressWarnings("deprecation") - static CatalogItem<?, ?> addCatalogItemWithNameAndType(ManagementContext mgmt, String symName, String version, String type, String ...libraries) { + static RegisteredType addCatalogItemWithNameAndType(ManagementContext mgmt, String symName, String version, String type, String ...libraries) { CatalogEntityItemDto c1 = newCatalogItemWithNameAndType(symName, version, type, libraries); mgmt.getCatalog().addItem(c1); - CatalogItem<?, ?> c2 = mgmt.getCatalog().getCatalogItem(symName, version); + RegisteredType c2 = mgmt.getTypeRegistry().get(symName, version); Preconditions.checkNotNull(c2, "Item "+type+":"+version+" was not found after adding it"); return c2; } @@ -163,12 +162,13 @@ public class OsgiVersionMoreEntityTest { return c1; } - protected Entity addItemFromCatalog(CatalogItem<?, ?> c2) { + protected Entity addItemFromCatalog(RegisteredType c2) { return addItemFromCatalog(mgmt, app, c2); } - public static Entity addItemFromCatalog(ManagementContext mgmt, TestApplication parent, CatalogItem<?, ?> c2) { - return parent.createAndManageChild( CatalogTestUtils.createEssentialEntitySpec(mgmt, c2) ); + @SuppressWarnings("unchecked") + public static Entity addItemFromCatalog(ManagementContext mgmt, TestApplication parent, RegisteredType c2) { + return parent.createAndManageChild( mgmt.getTypeRegistry().createSpec(c2, null, EntitySpec.class) ); } public static void assertV1MethodCall(Entity me) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { @@ -199,7 +199,7 @@ public class OsgiVersionMoreEntityTest { return me.invoke(Effectors.effector(String.class, "sayHI").buildAbstract(), ImmutableMap.of("name", "brooklyn")).getUnchecked(); } - public static CatalogItem<?, ?> addMoreEntityV1(ManagementContext mgmt, String versionToRegister) { + public static RegisteredType addMoreEntityV1(ManagementContext mgmt, String versionToRegister) { TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class, BROOKLYN_TEST_MORE_ENTITIES_V1_PATH); return addCatalogItemWithNameAndType(mgmt, OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, @@ -207,7 +207,7 @@ public class OsgiVersionMoreEntityTest { OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, BROOKLYN_TEST_MORE_ENTITIES_V1_URL); } - public static CatalogItem<?, ?> addMoreEntityV2(ManagementContext mgmt, String versionToRegister) { + public static RegisteredType addMoreEntityV2(ManagementContext mgmt, String versionToRegister) { TestResourceUnavailableException.throwIfResourceUnavailable(OsgiVersionMoreEntityTest.class, BROOKLYN_TEST_MORE_ENTITIES_V1_PATH); return addCatalogItemWithNameAndType(mgmt, OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, @@ -221,7 +221,7 @@ public class OsgiVersionMoreEntityTest { public void testMoreEntitiesV1() throws Exception { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V1_PATH); - CatalogItem<?, ?> c2 = addMoreEntityV1(mgmt, TEST_VERSION); + RegisteredType c2 = addMoreEntityV1(mgmt, TEST_VERSION); // test load and instantiate Entity me = addItemFromCatalog(c2); @@ -231,18 +231,13 @@ public class OsgiVersionMoreEntityTest { assertV1EffectorCall(me); // test adding a child gets the right type; this time by entity parent hierarchy - BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, c2); - @SuppressWarnings({ "unchecked", "rawtypes" }) - Entity me2 = me.addChild(EntitySpec.create( (Class)loader.loadClass(c2.getJavaType()) )); + @SuppressWarnings({ "unchecked" }) + Entity me2 = me.addChild( mgmt.getTypeRegistry().createSpec(c2, null, EntitySpec.class) ); Assert.assertEquals(me2.getCatalogItemId(), CatalogUtils.getVersionedId(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION)); } - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected PolicySpec<?> getPolicySpec(CatalogItem<?, ?> cp) { - BrooklynClassLoadingContext loader = CatalogUtils.newClassLoadingContext(mgmt, cp); - PolicySpec spec = PolicySpec.create( (Class)loader.loadClass(cp.getJavaType()) ); - spec.catalogItemId(cp.getId()); - return spec; + protected PolicySpec<?> getPolicySpec(RegisteredType cp) { + return mgmt.getTypeRegistry().createSpec(cp, null, PolicySpec.class); } @Test @@ -250,7 +245,7 @@ public class OsgiVersionMoreEntityTest { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V1_PATH); TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_OSGI_ENTITIES_PATH); - CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName( + RegisteredType c2 = addCatalogItemWithTypeAsName( OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION, BROOKLYN_TEST_MORE_ENTITIES_V1_URL); @@ -258,13 +253,13 @@ public class OsgiVersionMoreEntityTest { // test load and instantiate Entity me = addItemFromCatalog(c2); - CatalogItem<?, ?> cp = addCatalogItemWithTypeAsName( + RegisteredType cp = addCatalogItemWithTypeAsName( OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_SIMPLE_POLICY, TEST_VERSION, BROOKLYN_TEST_OSGI_ENTITIES_URL); me.policies().add(getPolicySpec(cp)); - Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of policies: "+me.getPolicies()); + Assert.assertEquals(me.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(me.policies())); String catalogItemId = Iterables.getOnlyElement( me.policies() ).getCatalogItemId(); Assert.assertNotNull(catalogItemId); @@ -277,7 +272,7 @@ public class OsgiVersionMoreEntityTest { public void testMoreEntitiesV2FailsWithoutBasicTestOsgiEntitiesBundle() throws Exception { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V2_PATH); - CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName( + RegisteredType c2 = addCatalogItemWithTypeAsName( OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION, BROOKLYN_TEST_MORE_ENTITIES_V2_URL); @@ -299,7 +294,7 @@ public class OsgiVersionMoreEntityTest { public void testMoreEntitiesV2() throws Exception { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_MORE_ENTITIES_V2_PATH); - CatalogItem<?, ?> c2 = addCatalogItemWithTypeAsName( + RegisteredType c2 = addCatalogItemWithTypeAsName( OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION, BROOKLYN_TEST_MORE_ENTITIES_V2_URL, @@ -311,7 +306,7 @@ public class OsgiVersionMoreEntityTest { assertV2MethodCall(me); assertV2EffectorCall(me); - Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of policies: "+me.getPolicies()); + Assert.assertEquals(me.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(me.policies())); String catalogItemId = Iterables.getOnlyElement( me.policies() ).getCatalogItemId(); Assert.assertNotNull(catalogItemId); @@ -334,11 +329,11 @@ public class OsgiVersionMoreEntityTest { BROOKLYN_TEST_MORE_ENTITIES_V2_URL, BROOKLYN_TEST_OSGI_ENTITIES_URL); // test load and instantiate - Entity me = addItemFromCatalog( mgmt.getCatalog().getCatalogItem(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) ); + Entity me = addItemFromCatalog( mgmt.getTypeRegistry().get(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) ); assertV2MethodCall(me); assertV2EffectorCall(me); - Assert.assertEquals(me.getPolicies().size(), 1, "Wrong number of policies: "+me.getPolicies()); + Assert.assertEquals(me.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(me.policies())); } @Test @@ -356,7 +351,7 @@ public class OsgiVersionMoreEntityTest { BROOKLYN_TEST_MORE_ENTITIES_V1_URL); // test load and instantiate - Entity me = addItemFromCatalog( mgmt.getCatalog().getCatalogItem(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) ); + Entity me = addItemFromCatalog( mgmt.getTypeRegistry().get(OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY, TEST_VERSION) ); /* * WARNING - Weird maven-bundle-plugin and OSGi behaviour. Some caveats: * <p> @@ -383,7 +378,7 @@ public class OsgiVersionMoreEntityTest { */ assertV1MethodCall(me); assertV1EffectorCall(me); - Assert.assertEquals(me.getPolicies().size(), 0, "Wrong number of policies: "+me.getPolicies()); + Assert.assertEquals(me.policies().size(), 0, "Wrong number of policies: "+MutableList.copyOf(me.policies())); } @Test @@ -438,20 +433,20 @@ public class OsgiVersionMoreEntityTest { // test entity resolution - Entity v2 = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v2", TEST_VERSION) ); + Entity v2 = addItemFromCatalog( mgmt.getTypeRegistry().get("v2", TEST_VERSION) ); assertV2MethodCall(v2); assertV2EffectorCall(v2); - Assert.assertEquals(v2.getPolicies().size(), 1, "Wrong number of policies: "+v2.getPolicies()); + Assert.assertEquals(v2.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(v2.policies())); - Entity v2_evil = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v2-evil", TEST_VERSION) ); + Entity v2_evil = addItemFromCatalog( mgmt.getTypeRegistry().get("v2-evil", TEST_VERSION) ); assertV2EvilTwinMethodCall(v2_evil); assertV2EvilTwinEffectorCall(v2_evil); - Assert.assertEquals(v2_evil.getPolicies().size(), 1, "Wrong number of policies: "+v2_evil.getPolicies()); + Assert.assertEquals(v2_evil.policies().size(), 1, "Wrong number of policies: "+MutableList.copyOf(v2_evil.policies())); - Entity v1 = addItemFromCatalog( mgmt.getCatalog().getCatalogItem("v1", TEST_VERSION) ); + Entity v1 = addItemFromCatalog( mgmt.getTypeRegistry().get("v1", TEST_VERSION) ); assertV1MethodCall(v1); assertV1EffectorCall(v1); - Assert.assertEquals(v1.getPolicies().size(), 0, "Wrong number of policies: "+v1.getPolicies()); + Assert.assertEquals(v1.policies().size(), 0, "Wrong number of policies: "+MutableList.copyOf(v1.policies())); } // TODO versioning (WIP until #92), install both V1 and V2 with version number, and test that both work http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java index 6bd850a..662e78d 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java @@ -43,9 +43,9 @@ import org.apache.brooklyn.api.objs.BrooklynObjectType; import org.apache.brooklyn.api.policy.Policy; import org.apache.brooklyn.api.sensor.Enricher; import org.apache.brooklyn.api.sensor.Feed; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder; import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract; -import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.location.SimulatedLocation; import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest; @@ -304,11 +304,11 @@ public class XmlMementoSerializerTest { TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiTestResources.BROOKLYN_TEST_MORE_ENTITIES_V1_PATH); ManagementContext mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); try { - CatalogItem<?, ?> ci = OsgiVersionMoreEntityTest.addMoreEntityV1(mgmt, "1.0"); + RegisteredType ci = OsgiVersionMoreEntityTest.addMoreEntityV1(mgmt, "1.0"); EntitySpec<DynamicCluster> spec = EntitySpec.create(DynamicCluster.class) .configure(DynamicCluster.INITIAL_SIZE, 1) - .configure(DynamicCluster.MEMBER_SPEC, CatalogTestUtils.createEssentialEntitySpec(mgmt, ci)); + .configure(DynamicCluster.MEMBER_SPEC, mgmt.getTypeRegistry().createSpec(ci, null, EntitySpec.class)); serializer.setLookupContext(new LookupContextImpl(mgmt, ImmutableList.<Entity>of(), ImmutableList.<Location>of(), ImmutableList.<Policy>of(), http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java index f420b43..7781b9b 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/ActivePartialRebindVersionTest.java @@ -18,20 +18,18 @@ */ package org.apache.brooklyn.core.mgmt.rebind; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.Test; -import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.core.catalog.internal.CatalogTestUtils; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest; -import org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl; import org.apache.brooklyn.core.mgmt.rebind.transformer.CompoundTransformer; import org.apache.brooklyn.entity.group.DynamicCluster; import org.apache.brooklyn.util.collections.MutableList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.Assert; +import org.testng.annotations.Test; public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { @@ -54,13 +52,13 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { @Test public void testSwitchingVersions() throws Exception { - CatalogItem<?, ?> catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0"); + RegisteredType catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0"); Entity childV1 = OsgiVersionMoreEntityTest.addItemFromCatalog(origManagementContext, origApp, catV1); OsgiVersionMoreEntityTest.assertV1EffectorCall(childV1); // simply adding to catalog doesn't change - CatalogItem<?, ?> catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1"); + RegisteredType catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1"); OsgiVersionMoreEntityTest.assertV1EffectorCall(childV1); Entity child2V2 = OsgiVersionMoreEntityTest.addItemFromCatalog(origManagementContext, origApp, catV2); OsgiVersionMoreEntityTest.assertV2EffectorCall(child2V2); @@ -83,8 +81,8 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { @Test public void testSwitchingVersionsInCluster() throws Exception { - CatalogItem<?, ?> catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0"); - CatalogItem<?, ?> catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1"); + RegisteredType catV1 = OsgiVersionMoreEntityTest.addMoreEntityV1(origManagementContext, "1.0"); + RegisteredType catV2 = OsgiVersionMoreEntityTest.addMoreEntityV2(origManagementContext, "1.1"); // could do a yaml test in a downstream project (no camp available here) // CreationResult<List<Entity>, List<String>> clusterR = EntityManagementUtils.addChildren(origApp, @@ -94,7 +92,7 @@ public class ActivePartialRebindVersionTest extends RebindTestFixtureWithApp { // + " entitySpec: { type: "+catV1.getId()+" }\n", true); DynamicCluster cluster = origApp.createAndManageChild(EntitySpec.create(DynamicCluster.class) .configure(DynamicCluster.INITIAL_SIZE, 1) - .configure(DynamicCluster.MEMBER_SPEC, CatalogTestUtils.createEssentialEntitySpec(origManagementContext, catV1)) + .configure(DynamicCluster.MEMBER_SPEC, origManagementContext.getTypeRegistry().createSpec(catV1, null, EntitySpec.class)) ); cluster.start(MutableList.of(origApp.newSimulatedLocation())); Entity childV1 = MutableList.copyOf(cluster.getChildren()).get(1); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java index 2bea3a2..e336a4f 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java @@ -29,6 +29,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.core.BrooklynFeatureEnablement; import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; import org.apache.brooklyn.core.catalog.internal.CatalogDto; @@ -44,6 +45,7 @@ import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.location.localhost.LocalhostMachineProvisioningLocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -262,14 +264,14 @@ public class RebindCatalogItemTest extends RebindTestFixtureWithApp { item.setDeprecated(true); catalog.persist(item); rebindAndAssertCatalogsAreEqual(); - CatalogItem<?, ?> catalogItemAfterRebind = newManagementContext.getCatalog().getCatalogItem("rebind-yaml-catalog-item-test", TEST_VERSION); + RegisteredType catalogItemAfterRebind = newManagementContext.getTypeRegistry().get("rebind-yaml-catalog-item-test", TEST_VERSION); assertTrue(catalogItemAfterRebind.isDeprecated(), "Expected item to be deprecated"); } protected void deleteItem(ManagementContext mgmt, String symbolicName, String version) { mgmt.getCatalog().deleteCatalogItem(symbolicName, version); LOG.info("Deleted item from catalog: {}:{}", symbolicName, version); - assertCatalogDoesNotContain(mgmt.getCatalog(), symbolicName, version); + Assert.assertNull( mgmt.getTypeRegistry().get(symbolicName, version) ); } private void rebindAndAssertCatalogsAreEqual() { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java index 921ea9e..0135229 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestFixture.java @@ -317,14 +317,14 @@ public abstract class RebindTestFixture<T extends StartableApplication> { assertEquals(actual.getLibraries(), expected.getLibraries()); } - protected void assertCatalogContains(BrooklynCatalog catalog, CatalogItem<?, ?> item) { - CatalogItem<?, ?> found = catalog.getCatalogItem(item.getSymbolicName(), item.getVersion()); - assertNotNull(found); - assertCatalogItemsEqual(found, item); - } - - protected void assertCatalogDoesNotContain(BrooklynCatalog catalog, String symbolicName, String version) { - CatalogItem<?, ?> found = catalog.getCatalogItem(symbolicName, version); - assertNull(found); - } +// protected void assertCatalogContains(BrooklynCatalog catalog, CatalogItem<?, ?> item) { +// CatalogItem<?, ?> found = catalog.getCatalogItem(item.getSymbolicName(), item.getVersion()); +// assertNotNull(found); +// assertCatalogItemsEqual(found, item); +// } +// +// protected void assertCatalogDoesNotContain(BrooklynCatalog catalog, String symbolicName, String version) { +// CatalogItem<?, ?> found = catalog.getCatalogItem(symbolicName, version); +// assertNull(found); +// } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java b/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java new file mode 100644 index 0000000..145c056 --- /dev/null +++ b/core/src/test/java/org/apache/brooklyn/core/typereg/RegisteredTypePredicatesTest.java @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.brooklyn.core.typereg; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import org.apache.brooklyn.api.catalog.CatalogItem; +import org.apache.brooklyn.api.typereg.RegisteredType; +import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder; +import org.apache.brooklyn.core.entity.Entities; +import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; +import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.google.common.base.Predicates; + + +public class RegisteredTypePredicatesTest { + private LocalManagementContext mgmt; + + @BeforeMethod(alwaysRun = true) + public void setUp() throws Exception { + mgmt = LocalManagementContextForTests.newInstance(); + } + + @AfterMethod(alwaysRun = true) + public void tearDown() throws Exception { + if (mgmt != null) Entities.destroyAll(mgmt); + } + + @Test + public void testDisplayName() { + RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .displayName("myname") + .build()); + + assertTrue(RegisteredTypePredicates.displayName(Predicates.equalTo("myname")).apply(item)); + assertFalse(RegisteredTypePredicates.displayName(Predicates.equalTo("wrongname")).apply(item)); + } + + @Test + public void testDeprecated() { + RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + + assertTrue(RegisteredTypePredicates.deprecated(false).apply(item)); + assertFalse(RegisteredTypePredicates.deprecated(true).apply(item)); + + item = deprecateItem(item); + + assertFalse(RegisteredTypePredicates.deprecated(false).apply(item)); + assertTrue(RegisteredTypePredicates.deprecated(true).apply(item)); + } + + @Test + public void testDisabled() { + RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + + assertTrue(RegisteredTypePredicates.disabled(false).apply(item)); + assertFalse(RegisteredTypePredicates.disabled(true).apply(item)); + + item = disableItem(item); + + assertFalse(RegisteredTypePredicates.disabled(false).apply(item)); + assertTrue(RegisteredTypePredicates.disabled(true).apply(item)); + } + + @Test + public void testIsCatalogItemType() { + RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + + assertTrue(RegisteredTypePredicates.IS_ENTITY.apply(item)); + assertFalse(RegisteredTypePredicates.IS_LOCATION.apply(item)); + } + + @Test + public void testSymbolicName() { + RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + + assertTrue(RegisteredTypePredicates.symbolicName(Predicates.equalTo("foo")).apply(item)); + assertFalse(RegisteredTypePredicates.symbolicName(Predicates.equalTo("wrongname")).apply(item)); + } + + @Test + public void testIsBestVersion() { + RegisteredType itemV1 = createItem(CatalogItemBuilder.newEntity("foo", "1.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + RegisteredType itemV2 = createItem(CatalogItemBuilder.newEntity("foo", "2.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + RegisteredType itemV3Disabled = createItem(CatalogItemBuilder.newEntity("foo", "3.0") + .disabled(true) + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + + assertTrue(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV2)); + assertFalse(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV1)); + assertFalse(RegisteredTypePredicates.isBestVersion(mgmt).apply(itemV3Disabled)); + } + + @Test + public void testEntitledToSee() { + // TODO No entitlements configured, so everything allowed - therefore test not thorough enough! + RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0") + .plan("services:\n- type: org.apache.brooklyn.entity.stock.BasicEntity") + .build()); + + assertTrue(RegisteredTypePredicates.entitledToSee(mgmt).apply(item)); + } + + // TODO do we need this predicate? +// @SuppressWarnings("deprecation") +// @Test +// public void testJavaType() { +// RegisteredType item = createItem(CatalogItemBuilder.newEntity("foo", "1.0") +// .javaType("org.apache.brooklyn.entity.stock.BasicEntity") +// .build()); +// +// assertTrue(RegisteredTypePredicates.javaType(Predicates.equalTo("org.apache.brooklyn.entity.stock.BasicEntity")).apply(item)); +// assertFalse(RegisteredTypePredicates.javaType(Predicates.equalTo("wrongtype")).apply(item)); +// } + + @SuppressWarnings("deprecation") + protected RegisteredType createItem(CatalogItem<?,?> item) { + mgmt.getCatalog().addItem(item); + return RegisteredTypes.of(item); + } + + @SuppressWarnings({ "deprecation" }) + protected <T, SpecT> RegisteredType deprecateItem(RegisteredType orig) { + CatalogItem<?,?> item = (CatalogItem<?,?>) mgmt.getCatalog().getCatalogItem(orig.getSymbolicName(), orig.getVersion()); + item.setDeprecated(true); + mgmt.getCatalog().persist(item); + return RegisteredTypes.of(item); + } + + @SuppressWarnings({ "deprecation" }) + protected RegisteredType disableItem(RegisteredType orig) { + CatalogItem<?,?> item = (CatalogItem<?,?>) mgmt.getCatalog().getCatalogItem(orig.getSymbolicName(), orig.getVersion()); + item.setDisabled(true); + mgmt.getCatalog().persist(item); + return RegisteredTypes.of(item); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java index b1044ee..a273c50 100644 --- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java +++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java @@ -145,20 +145,20 @@ public class BrooklynComponentTemplateResolver { return serviceSpecResolver.accepts(type, loader); } - public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> encounteredRegisteredTypeIds) { + public <T extends Entity> EntitySpec<T> resolveSpec(Set<String> encounteredRegisteredTypeSymbolicNames) { if (alreadyBuilt.getAndSet(true)) throw new IllegalStateException("Spec can only be used once: "+this); - EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, encounteredRegisteredTypeIds); + EntitySpec<?> spec = serviceSpecResolver.resolve(type, loader, encounteredRegisteredTypeSymbolicNames); if (spec == null) { // Try to provide some troubleshooting details final String msgDetails; - RegisteredType item = mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:"), null, null); + RegisteredType item = mgmt.getTypeRegistry().get(Strings.removeFromStart(type, "catalog:")); String proto = Urls.getProtocol(type); - if (item != null && encounteredRegisteredTypeIds.contains(item.getSymbolicName())) { + if (item != null && encounteredRegisteredTypeSymbolicNames.contains(item.getSymbolicName())) { msgDetails = "Cycle between catalog items detected, starting from " + type + - ". Other catalog items being resolved up the stack are " + encounteredRegisteredTypeIds + + ". Other catalog items being resolved up the stack are " + encounteredRegisteredTypeSymbolicNames + ". Tried loading it as a Java class instead but failed."; } else if (proto != null) { msgDetails = "The reference " + type + " looks like a URL (running the CAMP Brooklyn assembly-template instantiator) but the protocol " + @@ -170,7 +170,7 @@ public class BrooklynComponentTemplateResolver { throw new IllegalStateException("Unable to create spec for type " + type + ". " + msgDetails); } - populateSpec(spec, encounteredRegisteredTypeIds); + populateSpec(spec, encounteredRegisteredTypeSymbolicNames); @SuppressWarnings("unchecked") EntitySpec<T> typedSpec = (EntitySpec<T>) spec; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java index 181265d..b1d5dce 100644 --- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java +++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java @@ -32,6 +32,7 @@ import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys; import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator.InstantiatorFromKey; +import org.apache.brooklyn.core.typereg.RegisteredTypeConstraints; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.core.config.ConfigBag; @@ -108,9 +109,9 @@ public abstract class BrooklynEntityDecorationResolver<DT> { String policyType = decoLoader.getTypeName().get(); ManagementContext mgmt = instantiator.loader.getManagementContext(); - RegisteredType item = mgmt.getTypeRegistry().get(policyType, BrooklynTypeRegistry.RegisteredTypeKind.SPEC, Policy.class); + RegisteredType item = mgmt.getTypeRegistry().get(policyType, RegisteredTypeConstraints.spec(Policy.class)); PolicySpec<? extends Policy> spec; - if (item!=null) spec = mgmt.getTypeRegistry().createSpec(item, PolicySpec.class); + if (item!=null) spec = mgmt.getTypeRegistry().createSpec(item, null, PolicySpec.class); else spec = PolicySpec.create(decoLoader.getType(Policy.class)); spec.configure( decoLoader.getConfigMap() ); decorations.add(spec); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java index cacd201..35feb65 100644 --- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java +++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampToSpecTransformer.java @@ -87,7 +87,7 @@ public class CampToSpecTransformer implements PlanToSpecTransformer { @SuppressWarnings({ "unchecked", "rawtypes" }) @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 + // 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."); } @@ -99,17 +99,6 @@ public class CampToSpecTransformer implements PlanToSpecTransformer { return (SpecT) CampCatalogUtils.createSpec(mgmt, (CatalogItem)item, encounteredTypes); } - // TODO -// @SuppressWarnings({ "unchecked", "rawtypes" }) -// public <T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createCatalogSpec(RegisteredType type, Set<String> encounteredTypes) { -// if (encounteredTypes.contains(type.getSymbolicName())) { -// throw new IllegalStateException("Already encountered types " + encounteredTypes + " must not contain catalog item being resolver " + type.getSymbolicName()); -// } -// -// // Not really clear what should happen to the top-level attributes, ignored until a good use case appears. -// return (SpecT) CampCatalogUtils.createSpec(mgmt, type, encounteredTypes); -// } - @Override public void injectManagementContext(ManagementContext mgmt) { this.mgmt = mgmt; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java index f3050c5..6390425 100644 --- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java +++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampUtils.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.Set; import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.location.Location; import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.policy.Policy; @@ -40,16 +39,15 @@ import org.apache.brooklyn.camp.spi.pdp.DeploymentPlan; import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker; import org.apache.brooklyn.core.mgmt.classloading.BrooklynClassLoadingContext; -import org.apache.brooklyn.core.objs.BrooklynObjectInternal.ConfigurationSupportInternal; import org.apache.brooklyn.core.resolve.ResolveUtils; import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.stream.Streams; import org.apache.brooklyn.util.yaml.Yamls; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +//TODO-type-registry public class CampUtils { public static List<EntitySpec<?>> createServiceSpecs(String plan, BrooklynClassLoadingContext loader, Set<String> encounteredTypes) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java index f65abb1..f038e0f 100644 --- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java +++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java @@ -18,16 +18,16 @@ */ package org.apache.brooklyn.camp.brooklyn.spi.lookup; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.camp.spi.AbstractResource; import org.apache.brooklyn.camp.spi.PlatformRootSummary; import org.apache.brooklyn.camp.spi.collection.ResolvableLink; -import org.apache.brooklyn.core.catalog.internal.CatalogUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource> extends AbstractBrooklynResourceLookup<T> { @@ -39,7 +39,7 @@ public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource> @Override public T get(String id) { - CatalogItem<?,?> item = getCatalogItem(id); + RegisteredType item = bmc.getTypeRegistry().get(id); if (item==null) { log.warn("Could not find item '"+id+"' in Brooklyn catalog; returning null"); return null; @@ -47,11 +47,7 @@ public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource> return adapt(item); } - private CatalogItem<?, ?> getCatalogItem(String versionedId) { - return CatalogUtils.getCatalogItemOptionalVersion(bmc, versionedId); - } - - public abstract T adapt(CatalogItem<?,?> item); + public abstract T adapt(RegisteredType item); protected ResolvableLink<T> newLink(CatalogItem<? extends Entity,EntitySpec<?>> li) { return newLink(li.getId(), li.getDisplayName()); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java index af0b596..e30d9c6 100644 --- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java +++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java @@ -26,6 +26,7 @@ import org.apache.brooklyn.api.entity.Application; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator; import org.apache.brooklyn.camp.spi.AssemblyTemplate; import org.apache.brooklyn.camp.spi.PlatformRootSummary; @@ -39,7 +40,7 @@ public class AssemblyTemplateBrooklynLookup extends AbstractTemplateBrooklynLook } @Override - public AssemblyTemplate adapt(CatalogItem<?,?> item) { + public AssemblyTemplate adapt(RegisteredType item) { return AssemblyTemplate.builder(). name(item.getDisplayName()). id(item.getId()). http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java index 19f5917..d70129a 100644 --- a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java +++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java @@ -25,6 +25,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.mgmt.ManagementContext; +import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.camp.spi.PlatformComponentTemplate; import org.apache.brooklyn.camp.spi.PlatformRootSummary; import org.apache.brooklyn.camp.spi.collection.ResolvableLink; @@ -37,7 +38,7 @@ public class PlatformComponentTemplateBrooklynLookup extends AbstractTemplateBro } @Override - public PlatformComponentTemplate adapt(CatalogItem<?,?> item) { + public PlatformComponentTemplate adapt(RegisteredType item) { return PlatformComponentTemplate.builder(). name(item.getDisplayName()). id(item.getId()). http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/50ebfafb/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java ---------------------------------------------------------------------- diff --git a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java index 6e9e39c..3d991db 100644 --- a/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java +++ b/usage/camp/src/test/java/org/apache/brooklyn/camp/brooklyn/JavaWebAppsIntegrationTest.java @@ -231,7 +231,7 @@ public class JavaWebAppsIntegrationTest { Entity cluster = brooklynMgmt.getEntityManager().getEntity(clusterComponent.getId()); log.info("pc1 - "+clusterComponent+" - "+cluster); - Assert.assertEquals(cluster.getPolicies().size(), 1); + Assert.assertEquals(cluster.policies().size(), 1); Policy policy = cluster.policies().iterator().next(); Assert.assertNotNull(policy); Assert.assertTrue(policy instanceof AutoScalerPolicy, "policy="+policy);
