You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ha...@apache.org on 2015/08/15 15:33:19 UTC
[17/33] incubator-brooklyn git commit: [BROOKLYN-162] Refactor
package in ./core/management
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
deleted file mode 100644
index e8d2cfa..0000000
--- a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
+++ /dev/null
@@ -1,639 +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 brooklyn.management.internal;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.net.URI;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.api.basic.BrooklynObject;
-import org.apache.brooklyn.api.catalog.BrooklynCatalog;
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.entity.Effector;
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.drivers.EntityDriverManager;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager;
-import org.apache.brooklyn.api.entity.rebind.ChangeListener;
-import org.apache.brooklyn.api.entity.rebind.PersistenceExceptionHandler;
-import org.apache.brooklyn.api.entity.rebind.RebindExceptionHandler;
-import org.apache.brooklyn.api.entity.rebind.RebindManager;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationRegistry;
-import org.apache.brooklyn.api.management.AccessController;
-import org.apache.brooklyn.api.management.EntityManager;
-import org.apache.brooklyn.api.management.ExecutionContext;
-import org.apache.brooklyn.api.management.ExecutionManager;
-import org.apache.brooklyn.api.management.LocationManager;
-import org.apache.brooklyn.api.management.SubscriptionContext;
-import org.apache.brooklyn.api.management.Task;
-import org.apache.brooklyn.api.management.entitlement.EntitlementManager;
-import org.apache.brooklyn.api.management.ha.HighAvailabilityManager;
-import org.apache.brooklyn.api.management.ha.HighAvailabilityMode;
-import org.apache.brooklyn.api.management.ha.ManagementNodeState;
-import org.apache.brooklyn.api.management.ha.ManagementPlaneSyncRecord;
-import org.apache.brooklyn.api.management.ha.ManagementPlaneSyncRecordPersister;
-import org.apache.brooklyn.api.mementos.BrooklynMementoPersister;
-import org.apache.brooklyn.api.mementos.BrooklynMementoRawData;
-
-import brooklyn.catalog.internal.CatalogInitialization;
-import brooklyn.config.BrooklynProperties;
-import brooklyn.config.StringConfigMap;
-import brooklyn.entity.basic.AbstractEntity;
-import brooklyn.entity.proxying.InternalEntityFactory;
-import brooklyn.entity.proxying.InternalLocationFactory;
-import brooklyn.entity.proxying.InternalPolicyFactory;
-import brooklyn.internal.storage.BrooklynStorage;
-import brooklyn.management.entitlement.Entitlements;
-import brooklyn.management.ha.OsgiManager;
-import brooklyn.util.guava.Maybe;
-import brooklyn.util.time.Duration;
-
-import com.google.common.base.Objects;
-
-public class NonDeploymentManagementContext implements ManagementContextInternal {
-
- private static final Logger log = LoggerFactory.getLogger(NonDeploymentManagementContext.class);
-
- public enum NonDeploymentManagementContextMode {
- PRE_MANAGEMENT,
- MANAGEMENT_REBINDING,
- MANAGEMENT_STARTING,
- MANAGEMENT_STARTED,
- MANAGEMENT_STOPPING,
- MANAGEMENT_STOPPED;
-
- public boolean isPreManaged() {
- return this == PRE_MANAGEMENT || this == MANAGEMENT_REBINDING;
- }
- }
-
- private final AbstractEntity entity;
- private NonDeploymentManagementContextMode mode;
- private ManagementContextInternal initialManagementContext;
-
- private final QueueingSubscriptionManager qsm;
- private final BasicSubscriptionContext subscriptionContext;
- private NonDeploymentEntityManager entityManager;
- private NonDeploymentLocationManager locationManager;
- private NonDeploymentAccessManager accessManager;
- private NonDeploymentUsageManager usageManager;
- private EntitlementManager entitlementManager;;
-
- public NonDeploymentManagementContext(AbstractEntity entity, NonDeploymentManagementContextMode mode) {
- this.entity = checkNotNull(entity, "entity");
- this.mode = checkNotNull(mode, "mode");
- qsm = new QueueingSubscriptionManager();
- subscriptionContext = new BasicSubscriptionContext(qsm, entity);
- entityManager = new NonDeploymentEntityManager(null);
- locationManager = new NonDeploymentLocationManager(null);
- accessManager = new NonDeploymentAccessManager(null);
- usageManager = new NonDeploymentUsageManager(null);
-
- // TODO might need to be some kind of "system" which can see that the system is running at this point
- // though quite possibly we are entirely behind the auth-wall at this point
- entitlementManager = Entitlements.minimal();
- }
-
- @Override
- public String getManagementPlaneId() {
- return (initialManagementContext == null) ? null : initialManagementContext.getManagementPlaneId();
- }
-
- @Override
- public String getManagementNodeId() {
- return (initialManagementContext == null) ? null : initialManagementContext.getManagementNodeId();
- }
-
- @Override
- public Maybe<URI> getManagementNodeUri() {
- return (initialManagementContext == null) ? Maybe.<URI>absent() : initialManagementContext.getManagementNodeUri();
- }
-
- public void setManagementContext(ManagementContextInternal val) {
- this.initialManagementContext = checkNotNull(val, "initialManagementContext");
- this.entityManager = new NonDeploymentEntityManager(val);
- this.locationManager = new NonDeploymentLocationManager(val);
- this.accessManager = new NonDeploymentAccessManager(val);
- this.usageManager = new NonDeploymentUsageManager(val);
- }
-
- @Override
- public String toString() {
- return Objects.toStringHelper(this).add("entity", entity.getId()).add("mode", mode).toString();
- }
-
- public void setMode(NonDeploymentManagementContextMode mode) {
- this.mode = checkNotNull(mode, "mode");
- }
- public NonDeploymentManagementContextMode getMode() {
- return mode;
- }
-
- @Override
- public Collection<Application> getApplications() {
- return Collections.emptyList();
- }
-
- @Override
- public boolean isRunning() {
- // Assume that the real management context has not been terminated, so always true
- return true;
- }
-
- @Override
- public boolean isStartupComplete() {
- // This mgmt context is only used by items who are not yet fully started.
- // It's slightly misleading as this does not refer to the main mgmt context.
- // OTOH it probably won't be used. TBC. -Alex, Apr 2015
- return false;
- }
-
- @Override
- public InternalEntityFactory getEntityFactory() {
- checkInitialManagementContextReal();
- return initialManagementContext.getEntityFactory();
- }
-
- @Override
- public InternalLocationFactory getLocationFactory() {
- checkInitialManagementContextReal();
- return initialManagementContext.getLocationFactory();
- }
-
- @Override
- public InternalPolicyFactory getPolicyFactory() {
- checkInitialManagementContextReal();
- return initialManagementContext.getPolicyFactory();
- }
-
- @Override
- public EntityManager getEntityManager() {
- return entityManager;
- }
-
- @Override
- public LocationManager getLocationManager() {
- return locationManager;
- }
-
- @Override
- public AccessManager getAccessManager() {
- return accessManager;
- }
-
- @Override
- public UsageManager getUsageManager() {
- return usageManager;
- }
-
- @Override
- public Maybe<OsgiManager> getOsgiManager() {
- return Maybe.absent();
- }
-
- @Override
- public AccessController getAccessController() {
- return getAccessManager().getAccessController();
- }
-
- @Override
- public ExecutionManager getExecutionManager() {
- checkInitialManagementContextReal();
- return initialManagementContext.getExecutionManager();
- }
-
- @Override
- public QueueingSubscriptionManager getSubscriptionManager() {
- return qsm;
- }
-
- @Override
- public synchronized SubscriptionContext getSubscriptionContext(Entity entity) {
- if (!this.entity.equals(entity)) throw new IllegalStateException("Non-deployment context "+this+" can only use a single Entity: has "+this.entity+", but passed "+entity);
- if (mode==NonDeploymentManagementContextMode.MANAGEMENT_STOPPED)
- throw new IllegalStateException("Entity "+entity+" is no longer managed; subscription context not available");
- return subscriptionContext;
- }
-
- @Override
- public ExecutionContext getExecutionContext(Entity entity) {
- if (!this.entity.equals(entity)) throw new IllegalStateException("Non-deployment context "+this+" can only use a single Entity: has "+this.entity+", but passed "+entity);
- if (mode==NonDeploymentManagementContextMode.MANAGEMENT_STOPPED)
- throw new IllegalStateException("Entity "+entity+" is no longer managed; execution context not available");
- checkInitialManagementContextReal();
- return initialManagementContext.getExecutionContext(entity);
- }
-
- @Override
- public ExecutionContext getServerExecutionContext() {
- return initialManagementContext.getServerExecutionContext();
- }
-
- // TODO the methods below should delegate to the application?
- @Override
- public EntityDriverManager getEntityDriverManager() {
- checkInitialManagementContextReal();
- return initialManagementContext.getEntityDriverManager();
- }
-
- @Override
- public DownloadResolverManager getEntityDownloadsManager() {
- checkInitialManagementContextReal();
- return initialManagementContext.getEntityDownloadsManager();
- }
-
- @Override
- public StringConfigMap getConfig() {
- checkInitialManagementContextReal();
- return initialManagementContext.getConfig();
- }
-
- @Override
- public BrooklynProperties getBrooklynProperties() {
- checkInitialManagementContextReal();
- return initialManagementContext.getBrooklynProperties();
- }
-
- @Override
- public BrooklynStorage getStorage() {
- checkInitialManagementContextReal();
- return initialManagementContext.getStorage();
- }
-
- @Override
- public RebindManager getRebindManager() {
- // There was a race where EffectorUtils on invoking an effector calls:
- // mgmtSupport.getEntityChangeListener().onEffectorCompleted(eff);
- // but where the entity/app may be being unmanaged concurrently (e.g. calling app.stop()).
- // So now we allow the change-listener to be called.
-
- if (isInitialManagementContextReal()) {
- return initialManagementContext.getRebindManager();
- } else {
- return new NonDeploymentRebindManager();
- }
- }
-
- @Override
- public HighAvailabilityManager getHighAvailabilityManager() {
- if (isInitialManagementContextReal()) {
- return initialManagementContext.getHighAvailabilityManager();
- } else {
- return new NonDeploymentHighAvailabilityManager();
- }
- }
-
- @Override
- public LocationRegistry getLocationRegistry() {
- checkInitialManagementContextReal();
- return initialManagementContext.getLocationRegistry();
- }
-
- @Override
- public BrooklynCatalog getCatalog() {
- checkInitialManagementContextReal();
- return initialManagementContext.getCatalog();
- }
-
- @Override
- public ClassLoader getCatalogClassLoader() {
- checkInitialManagementContextReal();
- return initialManagementContext.getCatalogClassLoader();
- }
-
- @Override
- public EntitlementManager getEntitlementManager() {
- return entitlementManager;
- }
-
- @Override
- public <T> T invokeEffectorMethodSync(final Entity entity, final Effector<T> eff, final Object args) throws ExecutionException {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot invoke effector "+eff+" on entity "+entity);
- }
-
- @Override
- public <T> Task<T> invokeEffector(final Entity entity, final Effector<T> eff, @SuppressWarnings("rawtypes") final Map parameters) {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot invoke effector "+eff+" on entity "+entity);
- }
-
- @Override
- public ClassLoader getBaseClassLoader() {
- checkInitialManagementContextReal();
- return initialManagementContext.getBaseClassLoader();
- }
-
- @Override
- public Iterable<URL> getBaseClassPathForScanning() {
- checkInitialManagementContextReal();
- return initialManagementContext.getBaseClassPathForScanning();
- }
-
- @Override
- public void addEntitySetListener(CollectionChangeListener<Entity> listener) {
- checkInitialManagementContextReal();
- initialManagementContext.addEntitySetListener(listener);
- }
-
- @Override
- public void removeEntitySetListener(CollectionChangeListener<Entity> listener) {
- checkInitialManagementContextReal();
- initialManagementContext.removeEntitySetListener(listener);
- }
-
- @Override
- public void terminate() {
- if (isInitialManagementContextReal()) {
- initialManagementContext.terminate();
- } else {
- // no-op; the non-deployment management context has nothing needing terminated
- }
- }
-
- @Override
- public long getTotalEffectorInvocations() {
- if (isInitialManagementContextReal()) {
- return initialManagementContext.getTotalEffectorInvocations();
- } else {
- return 0;
- }
- }
-
- @Override
- public void setBaseClassPathForScanning(Iterable<URL> urls) {
- checkInitialManagementContextReal();
- initialManagementContext.setBaseClassPathForScanning(urls);
- }
-
- @Override
- public void setManagementNodeUri(URI uri) {
- checkInitialManagementContextReal();
- initialManagementContext.setManagementNodeUri(uri);
- }
-
- @Override
- public void prePreManage(Entity entity) {
- // should throw? but in 0.7.0-SNAPSHOT it was no-op
- log.warn("Ignoring call to prePreManage("+entity+") on "+this);
- }
-
- @Override
- public void prePreManage(Location location) {
- // should throw? but in 0.7.0-SNAPSHOT it was no-op
- log.warn("Ignoring call to prePreManage("+location+") on "+this);
- }
-
- private boolean isInitialManagementContextReal() {
- return (initialManagementContext != null && !(initialManagementContext instanceof NonDeploymentManagementContext));
- }
-
- private void checkInitialManagementContextReal() {
- if (!isInitialManagementContextReal()) {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation.");
- }
- }
-
- @Override
- public void reloadBrooklynProperties() {
- checkInitialManagementContextReal();
- initialManagementContext.reloadBrooklynProperties();
- }
-
- @Override
- public void addPropertiesReloadListener(PropertiesReloadListener listener) {
- checkInitialManagementContextReal();
- initialManagementContext.addPropertiesReloadListener(listener);
- }
-
- @Override
- public void removePropertiesReloadListener(PropertiesReloadListener listener) {
- checkInitialManagementContextReal();
- initialManagementContext.removePropertiesReloadListener(listener);
- }
-
- @Override
- public BrooklynObject lookup(String id) {
- checkInitialManagementContextReal();
- return initialManagementContext.lookup(id);
- }
-
- @Override
- public <T extends BrooklynObject> T lookup(String id, Class<T> type) {
- checkInitialManagementContextReal();
- return initialManagementContext.lookup(id, type);
- }
-
- @Override
- public List<Throwable> errors() {
- checkInitialManagementContextReal();
- return initialManagementContext.errors();
- }
-
- @Override
- public CatalogInitialization getCatalogInitialization() {
- checkInitialManagementContextReal();
- return initialManagementContext.getCatalogInitialization();
- }
-
- @Override
- public void setCatalogInitialization(CatalogInitialization catalogInitialization) {
- checkInitialManagementContextReal();
- initialManagementContext.setCatalogInitialization(catalogInitialization);
- }
-
- /**
- * For when the initial management context is not "real"; the changeListener is a no-op, but everything else forbidden.
- *
- * @author aled
- */
- private class NonDeploymentRebindManager implements RebindManager {
-
- @Override
- public ChangeListener getChangeListener() {
- return ChangeListener.NOOP;
- }
-
- @Override
- public void setPersister(BrooklynMementoPersister persister) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void setPersister(BrooklynMementoPersister persister, PersistenceExceptionHandler exceptionHandler) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public BrooklynMementoPersister getPersister() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public List<Application> rebind() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public List<Application> rebind(ClassLoader classLoader) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public List<Application> rebind(ClassLoader classLoader, RebindExceptionHandler exceptionHandler) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public List<Application> rebind(ClassLoader classLoader, RebindExceptionHandler exceptionHandler, ManagementNodeState mode) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void startPersistence() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void stopPersistence() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void startReadOnly(ManagementNodeState state) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void stopReadOnly() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void start() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void stop() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public void waitForPendingComplete(Duration timeout, boolean canTrigger) throws InterruptedException, TimeoutException {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void forcePersistNow() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void forcePersistNow(boolean full, PersistenceExceptionHandler exceptionHandler) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public BrooklynMementoRawData retrieveMementoRawData() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public boolean isAwaitingInitialRebind() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
-
- @Override
- public Map<String, Object> getMetrics() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- }
-
- /**
- * For when the initial management context is not "real".
- *
- * @author aled
- */
- private class NonDeploymentHighAvailabilityManager implements HighAvailabilityManager {
- @Override
- public ManagementNodeState getNodeState() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public boolean isRunning() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public HighAvailabilityManager setPersister(ManagementPlaneSyncRecordPersister persister) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void disabled() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void start(HighAvailabilityMode startMode) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void stop() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public ManagementPlaneSyncRecordPersister getPersister() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public ManagementPlaneSyncRecord getLastManagementPlaneSyncRecord() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public ManagementPlaneSyncRecord loadManagementPlaneSyncRecord(boolean x) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void changeMode(HighAvailabilityMode startMode) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void setPriority(long priority) {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public long getPriority() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public Map<String, Object> getMetrics() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public void publishClearNonMaster() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- @Override
- public long getLastStateChange() {
- throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/NonDeploymentUsageManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentUsageManager.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentUsageManager.java
deleted file mode 100644
index ec2cd10..0000000
--- a/core/src/main/java/brooklyn/management/internal/NonDeploymentUsageManager.java
+++ /dev/null
@@ -1,132 +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 brooklyn.management.internal;
-
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.location.Location;
-
-import brooklyn.entity.basic.Lifecycle;
-import brooklyn.management.usage.ApplicationUsage;
-import brooklyn.management.usage.LocationUsage;
-
-import com.google.common.base.Predicate;
-
-
-public class NonDeploymentUsageManager implements UsageManager {
-
- // TODO All the `isInitialManagementContextReal()` code-checks is a code-smell.
- // Expect we can delete a lot of this once we guarantee that all entities are
- // instantiated via EntitySpec / EntityManager. Until then, we'll live with this.
-
- private final ManagementContextInternal initialManagementContext;
-
- public NonDeploymentUsageManager(ManagementContextInternal initialManagementContext) {
- this.initialManagementContext = initialManagementContext;
- }
-
- private boolean isInitialManagementContextReal() {
- return (initialManagementContext != null && !(initialManagementContext instanceof NonDeploymentManagementContext));
- }
-
- @Override
- public void recordApplicationEvent(Application app, Lifecycle state) {
- if (isInitialManagementContextReal()) {
- initialManagementContext.getUsageManager().recordApplicationEvent(app, state);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-
- @Override
- public void recordLocationEvent(Location loc, Lifecycle state) {
- if (isInitialManagementContextReal()) {
- initialManagementContext.getUsageManager().recordLocationEvent(loc, state);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-
- @Override
- public LocationUsage getLocationUsage(String locationId) {
- if (isInitialManagementContextReal()) {
- return initialManagementContext.getUsageManager().getLocationUsage(locationId);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-
- @Override
- public Set<LocationUsage> getLocationUsage(Predicate<? super LocationUsage> filter) {
- if (isInitialManagementContextReal()) {
- return initialManagementContext.getUsageManager().getLocationUsage(filter);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-
- @Override
- public ApplicationUsage getApplicationUsage(String appId) {
- if (isInitialManagementContextReal()) {
- return initialManagementContext.getUsageManager().getApplicationUsage(appId);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-
- @Override
- public Set<ApplicationUsage> getApplicationUsage(Predicate<? super ApplicationUsage> filter) {
- if (isInitialManagementContextReal()) {
- return initialManagementContext.getUsageManager().getApplicationUsage(filter);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-
- @Override
- @Deprecated
- public void addUsageListener(brooklyn.management.internal.UsageManager.UsageListener listener) {
- addUsageListener(new brooklyn.management.internal.UsageManager.UsageListener.UsageListenerAdapter(listener));
- }
-
- @Override
- @Deprecated
- public void removeUsageListener(brooklyn.management.internal.UsageManager.UsageListener listener) {
- removeUsageListener(new brooklyn.management.internal.UsageManager.UsageListener.UsageListenerAdapter(listener));
- }
-
- @Override
- public void addUsageListener(brooklyn.management.internal.UsageListener listener) {
- if (isInitialManagementContextReal()) {
- initialManagementContext.getUsageManager().addUsageListener(listener);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-
- @Override
- public void removeUsageListener(brooklyn.management.internal.UsageListener listener) {
- if (isInitialManagementContextReal()) {
- initialManagementContext.getUsageManager().removeUsageListener(listener);
- } else {
- throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/QueueingSubscriptionManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/QueueingSubscriptionManager.java b/core/src/main/java/brooklyn/management/internal/QueueingSubscriptionManager.java
deleted file mode 100644
index fb232ad..0000000
--- a/core/src/main/java/brooklyn/management/internal/QueueingSubscriptionManager.java
+++ /dev/null
@@ -1,148 +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 brooklyn.management.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.event.Sensor;
-import org.apache.brooklyn.api.event.SensorEvent;
-import org.apache.brooklyn.api.management.SubscriptionHandle;
-
-import com.google.common.base.Objects;
-
-@SuppressWarnings("rawtypes")
-public class QueueingSubscriptionManager extends AbstractSubscriptionManager {
-
- static class QueuedSubscription<T> {
- Map<String, Object> flags;
- Subscription<T> s;
- }
-
- public AbstractSubscriptionManager delegate = null;
- public boolean useDelegateForSubscribing = false;
- public boolean useDelegateForPublishing = false;
-
- List<QueuedSubscription> queuedSubscriptions = new ArrayList<QueuedSubscription>();
- List<SensorEvent> queuedSensorEvents = new ArrayList<SensorEvent>();
-
- @Override
- protected synchronized <T> SubscriptionHandle subscribe(Map<String, Object> flags, Subscription<T> s) {
- if (useDelegateForSubscribing)
- return delegate.subscribe(flags, s);
-
- QueuedSubscription<T> qs = new QueuedSubscription<T>();
- qs.flags = flags;
- s.subscriber = getSubscriber(flags, s);
- qs.s = s;
- queuedSubscriptions.add(qs);
- return s;
- }
-
- @Override
- public synchronized <T> void publish(SensorEvent<T> event) {
- if (useDelegateForPublishing) {
- delegate.publish(event);
- return;
- }
-
- queuedSensorEvents.add(event);
- }
-
- public void setDelegate(AbstractSubscriptionManager delegate) {
- this.delegate = delegate;
- }
-
- @SuppressWarnings("unchecked")
- public synchronized void startDelegatingForSubscribing() {
- assert delegate!=null;
- for (QueuedSubscription s: queuedSubscriptions) {
- delegate.subscribe(s.flags, s.s);
- }
- queuedSubscriptions.clear();
- useDelegateForSubscribing = true;
- }
-
- @SuppressWarnings("unchecked")
- public synchronized void startDelegatingForPublishing() {
- assert delegate!=null;
- for (SensorEvent evt: queuedSensorEvents) {
- delegate.publish(evt);
- }
- queuedSensorEvents.clear();
- useDelegateForPublishing = true;
- }
-
- public synchronized void stopDelegatingForSubscribing() {
- useDelegateForSubscribing = false;
- }
-
- public synchronized void stopDelegatingForPublishing() {
- useDelegateForPublishing = false;
- }
-
- @Override
- public synchronized boolean unsubscribe(SubscriptionHandle subscriptionId) {
- if (useDelegateForSubscribing)
- return delegate.unsubscribe(subscriptionId);
-
- Iterator<QueuedSubscription> qi = queuedSubscriptions.iterator();
- while (qi.hasNext()) {
- QueuedSubscription q = qi.next();
- if (Objects.equal(subscriptionId, q.s)) {
- qi.remove();
- return true;
- }
- }
- return false;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public synchronized Set<SubscriptionHandle> getSubscriptionsForSubscriber(Object subscriber) {
- if (useDelegateForSubscribing)
- return delegate.getSubscriptionsForSubscriber(subscriber);
-
- Set<SubscriptionHandle> result = new LinkedHashSet<SubscriptionHandle>();
- for (QueuedSubscription q: queuedSubscriptions) {
- if (Objects.equal(subscriber, getSubscriber(q.flags, q.s))) result.add(q.s);
- }
- return result;
- }
-
- @Override
- public synchronized Set<SubscriptionHandle> getSubscriptionsForEntitySensor(Entity source, Sensor<?> sensor) {
- if (useDelegateForSubscribing)
- return delegate.getSubscriptionsForEntitySensor(source, sensor);
-
- Set<SubscriptionHandle> result = new LinkedHashSet<SubscriptionHandle>();
- for (QueuedSubscription q: queuedSubscriptions) {
- if ((q.s.sensor==null || Objects.equal(q.s.sensor, sensor)) &&
- (q.s.producer==null || Objects.equal(q.s.producer, sensor)))
- result.add(q.s);
- }
- return result;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/Subscription.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/Subscription.java b/core/src/main/java/brooklyn/management/internal/Subscription.java
deleted file mode 100644
index f8409cb..0000000
--- a/core/src/main/java/brooklyn/management/internal/Subscription.java
+++ /dev/null
@@ -1,66 +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 brooklyn.management.internal;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.event.Sensor;
-import org.apache.brooklyn.api.event.SensorEvent;
-import org.apache.brooklyn.api.event.SensorEventListener;
-import org.apache.brooklyn.api.management.SubscriptionHandle;
-
-import brooklyn.util.text.Identifiers;
-
-import com.google.common.base.Predicate;
-
-class Subscription<T> implements SubscriptionHandle {
- public final String id = Identifiers.makeRandomId(8);
-
- public Object subscriber;
- public Object subscriberExecutionManagerTag;
- /** whether the tag was supplied by user, in which case we should not clear execution semantics */
- public boolean subscriberExecutionManagerTagSupplied;
- public final Entity producer;
- public final Sensor<T> sensor;
- public final SensorEventListener<? super T> listener;
- public Map<String,Object> flags;
- public Predicate<SensorEvent<T>> eventFilter;
-
- public Subscription(Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- this.producer = producer;
- this.sensor = sensor;
- this.listener = listener;
- }
-
- @Override
- public boolean equals(Object other) {
- return (other instanceof Subscription && ((Subscription<?>)other).id==id);
- }
-
- @Override
- public int hashCode() {
- return id.hashCode();
- }
-
- @Override
- public String toString() {
- return "Subscription["+id+";"+subscriber+"@"+LocalSubscriptionManager.makeEntitySensorToken(producer,sensor)+"]";
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/SubscriptionTracker.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/SubscriptionTracker.java b/core/src/main/java/brooklyn/management/internal/SubscriptionTracker.java
deleted file mode 100644
index ec86fae..0000000
--- a/core/src/main/java/brooklyn/management/internal/SubscriptionTracker.java
+++ /dev/null
@@ -1,137 +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 brooklyn.management.internal;
-
-import java.util.Collection;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.Group;
-import org.apache.brooklyn.api.event.Sensor;
-import org.apache.brooklyn.api.event.SensorEventListener;
-import org.apache.brooklyn.api.management.SubscriptionContext;
-import org.apache.brooklyn.api.management.SubscriptionHandle;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.SetMultimap;
-
-/**
- * Tracks subscriptions associated that are registered with particular entities. Gives utilities for unsubscribing from all
- * subscriptions on a given entity, etc.
- */
-public class SubscriptionTracker {
-
- // This class is thread-safe. All modifications to subscriptions are synchronized on the
- // "subscriptions" field. However, calls to alien code (i.e. context.subscribe etc) is
- // done without holding the lock.
- //
- // If two threads do subscribe() and unsubscribeAll() concurrently, then it's non-derministic
- // whether the subscription will be in place at the end (but that's unavoidable). However, it
- // is guaranteed that the internal state of the SubscriptionTracker will be consistent: if
- // the "subscriptions" includes the new subscription then that subscription will really exist,
- // and vice versa.
-
- protected SubscriptionContext context;
-
- private final SetMultimap<Entity, SubscriptionHandle> subscriptions = HashMultimap.create();
-
- public SubscriptionTracker(SubscriptionContext subscriptionContext) {
- this.context = subscriptionContext;
- }
-
- /** @see SubscriptionContext#subscribe(Entity, Sensor, SensorEventListener) */
- public <T> SubscriptionHandle subscribe(Entity producer, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- SubscriptionHandle handle = context.subscribe(producer, sensor, listener);
- synchronized (subscriptions) {
- subscriptions.put(producer, handle);
- }
- return handle;
- }
-
- /** @see SubscriptionContext#subscribeToChildren(Entity, Sensor, SensorEventListener) */
- public <T> SubscriptionHandle subscribeToChildren(Entity parent, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- SubscriptionHandle handle = context.subscribeToChildren(parent, sensor, listener);
- synchronized (subscriptions) {
- subscriptions.put(parent, handle);
- }
- return handle;
- }
-
- /**
- * @see SubscriptionContext#subscribeToMembers(Group, Sensor, SensorEventListener)
- */
- public <T> SubscriptionHandle subscribeToMembers(Group parent, Sensor<T> sensor, SensorEventListener<? super T> listener) {
- SubscriptionHandle handle = context.subscribeToMembers(parent, sensor, listener);
- synchronized (subscriptions) {
- subscriptions.put(parent, handle);
- }
- return handle;
- }
-
- /**
- * Unsubscribes the given producer.
- *
- * @see SubscriptionContext#unsubscribe(SubscriptionHandle)
- */
- public boolean unsubscribe(Entity producer) {
- Collection<SubscriptionHandle> handles;
- synchronized (subscriptions) {
- handles = subscriptions.removeAll(producer);
- }
- if (handles != null) {
- for (SubscriptionHandle handle : handles) {
- context.unsubscribe(handle);
- }
- return true;
- }
- return false;
- }
-
- /**
- * Unsubscribes the given producer.
- *
- * @see SubscriptionContext#unsubscribe(SubscriptionHandle)
- */
- public boolean unsubscribe(Entity producer, SubscriptionHandle handle) {
- synchronized (subscriptions) {
- subscriptions.remove(producer, handle);
- }
- return context.unsubscribe(handle);
- }
-
- /**
- * @return an ordered list of all subscription handles
- */
- public Collection<SubscriptionHandle> getAllSubscriptions() {
- synchronized (subscriptions) {
- return ImmutableList.copyOf(subscriptions.values());
- }
- }
-
- public void unsubscribeAll() {
- Collection<SubscriptionHandle> subscriptionsSnapshot;
- synchronized (subscriptions) {
- subscriptionsSnapshot = ImmutableList.copyOf(subscriptions.values());
- subscriptions.clear();
- }
- for (SubscriptionHandle s: subscriptionsSnapshot) {
- context.unsubscribe(s);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/UsageListener.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/UsageListener.java b/core/src/main/java/brooklyn/management/internal/UsageListener.java
deleted file mode 100644
index 5a2af3a..0000000
--- a/core/src/main/java/brooklyn/management/internal/UsageListener.java
+++ /dev/null
@@ -1,104 +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 brooklyn.management.internal;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.location.Location;
-
-import brooklyn.management.usage.ApplicationUsage.ApplicationEvent;
-import brooklyn.management.usage.LocationUsage.LocationEvent;
-
-import com.google.common.annotations.Beta;
-
-@Beta
-public interface UsageListener {
-
- /**
- * A no-op implementation of {@link UsageListener}, for users to extend.
- *
- * Users are encouraged to extend this class, which will shield the user
- * from the addition of other usage event methods being added. If additional
- * methods are added in a future release, a no-op implementation will be
- * added to this class.
- */
- @Beta
- public static class BasicUsageListener implements UsageListener {
- @Override
- public void onApplicationEvent(ApplicationMetadata app, ApplicationEvent event) {
- }
-
- @Override public void onLocationEvent(LocationMetadata loc, LocationEvent event) {
- }
- }
-
- /**
- * Users should never implement this interface directly; methods may be added in future releases
- * without notice.
- */
- @Beta
- public interface ApplicationMetadata {
- /**
- * Access the application directly with caution: by the time the listener fires,
- * the application may no longer be managed.
- */
- @Beta
- Application getApplication();
-
- String getApplicationId();
-
- String getApplicationName();
-
- String getEntityType();
-
- String getCatalogItemId();
-
- Map<String, String> getMetadata();
- }
-
- /**
- * Users should never implement this interface directly; methods may be added in future releases
- * without notice.
- */
- @Beta
- public interface LocationMetadata {
- /**
- * Access the location directly with caution: by the time the listener fires,
- * the location may no longer be managed.
- */
- @Beta
- Location getLocation();
-
- String getLocationId();
-
- Map<String, String> getMetadata();
- }
-
- public static final UsageListener NOOP = new UsageListener() {
- @Override public void onApplicationEvent(ApplicationMetadata app, ApplicationEvent event) {}
- @Override public void onLocationEvent(LocationMetadata loc, LocationEvent event) {}
- };
-
- @Beta
- void onApplicationEvent(ApplicationMetadata app, ApplicationEvent event);
-
- @Beta
- void onLocationEvent(LocationMetadata loc, LocationEvent event);
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/UsageManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/UsageManager.java b/core/src/main/java/brooklyn/management/internal/UsageManager.java
deleted file mode 100644
index 5105faf..0000000
--- a/core/src/main/java/brooklyn/management/internal/UsageManager.java
+++ /dev/null
@@ -1,166 +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 brooklyn.management.internal;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.location.Location;
-
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.entity.basic.Lifecycle;
-import brooklyn.management.usage.ApplicationUsage;
-import brooklyn.management.usage.ApplicationUsage.ApplicationEvent;
-import brooklyn.management.usage.LocationUsage;
-import brooklyn.management.usage.LocationUsage.LocationEvent;
-import brooklyn.util.time.Duration;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.reflect.TypeToken;
-
-@Beta
-public interface UsageManager {
-
- @SuppressWarnings("serial")
- public static final ConfigKey<List<brooklyn.management.internal.UsageListener>> USAGE_LISTENERS = ConfigKeys.newConfigKey(
- new TypeToken<List<brooklyn.management.internal.UsageListener>>() {},
- "brooklyn.usageManager.listeners", "Optional usage listeners (i.e. for metering)",
- ImmutableList.<brooklyn.management.internal.UsageListener>of());
-
- public static final ConfigKey<Duration> USAGE_LISTENER_TERMINATION_TIMEOUT = ConfigKeys.newConfigKey(
- Duration.class,
- "brooklyn.usageManager.listeners.timeout",
- "Timeout on termination, to wait for queue of usage listener events to be processed",
- Duration.TEN_SECONDS);
-
- /**
- * @since 0.7.0
- * @deprecated since 0.7.0; use {@link brooklyn.management.internal.UsageListener}; see {@link UsageListenerAdapter}
- */
- public interface UsageListener {
- public static final UsageListener NOOP = new UsageListener() {
- @Override public void onApplicationEvent(String applicationId, String applicationName, String entityType,
- String catalogItemId, Map<String, String> metadata, ApplicationEvent event) {}
- @Override public void onLocationEvent(String locationId, Map<String, String> metadata, LocationEvent event) {}
- };
-
- public static class UsageListenerAdapter implements brooklyn.management.internal.UsageListener {
- private final UsageListener listener;
-
- public UsageListenerAdapter(UsageListener listener) {
- this.listener = checkNotNull(listener, "listener");
- }
-
- @Override
- public void onApplicationEvent(ApplicationMetadata app, ApplicationEvent event) {
- listener.onApplicationEvent(app.getApplicationId(), app.getApplicationName(), app.getEntityType(), app.getCatalogItemId(), app.getMetadata(), event);
- }
-
- @Override
- public void onLocationEvent(LocationMetadata loc, LocationEvent event) {
- listener.onLocationEvent(loc.getLocationId(), loc.getMetadata(), event);
- }
-
- @Override
- public boolean equals(Object obj) {
- return (obj instanceof UsageListenerAdapter) && listener.equals(((UsageListenerAdapter)obj).listener);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(listener);
- }
- }
-
- void onApplicationEvent(String applicationId, String applicationName, String entityType, String catalogItemId,
- Map<String, String> metadata, ApplicationEvent event);
-
- void onLocationEvent(String locationId, Map<String, String> metadata, LocationEvent event);
- }
-
- /**
- * Adds this application event to the usage record for the given app (creating the usage
- * record if one does not already exist).
- */
- void recordApplicationEvent(Application app, Lifecycle state);
-
- /**
- * Adds this location event to the usage record for the given location (creating the usage
- * record if one does not already exist).
- */
- void recordLocationEvent(Location loc, Lifecycle state);
-
- /**
- * Returns the usage info for the location with the given id, or null if unknown.
- */
- LocationUsage getLocationUsage(String locationId);
-
- /**
- * Returns the usage info that matches the given predicate.
- * For example, could be used to find locations used within a given time period.
- */
- Set<LocationUsage> getLocationUsage(Predicate<? super LocationUsage> filter);
-
- /**
- * Returns the usage info for the application with the given id, or null if unknown.
- */
- ApplicationUsage getApplicationUsage(String appId);
-
- /**
- * Returns the usage info that matches the given predicate.
- * For example, could be used to find applications used within a given time period.
- */
- Set<ApplicationUsage> getApplicationUsage(Predicate<? super ApplicationUsage> filter);
-
- /**
- * @since 0.7.0
- * @deprecated since 0.7.0; use {@link #removeUsageListener(brooklyn.management.internal.UsageListener)};
- * see {@link brooklyn.management.internal.UsageManager.UsageListener.UsageListenerAdapter}
- */
- void addUsageListener(brooklyn.management.internal.UsageManager.UsageListener listener);
-
- /**
- * @since 0.7.0
- * @deprecated since 0.7.0; use {@link #removeUsageListener(brooklyn.management.internal.UsageListener)}
- */
- @Deprecated
- void removeUsageListener(brooklyn.management.internal.UsageManager.UsageListener listener);
-
- /**
- * Adds the given listener, to be notified on recording of application/location events.
- * The listener notifications may be asynchronous.
- *
- * As of 0.7.0, the listener is not persisted so will be lost on restart/rebind. This
- * behaviour may change in a subsequent release.
- */
- void addUsageListener(brooklyn.management.internal.UsageListener listener);
-
- /**
- * Removes the given listener.
- */
- void removeUsageListener(brooklyn.management.internal.UsageListener listener);
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java b/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java
deleted file mode 100644
index 7186783..0000000
--- a/core/src/main/java/brooklyn/management/usage/ApplicationUsage.java
+++ /dev/null
@@ -1,126 +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 brooklyn.management.usage;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import brooklyn.entity.basic.Lifecycle;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-/**
- */
-public class ApplicationUsage {
-
- public static class ApplicationEvent {
- private final Date date;
- private final Lifecycle state;
- private final String user;
-
- public ApplicationEvent(Lifecycle state, String user) {
- this(new Date(), state, user);
- }
-
- public ApplicationEvent(Date date, Lifecycle state) {
- this(date,state, null);
- }
-
- public ApplicationEvent(Date date, Lifecycle state, String user) {
- this.date = checkNotNull(date, "date");
- this.state = checkNotNull(state, "state");
- this.user = user;
- }
-
- public Date getDate() {
- return date;
- }
-
- public Lifecycle getState() {
- return state;
- }
-
- public String getUser() {
- return user;
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof ApplicationEvent)) return false;
- ApplicationEvent o = (ApplicationEvent) other;
- return Objects.equal(date, o.date) && Objects.equal(state, o.state) && Objects.equal(user, o.user);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(date, state, user);
- }
-
- @Override
- public String toString() {
- return Objects.toStringHelper(this).add("date", date).add("state", state).add("entitlementContext", user).toString();
- }
- }
-
- private final String applicationId;
- private final String applicationName;
- private final String entityType;
- private final Map<String, String> metadata;
- private final List<ApplicationEvent> events = Collections.synchronizedList(Lists.<ApplicationEvent>newArrayList());
-
- public ApplicationUsage(String applicationId, String applicationName, String entityType, Map<String, String> metadata) {
- this.applicationId = checkNotNull(applicationId, "applicationId");
- // allow name to be null, happens in certain failed rebind cases
- this.applicationName = applicationName;
- this.entityType = checkNotNull(entityType, "entityType");
- this.metadata = checkNotNull(metadata, "metadata");
- }
-
- public String getApplicationId() {
- return applicationId;
- }
-
- public String getApplicationName() {
- return applicationName;
- }
-
- public String getEntityType() {
- return entityType;
- }
-
- public Map<String, String> getMetadata() {
- return metadata;
- }
-
- public List<ApplicationEvent> getEvents() {
- synchronized (events) {
- return ImmutableList.copyOf(events);
- }
- }
-
- public void addEvent(ApplicationEvent event) {
- events.add(checkNotNull(event, "event"));
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/usage/LocationUsage.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/usage/LocationUsage.java b/core/src/main/java/brooklyn/management/usage/LocationUsage.java
deleted file mode 100644
index fbca540..0000000
--- a/core/src/main/java/brooklyn/management/usage/LocationUsage.java
+++ /dev/null
@@ -1,135 +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 brooklyn.management.usage;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import brooklyn.entity.basic.Lifecycle;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-/**
- */
-public class LocationUsage {
-
- public static class LocationEvent {
- private final Date date;
- private final Lifecycle state;
- private final String entityId;
- private final String entityType;
- private final String applicationId;
- private final String user;
-
- public LocationEvent(Lifecycle state, String entityId, String entityType, String applicationId, String user) {
- this(new Date(), state, entityId, entityType, applicationId, user);
- }
-
- public LocationEvent(Date date, Lifecycle state, String entityId, String entityType, String applicationId, String user) {
- this.date = checkNotNull(date, "date");
- this.state = checkNotNull(state, "state");
- this.entityId = checkNotNull(entityId, "entityId");
- this.entityType = checkNotNull(entityType, "entityType");
- this.applicationId = checkNotNull(applicationId, "applicationId (entity "+entityId+")");
- this.user = user;
- }
-
- public Date getDate() {
- return date;
- }
-
- public Lifecycle getState() {
- return state;
- }
-
- public String getEntityId() {
- return entityId;
- }
-
- public String getEntityType() {
- return entityType;
- }
-
- public String getApplicationId() {
- return applicationId;
- }
-
- public String getUser() {
- return user;
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof LocationEvent)) return false;
- LocationEvent o = (LocationEvent) other;
- return Objects.equal(date, o.date) && Objects.equal(state, o.state)
- && Objects.equal(entityId, o.entityId) && Objects.equal(entityType, o.entityType)
- && Objects.equal(applicationId, o.applicationId) && Objects.equal(user, o.user);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(date, state, entityId, entityType, applicationId, user);
- }
-
- @Override
- public String toString() {
- return Objects.toStringHelper(this)
- .add("date", date)
- .add("state", state)
- .add("entityId", entityId)
- .add("appId", applicationId)
- .add("user", user)
- .toString();
- }
- }
-
- private final String locationId;
- private final Map<String, String> metadata;
- private final List<LocationEvent> events = Collections.synchronizedList(Lists.<LocationEvent>newArrayList());
-
- public LocationUsage(String locationId, Map<String, String> metadata) {
- this.locationId = checkNotNull(locationId, "locationId");
- this.metadata = checkNotNull(metadata, "metadata");
- }
-
- public String getLocationId() {
- return locationId;
- }
-
- public Map<String, String> getMetadata() {
- return metadata;
- }
-
- public List<LocationEvent> getEvents() {
- synchronized (events) {
- return ImmutableList.copyOf(events);
- }
- }
-
- public void addEvent(LocationEvent event) {
- events.add(checkNotNull(event, "event"));
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
index 0c2314c..ab303a0 100644
--- a/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
+++ b/core/src/main/java/brooklyn/policy/basic/AbstractEntityAdjunct.java
@@ -40,6 +40,7 @@ import org.apache.brooklyn.api.management.SubscriptionContext;
import org.apache.brooklyn.api.management.SubscriptionHandle;
import org.apache.brooklyn.api.management.Task;
import org.apache.brooklyn.api.policy.EntityAdjunct;
+import org.apache.brooklyn.core.management.internal.SubscriptionTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,7 +53,6 @@ import brooklyn.enricher.basic.AbstractEnricher;
import brooklyn.entity.basic.ConfigKeys;
import brooklyn.entity.basic.Entities;
import brooklyn.entity.basic.EntityInternal;
-import brooklyn.management.internal.SubscriptionTracker;
import brooklyn.util.config.ConfigBag;
import brooklyn.util.flags.FlagUtils;
import brooklyn.util.flags.SetFromFlag;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/util/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/ResourceUtils.java b/core/src/main/java/brooklyn/util/ResourceUtils.java
index cb350af..53264e3 100644
--- a/core/src/main/java/brooklyn/util/ResourceUtils.java
+++ b/core/src/main/java/brooklyn/util/ResourceUtils.java
@@ -40,6 +40,7 @@ import java.util.regex.Pattern;
import org.apache.brooklyn.api.management.ManagementContext;
import org.apache.brooklyn.api.management.classloading.BrooklynClassLoadingContext;
+import org.apache.brooklyn.core.management.classloading.JavaBrooklynClassLoadingContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.Credentials;
@@ -53,8 +54,9 @@ import org.slf4j.LoggerFactory;
import brooklyn.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
import brooklyn.catalog.internal.CatalogUtils;
import brooklyn.internal.BrooklynInitialization;
+
import org.apache.brooklyn.location.basic.SshMachineLocation;
-import brooklyn.management.classloading.JavaBrooklynClassLoadingContext;
+
import brooklyn.util.collections.MutableMap;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.http.HttpTool;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java b/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
index 3a41fb2..8942a18 100644
--- a/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
+++ b/core/src/main/java/brooklyn/util/task/BasicExecutionContext.java
@@ -36,13 +36,13 @@ import org.apache.brooklyn.api.management.HasTaskChildren;
import org.apache.brooklyn.api.management.Task;
import org.apache.brooklyn.api.management.TaskAdaptable;
import org.apache.brooklyn.api.management.entitlement.EntitlementContext;
+import org.apache.brooklyn.core.management.entitlement.Entitlements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import brooklyn.entity.basic.BrooklynTaskTags;
import brooklyn.entity.basic.BrooklynTaskTags.WrappedEntity;
import brooklyn.entity.basic.EntityInternal;
-import brooklyn.management.entitlement.Entitlements;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/util/task/CompoundTask.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/CompoundTask.java b/core/src/main/java/brooklyn/util/task/CompoundTask.java
index 81f865d..e33120c 100644
--- a/core/src/main/java/brooklyn/util/task/CompoundTask.java
+++ b/core/src/main/java/brooklyn/util/task/CompoundTask.java
@@ -31,11 +31,11 @@ import java.util.concurrent.ExecutionException;
import org.apache.brooklyn.api.management.HasTaskChildren;
import org.apache.brooklyn.api.management.Task;
import org.apache.brooklyn.api.management.TaskAdaptable;
+import org.apache.brooklyn.core.management.internal.ManagementContextInternal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import brooklyn.entity.basic.BrooklynTaskTags;
-import brooklyn.management.internal.ManagementContextInternal;
import brooklyn.util.collections.MutableMap;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/util/task/DynamicSequentialTask.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/task/DynamicSequentialTask.java b/core/src/main/java/brooklyn/util/task/DynamicSequentialTask.java
index a58a05a..455a889 100644
--- a/core/src/main/java/brooklyn/util/task/DynamicSequentialTask.java
+++ b/core/src/main/java/brooklyn/util/task/DynamicSequentialTask.java
@@ -31,11 +31,11 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import org.apache.brooklyn.api.management.HasTaskChildren;
import org.apache.brooklyn.api.management.Task;
import org.apache.brooklyn.api.management.TaskQueueingContext;
+import org.apache.brooklyn.core.management.internal.ManagementContextInternal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import brooklyn.entity.basic.BrooklynTaskTags;
-import brooklyn.management.internal.ManagementContextInternal;
import brooklyn.util.collections.MutableMap;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.time.CountdownTimer;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/util/text/TemplateProcessor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/text/TemplateProcessor.java b/core/src/main/java/brooklyn/util/text/TemplateProcessor.java
index b5d8b2d..eb0c2ad 100644
--- a/core/src/main/java/brooklyn/util/text/TemplateProcessor.java
+++ b/core/src/main/java/brooklyn/util/text/TemplateProcessor.java
@@ -30,6 +30,7 @@ import org.apache.brooklyn.api.entity.drivers.EntityDriver;
import org.apache.brooklyn.api.event.AttributeSensor;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.api.management.ManagementContext;
+import org.apache.brooklyn.core.management.internal.ManagementContextInternal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,7 +39,6 @@ import brooklyn.entity.basic.Entities;
import brooklyn.entity.basic.EntityInternal;
import brooklyn.event.basic.DependentConfiguration;
import brooklyn.event.basic.Sensors;
-import brooklyn.management.internal.ManagementContextInternal;
import brooklyn.util.collections.MutableMap;
import brooklyn.util.exceptions.Exceptions;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/org/apache/brooklyn/core/management/ManagementContextInjectable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/management/ManagementContextInjectable.java b/core/src/main/java/org/apache/brooklyn/core/management/ManagementContextInjectable.java
new file mode 100644
index 0000000..c92639e
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/management/ManagementContextInjectable.java
@@ -0,0 +1,33 @@
+/*
+ * 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.management;
+
+import org.apache.brooklyn.api.management.ManagementContext;
+
+/**
+ * Provides a way for the {@link ManagementContext} to be injected directly.
+ */
+public interface ManagementContextInjectable {
+
+ /**
+ * Sets the {@link ManagementContext} reference.
+ */
+ public void injectManagementContext(ManagementContext managementContext);
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/org/apache/brooklyn/core/management/classloading/AbstractBrooklynClassLoadingContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/management/classloading/AbstractBrooklynClassLoadingContext.java b/core/src/main/java/org/apache/brooklyn/core/management/classloading/AbstractBrooklynClassLoadingContext.java
new file mode 100644
index 0000000..a8366df
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/management/classloading/AbstractBrooklynClassLoadingContext.java
@@ -0,0 +1,82 @@
+package org.apache.brooklyn.core.management.classloading;
+
+import javax.annotation.Nullable;
+
+import org.apache.brooklyn.api.management.ManagementContext;
+import org.apache.brooklyn.api.management.classloading.BrooklynClassLoadingContext;
+
+import brooklyn.util.guava.Maybe;
+
+import com.google.common.base.Objects;
+
+/*
+ * 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.
+ */
+public abstract class AbstractBrooklynClassLoadingContext implements BrooklynClassLoadingContext {
+
+ protected final ManagementContext mgmt;
+
+ public AbstractBrooklynClassLoadingContext(ManagementContext mgmt) {
+ this.mgmt = mgmt;
+ }
+
+ @Override
+ public ManagementContext getManagementContext() {
+ return mgmt;
+ }
+
+ @Override
+ public Class<?> loadClass(String className) {
+ return tryLoadClass(className).get();
+ }
+
+ @Override
+ // this is the only one left for subclasses
+ public abstract Maybe<Class<?>> tryLoadClass(String className);
+
+ @Override
+ public <T> Class<? extends T> loadClass(String className, @Nullable Class<T> supertype) {
+ return tryLoadClass(className, supertype).get();
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
+ public <T> Maybe<Class<? extends T>> tryLoadClass(String className, @Nullable Class<T> supertype) {
+ Maybe<Class<?>> result = tryLoadClass(className);
+ if (result.isAbsent()) return (Maybe)result;
+ Class<?> clazz = result.get();
+ if (supertype==null || supertype.isAssignableFrom(clazz)) return (Maybe)result;
+ throw new ClassCastException(className+" is not an instance of "+supertype);
+ }
+
+ @Override
+ public abstract String toString();
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(mgmt);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof BrooklynClassLoadingContext)) return false;
+ if (!Objects.equal(mgmt, ((BrooklynClassLoadingContext)obj).getManagementContext())) return false;
+ return true;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/org/apache/brooklyn/core/management/classloading/BrooklynClassLoadingContextSequential.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/management/classloading/BrooklynClassLoadingContextSequential.java b/core/src/main/java/org/apache/brooklyn/core/management/classloading/BrooklynClassLoadingContextSequential.java
new file mode 100644
index 0000000..afc2232
--- /dev/null
+++ b/core/src/main/java/org/apache/brooklyn/core/management/classloading/BrooklynClassLoadingContextSequential.java
@@ -0,0 +1,136 @@
+/*
+ * 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.management.classloading;
+
+import java.net.URL;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.brooklyn.api.management.ManagementContext;
+import org.apache.brooklyn.api.management.classloading.BrooklynClassLoadingContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.util.collections.MutableList;
+import brooklyn.util.collections.MutableSet;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.guava.Maybe;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+public final class BrooklynClassLoadingContextSequential extends AbstractBrooklynClassLoadingContext {
+
+ private static final Logger log = LoggerFactory.getLogger(BrooklynClassLoadingContextSequential.class);
+
+ private final List<BrooklynClassLoadingContext> primaries = MutableList.<BrooklynClassLoadingContext>of();
+ // secondaries used to put java classloader last
+ private final Set<BrooklynClassLoadingContext> secondaries = MutableSet.<BrooklynClassLoadingContext>of();
+
+ public BrooklynClassLoadingContextSequential(ManagementContext mgmt, BrooklynClassLoadingContext ...targets) {
+ super(mgmt);
+ for (BrooklynClassLoadingContext target: targets)
+ add(target);
+ }
+
+ public void add(BrooklynClassLoadingContext target) {
+ if (target instanceof BrooklynClassLoadingContextSequential) {
+ for (BrooklynClassLoadingContext targetN: ((BrooklynClassLoadingContextSequential)target).primaries )
+ add(targetN);
+ for (BrooklynClassLoadingContext targetN: ((BrooklynClassLoadingContextSequential)target).secondaries )
+ addSecondary(targetN);
+ } else {
+ this.primaries.add( target );
+ }
+ }
+
+ public void addSecondary(BrooklynClassLoadingContext target) {
+ if (!(target instanceof JavaBrooklynClassLoadingContext)) {
+ // support for legacy catalog classloader only
+ log.warn("Only Java classloaders should be secondary");
+ }
+ this.secondaries.add( target );
+ }
+
+ public Maybe<Class<?>> tryLoadClass(String className) {
+ List<Throwable> errors = MutableList.of();
+ for (BrooklynClassLoadingContext target: primaries) {
+ Maybe<Class<?>> clazz = target.tryLoadClass(className);
+ if (clazz.isPresent())
+ return clazz;
+ errors.add( ((Maybe.Absent<?>)clazz).getException() );
+ }
+ boolean noPrimaryErrors = errors.isEmpty();
+ for (BrooklynClassLoadingContext target: secondaries) {
+ Maybe<Class<?>> clazz = target.tryLoadClass(className);
+ if (clazz.isPresent())
+ return clazz;
+ if (noPrimaryErrors)
+ errors.add( ((Maybe.Absent<?>)clazz).getException() );
+ }
+
+ return Maybe.absent(Exceptions.create("Unable to load "+className+" from "+primaries, errors));
+ }
+
+ @Override
+ public URL getResource(String resourceInThatDir) {
+ for (BrooklynClassLoadingContext target: primaries) {
+ URL result = target.getResource(resourceInThatDir);
+ if (result!=null) return result;
+ }
+ for (BrooklynClassLoadingContext target: secondaries) {
+ URL result = target.getResource(resourceInThatDir);
+ if (result!=null) return result;
+ }
+ return null;
+ }
+
+ @Override
+ public Iterable<URL> getResources(String name) {
+ List<Iterable<URL>> resources = Lists.newArrayList();
+ for (BrooklynClassLoadingContext target : primaries) {
+ resources.add(target.getResources(name));
+ }
+ for (BrooklynClassLoadingContext target : secondaries) {
+ resources.add(target.getResources(name));
+ }
+ return Iterables.concat(resources);
+ }
+
+ @Override
+ public String toString() {
+ return "classload:"+primaries+";"+secondaries;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(super.hashCode(), primaries, secondaries);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!super.equals(obj)) return false;
+ if (!(obj instanceof BrooklynClassLoadingContextSequential)) return false;
+ if (!Objects.equal(primaries, ((BrooklynClassLoadingContextSequential)obj).primaries)) return false;
+ if (!Objects.equal(secondaries, ((BrooklynClassLoadingContextSequential)obj).secondaries)) return false;
+ return true;
+ }
+
+}