Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import org.apache.brooklyn.api.policy.Policy;
import org.apache.brooklyn.api.policy.PolicySpec;
import org.apache.brooklyn.api.typereg.RegisteredType;
import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext;
import org.apache.brooklyn.camp.CampPlatform;
import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
import org.apache.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
Expand All @@ -47,6 +48,7 @@
import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog;
import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
import org.apache.brooklyn.core.objs.BasicSpecParameter;
import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts;
import org.apache.brooklyn.entity.stock.BasicApplicationImpl;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.exceptions.Exceptions;
Expand Down Expand Up @@ -208,7 +210,8 @@ private static PolicySpec<? extends Policy> resolvePolicySpec(
PolicySpec<? extends Policy> spec;
RegisteredType item = loader.getManagementContext().getTypeRegistry().get(versionedId);
if (item != null && !encounteredCatalogTypes.contains(item.getSymbolicName())) {
return loader.getManagementContext().getTypeRegistry().createSpec(item, null, PolicySpec.class);
RegisteredTypeLoadingContext context = RegisteredTypeLoadingContexts.alreadyEncountered(encounteredCatalogTypes);
return loader.getManagementContext().getTypeRegistry().createSpec(item, context, PolicySpec.class);
} else {
// TODO-type-registry pass the loader in to the above, and allow it to load with the loader
spec = PolicySpec.create(loader.loadClass(versionedId, Policy.class));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
import org.apache.brooklyn.core.sensor.DependentConfiguration;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.flags.ClassCoercionException;
import org.apache.brooklyn.util.core.flags.FlagUtils;
Expand Down Expand Up @@ -129,9 +130,10 @@ public static BrooklynDslDeferredSupplier<Sensor<?>> sensor(String sensorName) {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static Sensor<?> sensor(String clazzName, String sensorName) {
try {
// TODO Should use catalog's classloader, rather than Class.forName; how to get that? Should we return a future?!
// TODO Should use catalog's classloader, rather than ClassLoaderUtils; how to get that? Should we return a future?!
// Should have the catalog's loader at this point in a thread local
String mappedClazzName = DeserializingClassRenamesProvider.findMappedName(clazzName);
Class<?> clazz = Class.forName(mappedClazzName);
Class<?> clazz = new ClassLoaderUtils(BrooklynDslCommon.class).loadClass(mappedClazzName);

Sensor<?> sensor;
if (Entity.class.isAssignableFrom(clazz)) {
Expand Down Expand Up @@ -170,9 +172,9 @@ public static Object object(Map<String, Object> arguments) {
Map<String,Object> objectFields = (Map<String, Object>) config.getStringKeyMaybe("object.fields").or(MutableMap.of());
Map<String,Object> brooklynConfig = (Map<String, Object>) config.getStringKeyMaybe(BrooklynCampReservedKeys.BROOKLYN_CONFIG).or(MutableMap.of());
try {
// TODO Should use catalog's classloader, rather than Class.forName; how to get that? Should we return a future?!
// TODO Should use catalog's classloader, rather than ClassLoaderUtils; how to get that? Should we return a future?!
String mappedTypeName = DeserializingClassRenamesProvider.findMappedName(typeName);
Class<?> type = Class.forName(mappedTypeName);
Class<?> type = new ClassLoaderUtils(BrooklynDslCommon.class).loadClass(mappedTypeName);

if (!Reflections.hasNoArgConstructor(type)) {
throw new IllegalStateException(String.format("Cannot construct %s bean: No public no-arg constructor available", type));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -868,6 +868,30 @@ public void testItemWithBrooklynParameters() throws Exception {
mgmt().getCatalog().deleteCatalogItem(id, version);
}

@Test
public void testCreateOsgiSpecFromRegistry() throws Exception {
TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_PATH);

String symbolicName = "my.catalog.app.id.registry.spec";
addCatalogItems(
"brooklyn.catalog:",
" id: " + symbolicName,
" name: My Catalog App",
" description: My description",
" icon_url: classpath://path/to/myicon.jpg",
" version: " + TEST_VERSION,
" libraries:",
" - url: " + OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL,
" item: " + SIMPLE_ENTITY_TYPE);

BrooklynTypeRegistry registry = mgmt().getTypeRegistry();
RegisteredType item = registry.get(symbolicName, TEST_VERSION);
AbstractBrooklynObjectSpec<?, ?> spec = registry.createSpec(item, null, null);
assertEquals(spec.getCatalogItemId(), ver(symbolicName));

deleteCatalogEntity(symbolicName);
}

private void registerAndLaunchAndAssertSimpleEntity(String symbolicName, String serviceType) throws Exception {
addCatalogOSGiEntity(symbolicName, serviceType);
String yaml = "name: simple-app-yaml\n" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,13 @@ public class BrooklynFeatureEnablement {

public static final String FEATURE_VALIDATE_LOCATION_SSH_KEYS = "brooklyn.validate.locationSshKeys";

/**
* Whether to scan newly loaded bundles for catalog.bom and load it.
*
* The functionality loads catalog items regardless of the persistence state so best used with persistence disabled.
*/
public static final String FEATURE_LOAD_BUNDLE_CATALOG_BOM = FEATURE_PROPERTY_PREFIX+".osgi.catalog_bom";

/**
* Values explicitly set by Java calls.
*/
Expand Down Expand Up @@ -146,6 +153,7 @@ static void setDefaults() {
setDefault(FEATURE_AUTO_FIX_CATALOG_REF_ON_REBIND, false);
setDefault(FEATURE_SSH_ASYNC_EXEC, false);
setDefault(FEATURE_VALIDATE_LOCATION_SSH_KEYS, true);
setDefault(FEATURE_LOAD_BUNDLE_CATALOG_BOM, false);
}

static {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.google.common.collect.Iterables;
import org.apache.brooklyn.api.catalog.CatalogItem;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.core.BrooklynFeatureEnablement;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.stream.Streams;
Expand Down Expand Up @@ -60,21 +61,29 @@ public class CatalogBomScanner {
private CatalogPopulator catalogTracker;

public void bind(ServiceReference<ManagementContext> managementContext) throws Exception {
LOG.debug("Binding management context with whiteList [{}] and blacklist [{}]",
Strings.join(getWhiteList(), "; "),
Strings.join(getBlackList(), "; "));
catalogTracker = new CatalogPopulator(managementContext);
if (isEnabled()) {
LOG.debug("Binding management context with whiteList [{}] and blacklist [{}]",
Strings.join(getWhiteList(), "; "),
Strings.join(getBlackList(), "; "));
catalogTracker = new CatalogPopulator(managementContext);
}
}

public void unbind(ServiceReference<ManagementContext> managementContext) throws Exception {
LOG.debug("Unbinding management context");
if (null != catalogTracker) {
CatalogPopulator temp = catalogTracker;
catalogTracker = null;
temp.close();
if (isEnabled()) {
LOG.debug("Unbinding management context");
if (null != catalogTracker) {
CatalogPopulator temp = catalogTracker;
catalogTracker = null;
temp.close();
}
}
}

private boolean isEnabled() {
return BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_LOAD_BUNDLE_CATALOG_BOM);
}

private String[] bundleIds(Bundle bundle) {
return new String[] {
String.valueOf(bundle.getBundleId()), bundle.getSymbolicName(), bundle.getVersion().toString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@

import java.util.Map;

import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.EntityInitializer;
import org.apache.brooklyn.api.entity.EntityLocal;
import org.apache.brooklyn.api.sensor.AttributeSensor;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.entity.EntityInternal;
import org.apache.brooklyn.core.sensor.Sensors;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.guava.Maybe;
import org.apache.brooklyn.util.javalang.Boxing;
Expand Down Expand Up @@ -54,7 +56,7 @@ public class AddSensor<T> implements EntityInitializer {
protected final String name;
protected final Duration period;
protected final String type;
protected final AttributeSensor<T> sensor;
protected AttributeSensor<T> sensor;

public AddSensor(Map<String, String> params) {
this(ConfigBag.newInstance(params));
Expand All @@ -64,27 +66,28 @@ public AddSensor(final ConfigBag params) {
this.name = Preconditions.checkNotNull(params.get(SENSOR_NAME), "Name must be supplied when defining a sensor");
this.period = params.get(SENSOR_PERIOD);
this.type = params.get(SENSOR_TYPE);
this.sensor = newSensor();
}

@Override
public void apply(EntityLocal entity) {
sensor = newSensor(entity);
((EntityInternal) entity).getMutableEntityType().addSensor(sensor);
}

private AttributeSensor<T> newSensor() {
private AttributeSensor<T> newSensor(Entity entity) {
String className = getFullClassName(type);
Class<T> clazz = getType(className);
Class<T> clazz = getType(entity, className);
return Sensors.newSensor(clazz, name);
}

@SuppressWarnings("unchecked")
protected Class<T> getType(String className) {
protected Class<T> getType(Entity entity, String className) {
try {
// TODO use OSGi loader (low priority however); also ensure that allows primitives
Maybe<Class<?>> primitive = Boxing.getPrimitiveType(className);
if (primitive.isPresent()) return (Class<T>) primitive.get();
return (Class<T>) Class.forName(className);

return (Class<T>) new ClassLoaderUtils(this, entity).loadClass(className);
} catch (ClassNotFoundException e) {
if (!className.contains(".")) {
// could be assuming "java.lang" package; try again with that
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@
import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity;
import org.apache.brooklyn.api.entity.drivers.EntityDriver;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.core.BrooklynVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.brooklyn.location.paas.PaasLocation;
import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.exceptions.ReferenceWithError;
import org.apache.brooklyn.util.text.Strings;
Expand Down Expand Up @@ -193,7 +195,8 @@ public <D extends EntityDriver> String inferDriverClassName(DriverDependentEntit
String driverInterfaceName = driverInterface.getName();
// TODO: use a proper registry later on
try {
if (!Class.forName("org.apache.brooklyn.location.winrm.WinRmMachineLocation").isInstance(location)) return null;
Class<?> winRmLocationClass = new ClassLoaderUtils(this, entity).loadClass("org.apache.brooklyn.software-winrm", BrooklynVersion.get(), "org.apache.brooklyn.location.winrm.WinRmMachineLocation");
if (!winRmLocationClass.isInstance(location)) return null;
} catch (ClassNotFoundException ex) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.core.location.AbstractLocation;
import org.apache.brooklyn.core.location.LocationConfigKeys;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.core.flags.TypeCoercions;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.guava.Maybe;
Expand Down Expand Up @@ -164,7 +165,7 @@ private static HostGeoLookup findHostGeoLookupImpl() throws InstantiationExcepti
return new UtraceHostGeoLookup();
}
if (type.isEmpty()) return null;
return (HostGeoLookup) Class.forName(type).newInstance();
return (HostGeoLookup) new ClassLoaderUtils(HostGeoInfo.class).loadClass(type).newInstance();
}

public static HostGeoInfo fromEntity(Entity e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.core.entity.AbstractEntity;
import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.guava.Maybe;
import org.slf4j.Logger;
Expand Down Expand Up @@ -81,9 +82,24 @@ private ClassLoader getClassLoader() {
if (mgmt!=null) return mgmt.getCatalogClassLoader();
return JavaBrooklynClassLoadingContext.class.getClassLoader();
}

@SuppressWarnings({ "rawtypes", "unchecked" })
public Maybe<Class<?>> tryLoadClass(String className) {
Maybe<Class<?>> cls = tryLoadClass0(className);
if (cls.isPresent()) {
return cls;
}
try {
return (Maybe) Maybe.of(new ClassLoaderUtils(this, mgmt).loadClass(className));
} catch (Exception e) {
Exceptions.propagateIfFatal(e);
// return original error
return cls;
}
}

@SuppressWarnings({ "rawtypes", "unchecked" })
private Maybe<Class<?>> tryLoadClass0(String className) {
try {
className = DeserializingClassRenamesProvider.findMappedName(className);
return (Maybe) Maybe.of(getClassLoader().loadClass(className));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import java.util.Arrays;
import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import org.apache.brooklyn.api.entity.Entity;
Expand All @@ -35,8 +34,8 @@
import org.apache.brooklyn.core.config.Sanitizer;
import org.apache.brooklyn.core.internal.BrooklynProperties;
import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
import org.apache.brooklyn.core.mgmt.persist.DeserializingClassRenamesProvider;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.core.task.Tasks;
import org.apache.brooklyn.util.exceptions.Exceptions;
import org.apache.brooklyn.util.javalang.Reflections;
Expand Down Expand Up @@ -455,10 +454,7 @@ public static EntitlementManager load(@Nullable ManagementContext mgmt, Brooklyn
}
if (Strings.isNonBlank(type)) {
try {
ClassLoader cl = mgmt != null
? mgmt.getCatalogClassLoader()
: Entitlements.class.getClassLoader();
Class<?> clazz = cl.loadClass(DeserializingClassRenamesProvider.findMappedName(type));
Class<?> clazz = new ClassLoaderUtils(Entitlements.class, mgmt).loadClass(DeserializingClassRenamesProvider.findMappedName(type));
return (EntitlementManager) instantiate(clazz, ImmutableList.of(
new Object[] {mgmt, brooklynProperties},
new Object[] {mgmt},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
import org.apache.brooklyn.core.typereg.BasicBrooklynTypeRegistry;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.core.ResourceUtils;
import org.apache.brooklyn.util.core.config.ConfigBag;
import org.apache.brooklyn.util.core.task.BasicExecutionContext;
Expand All @@ -99,7 +100,7 @@ private static DataGridFactory loadDataGridFactory(BrooklynProperties properties
Class<?> clazz;
try{
//todo: which classloader should we use?
clazz = LocalManagementContext.class.getClassLoader().loadClass(clazzName);
clazz = new ClassLoaderUtils(AbstractManagementContext.class).loadClass(clazzName);
}catch(ClassNotFoundException e){
throw new IllegalStateException(format("Could not load class [%s]",clazzName),e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.Map.Entry;

import org.apache.brooklyn.core.mgmt.rebind.transformer.CompoundTransformer.Builder;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.core.ResourceUtils;
import org.apache.brooklyn.util.core.text.TemplateProcessor;
import org.apache.brooklyn.util.exceptions.Exceptions;
Expand Down Expand Up @@ -89,7 +90,7 @@ private static void addRule(Builder builder, String name, Map<?,?> args) {
} else if (name.equals("rawDataTransformer")) {
String type = (String) args.get("type");
try {
Class<?> clazz = CompoundTransformerLoader.class.getClassLoader().loadClass(type);
Class<?> clazz = new ClassLoaderUtils(CompoundTransformer.class).loadClass(type);
builder.rawDataTransformer((RawDataTransformer) clazz.newInstance());
} catch (Exception e) {
throw Exceptions.propagate(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.apache.brooklyn.core.enricher.EnricherDynamicType;
import org.apache.brooklyn.core.entity.EntityDynamicType;
import org.apache.brooklyn.core.policy.PolicyDynamicType;
import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.exceptions.Exceptions;

import com.google.common.collect.Maps;
Expand Down Expand Up @@ -110,7 +111,7 @@ public static Map<String, ConfigKey<?>> getDefinedConfigKeys(Class<? extends Bro
@SuppressWarnings("unchecked")
public static Map<String, ConfigKey<?>> getDefinedConfigKeys(String brooklynTypeName) {
try {
return getDefinedConfigKeys((Class<? extends BrooklynObject>) Class.forName(brooklynTypeName));
return getDefinedConfigKeys((Class<? extends BrooklynObject>) new ClassLoaderUtils(BrooklynTypes.class).loadClass(brooklynTypeName));
} catch (ClassNotFoundException e) {
throw Exceptions.propagate(e);
}
Expand All @@ -123,7 +124,7 @@ public static Map<String, Sensor<?>> getDefinedSensors(Class<? extends Entity> e
@SuppressWarnings("unchecked")
public static Map<String, Sensor<?>> getDefinedSensors(String entityTypeName) {
try {
return getDefinedSensors((Class<? extends Entity>) Class.forName(entityTypeName));
return getDefinedSensors((Class<? extends Entity>) new ClassLoaderUtils(BrooklynTypes.class).loadClass(entityTypeName));
} catch (ClassNotFoundException e) {
throw Exceptions.propagate(e);
}
Expand Down
Loading