http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java b/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java deleted file mode 100644 index c2c7905..0000000 --- a/core/src/main/java/brooklyn/management/internal/LocalSubscriptionManager.java +++ /dev/null @@ -1,292 +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 brooklyn.util.JavaGroovyEquivalents.elvis; -import static brooklyn.util.JavaGroovyEquivalents.groovyTruth; -import static brooklyn.util.JavaGroovyEquivalents.join; -import static brooklyn.util.JavaGroovyEquivalents.mapOf; - -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicLong; - -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.ExecutionManager; -import org.apache.brooklyn.api.management.SubscriptionHandle; -import org.apache.brooklyn.api.management.SubscriptionManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.Entities; -import brooklyn.util.task.BasicExecutionManager; -import brooklyn.util.task.SingleThreadedScheduler; -import brooklyn.util.text.Identifiers; - -import com.google.common.base.Predicate; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimaps; - -/** - * A {@link SubscriptionManager} that stores subscription details locally. - */ -public class LocalSubscriptionManager extends AbstractSubscriptionManager { - - private static final Logger LOG = LoggerFactory.getLogger(LocalSubscriptionManager.class); - - protected final ExecutionManager em; - - private final String tostring = "SubscriptionContext("+Identifiers.getBase64IdFromValue(System.identityHashCode(this), 5)+")"; - - private final AtomicLong totalEventsPublishedCount = new AtomicLong(); - private final AtomicLong totalEventsDeliveredCount = new AtomicLong(); - - @SuppressWarnings("rawtypes") - protected final ConcurrentMap<String, Subscription> allSubscriptions = new ConcurrentHashMap<String, Subscription>(); - @SuppressWarnings("rawtypes") - protected final ConcurrentMap<Object, Set<Subscription>> subscriptionsBySubscriber = new ConcurrentHashMap<Object, Set<Subscription>>(); - @SuppressWarnings("rawtypes") - protected final ConcurrentMap<Object, Set<Subscription>> subscriptionsByToken = new ConcurrentHashMap<Object, Set<Subscription>>(); - - public LocalSubscriptionManager(ExecutionManager m) { - this.em = m; - } - - public long getNumSubscriptions() { - return allSubscriptions.size(); - } - - public long getTotalEventsPublished() { - return totalEventsPublishedCount.get(); - } - - public long getTotalEventsDelivered() { - return totalEventsDeliveredCount.get(); - } - - @SuppressWarnings("unchecked") - protected synchronized <T> SubscriptionHandle subscribe(Map<String, Object> flags, Subscription<T> s) { - Entity producer = s.producer; - Sensor<T> sensor= s.sensor; - s.subscriber = getSubscriber(flags, s); - if (flags.containsKey("subscriberExecutionManagerTag")) { - s.subscriberExecutionManagerTag = flags.remove("subscriberExecutionManagerTag"); - s.subscriberExecutionManagerTagSupplied = true; - } else { - s.subscriberExecutionManagerTag = - s.subscriber instanceof Entity ? "subscription-delivery-entity-"+((Entity)s.subscriber).getId()+"["+s.subscriber+"]" : - s.subscriber instanceof String ? "subscription-delivery-string["+s.subscriber+"]" : - "subscription-delivery-object["+s.subscriber+"]"; - s.subscriberExecutionManagerTagSupplied = false; - } - s.eventFilter = (Predicate<SensorEvent<T>>) flags.remove("eventFilter"); - s.flags = flags; - - if (LOG.isDebugEnabled()) LOG.debug("Creating subscription {} for {} on {} {} in {}", new Object[] {s.id, s.subscriber, producer, sensor, this}); - allSubscriptions.put(s.id, s); - addToMapOfSets(subscriptionsByToken, makeEntitySensorToken(s.producer, s.sensor), s); - if (s.subscriber!=null) { - addToMapOfSets(subscriptionsBySubscriber, s.subscriber, s); - } - if (!s.subscriberExecutionManagerTagSupplied && s.subscriberExecutionManagerTag!=null) { - ((BasicExecutionManager) em).setTaskSchedulerForTag(s.subscriberExecutionManagerTag, SingleThreadedScheduler.class); - } - return s; - } - - @SuppressWarnings("unchecked") - public Set<SubscriptionHandle> getSubscriptionsForSubscriber(Object subscriber) { - return (Set<SubscriptionHandle>) ((Set<?>) elvis(subscriptionsBySubscriber.get(subscriber), Collections.emptySet())); - } - - public synchronized Set<SubscriptionHandle> getSubscriptionsForEntitySensor(Entity source, Sensor<?> sensor) { - Set<SubscriptionHandle> subscriptions = new LinkedHashSet<SubscriptionHandle>(); - subscriptions.addAll(elvis(subscriptionsByToken.get(makeEntitySensorToken(source, sensor)), Collections.emptySet())); - subscriptions.addAll(elvis(subscriptionsByToken.get(makeEntitySensorToken(null, sensor)), Collections.emptySet())); - subscriptions.addAll(elvis(subscriptionsByToken.get(makeEntitySensorToken(source, null)), Collections.emptySet())); - subscriptions.addAll(elvis(subscriptionsByToken.get(makeEntitySensorToken(null, null)), Collections.emptySet())); - return subscriptions; - } - - /** - * Unsubscribe the given subscription id. - * - * @see #subscribe(Map, Entity, Sensor, SensorEventListener) - */ - @SuppressWarnings("rawtypes") - public synchronized boolean unsubscribe(SubscriptionHandle sh) { - if (!(sh instanceof Subscription)) throw new IllegalArgumentException("Only subscription handles of type Subscription supported: sh="+sh+"; type="+(sh != null ? sh.getClass().getCanonicalName() : null)); - Subscription s = (Subscription) sh; - boolean result = allSubscriptions.remove(s.id) != null; - boolean b2 = removeFromMapOfCollections(subscriptionsByToken, makeEntitySensorToken(s.producer, s.sensor), s); - assert result==b2; - if (s.subscriber!=null) { - boolean b3 = removeFromMapOfCollections(subscriptionsBySubscriber, s.subscriber, s); - assert b3 == b2; - } - - // FIXME ALEX - this seems wrong - ((BasicExecutionManager) em).setTaskSchedulerForTag(s.subscriberExecutionManagerTag, SingleThreadedScheduler.class); - return result; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public <T> void publish(final SensorEvent<T> event) { - // REVIEW 1459 - execution - - // delivery in parallel/background, using execution manager - - // subscriptions, should define SingleThreadedScheduler for any subscriber ID tag - // in order to ensure callbacks are invoked in the order they are submitted - // (recommend exactly one per subscription to prevent deadlock) - // this is done with: - // em.setTaskSchedulerForTag(subscriberId, SingleThreadedScheduler.class); - - //note, generating the notifications must be done in the calling thread to preserve order - //e.g. emit(A); emit(B); should cause onEvent(A); onEvent(B) in that order - if (LOG.isTraceEnabled()) LOG.trace("{} got event {}", this, event); - totalEventsPublishedCount.incrementAndGet(); - - Set<Subscription> subs = (Set<Subscription>) ((Set<?>) getSubscriptionsForEntitySensor(event.getSource(), event.getSensor())); - if (groovyTruth(subs)) { - if (LOG.isTraceEnabled()) LOG.trace("sending {}, {} to {}", new Object[] {event.getSensor().getName(), event, join(subs, ",")}); - for (Subscription s : subs) { - if (s.eventFilter!=null && !s.eventFilter.apply(event)) - continue; - final Subscription sAtClosureCreation = s; - -// Set<Object> tags = MutableSet.of(); -// if (s.subscriberExecutionManagerTag!=null) tags.add(s.subscriberExecutionManagerTag); -// if (event.getSource()!=null) tags.add(BrooklynTaskTags.tagForContextEntity(event.getSource())); -// Map<String, Object> tagsMap = mapOf("tags", (Object)tags); - // use code above, instead of line below, if we want subscription deliveries associated with the entity; - // that will cause them to be cancelled when the entity is unmanaged - // (not sure that is useful, and likely NOT worth the expense, but it might be...) -Alex Oct 2014 - Map<String, Object> tagsMap = mapOf("tag", s.subscriberExecutionManagerTag); - - em.submit(tagsMap, new Runnable() { - @Override - public String toString() { - return "LSM.publish("+event+")"; - } - public void run() { - try { - sAtClosureCreation.listener.onEvent(event); - } catch (Throwable t) { - if (event!=null && event.getSource()!=null && Entities.isNoLongerManaged(event.getSource())) { - LOG.debug("Error processing subscriptions to "+this+", after entity unmanaged: "+t, t); - } else { - LOG.warn("Error processing subscriptions to "+this+": "+t, t); - } - } - }}); - totalEventsDeliveredCount.incrementAndGet(); - } - } - } - - @Override - public String toString() { - return tostring; - } - - /** - * Copied from LanguageUtils.groovy, to remove dependency. - * - * Adds the given value to a collection in the map under the key. - * - * A collection (as {@link LinkedHashMap}) will be created if necessary, - * synchronized on map for map access/change and set for addition there - * - * @return the updated set (instance, not copy) - * - * @deprecated since 0.5; use {@link HashMultimap}, and {@link Multimaps#synchronizedSetMultimap(com.google.common.collect.SetMultimap)} - */ - @Deprecated - private static <K,V> Set<V> addToMapOfSets(Map<K,Set<V>> map, K key, V valueInCollection) { - Set<V> coll; - synchronized (map) { - coll = map.get(key); - if (coll==null) { - coll = new LinkedHashSet<V>(); - map.put(key, coll); - } - if (coll.isEmpty()) { - synchronized (coll) { - coll.add(valueInCollection); - } - //if collection was empty then add to the collection while holding the map lock, to prevent removal - return coll; - } - } - synchronized (coll) { - if (!coll.isEmpty()) { - coll.add(valueInCollection); - return coll; - } - } - //if was empty, recurse, because someone else might be removing the collection - return addToMapOfSets(map, key, valueInCollection); - } - - /** - * Copied from LanguageUtils.groovy, to remove dependency. - * - * Removes the given value from a collection in the map under the key. - * - * @return the updated set (instance, not copy) - * - * @deprecated since 0.5; use {@link ArrayListMultimap} or {@link HashMultimap}, and {@link Multimaps#synchronizedListMultimap(com.google.common.collect.ListMultimap)} etc - */ - @Deprecated - private static <K,V> boolean removeFromMapOfCollections(Map<K,? extends Collection<V>> map, K key, V valueInCollection) { - Collection<V> coll; - synchronized (map) { - coll = map.get(key); - if (coll==null) return false; - } - boolean result; - synchronized (coll) { - result = coll.remove(valueInCollection); - } - if (coll.isEmpty()) { - synchronized (map) { - synchronized (coll) { - if (coll.isEmpty()) { - //only remove from the map if no one is adding to the collection or to the map, and the collection is still in the map - if (map.get(key)==coll) { - map.remove(key); - } - } - } - } - } - return result; - } -}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java b/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java deleted file mode 100644 index 6da41c8..0000000 --- a/core/src/main/java/brooklyn/management/internal/LocalUsageManager.java +++ /dev/null @@ -1,430 +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.io.Closeable; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.brooklyn.api.entity.Application; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.management.entitlement.EntitlementContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.EntityInternal; -import brooklyn.entity.basic.Lifecycle; -import brooklyn.internal.storage.BrooklynStorage; - -import org.apache.brooklyn.location.basic.AbstractLocation; -import org.apache.brooklyn.location.basic.LocationConfigKeys; -import org.apache.brooklyn.location.basic.LocationInternal; - -import brooklyn.management.ManagementContextInjectable; -import brooklyn.management.entitlement.Entitlements; -import brooklyn.management.usage.ApplicationUsage; -import brooklyn.management.usage.LocationUsage; -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.flags.TypeCoercions; -import brooklyn.util.javalang.Reflections; -import brooklyn.util.time.Duration; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; -import com.google.common.util.concurrent.ThreadFactoryBuilder; - -public class LocalUsageManager implements UsageManager { - - // TODO Threading model needs revisited. - // Synchronizes on updates to storage; but if two Brooklyn nodes were both writing to the same - // ApplicationUsage or LocationUsage record there'd be a race. That currently won't happen - // (at least for ApplicationUsage?) because the app is mastered in just one node at a time, - // and because location events are just manage/unmanage which should be happening in just - // one place at a time for a given location. - - private static final Logger log = LoggerFactory.getLogger(LocalUsageManager.class); - - private static class ApplicationMetadataImpl implements brooklyn.management.internal.UsageListener.ApplicationMetadata { - private final Application app; - private String applicationId; - private String applicationName; - private String entityType; - private String catalogItemId; - private Map<String, String> metadata; - - ApplicationMetadataImpl(Application app) { - this.app = checkNotNull(app, "app"); - applicationId = app.getId(); - applicationName = app.getDisplayName(); - entityType = app.getEntityType().getName(); - catalogItemId = app.getCatalogItemId(); - metadata = ((EntityInternal)app).toMetadataRecord(); - } - @Override public Application getApplication() { - return app; - } - @Override public String getApplicationId() { - return applicationId; - } - @Override public String getApplicationName() { - return applicationName; - } - @Override public String getEntityType() { - return entityType; - } - @Override public String getCatalogItemId() { - return catalogItemId; - } - @Override public Map<String, String> getMetadata() { - return metadata; - } - } - - private static class LocationMetadataImpl implements brooklyn.management.internal.UsageListener.LocationMetadata { - private final Location loc; - private String locationId; - private Map<String, String> metadata; - - LocationMetadataImpl(Location loc) { - this.loc = checkNotNull(loc, "loc"); - locationId = loc.getId(); - metadata = ((LocationInternal)loc).toMetadataRecord(); - } - @Override public Location getLocation() { - return loc; - } - @Override public String getLocationId() { - return locationId; - } - @Override public Map<String, String> getMetadata() { - return metadata; - } - } - - // Register a coercion from String->UsageListener, so that USAGE_LISTENERS defined in brooklyn.properties - // will be instantiated, given their class names. - static { - TypeCoercions.registerAdapter(String.class, brooklyn.management.internal.UsageListener.class, new Function<String, brooklyn.management.internal.UsageListener>() { - @Override public brooklyn.management.internal.UsageListener apply(String input) { - // TODO Want to use classLoader = mgmt.getCatalog().getRootClassLoader(); - ClassLoader classLoader = LocalUsageManager.class.getClassLoader(); - Optional<Object> result = Reflections.invokeConstructorWithArgs(classLoader, input); - if (result.isPresent()) { - if (result.get() instanceof brooklyn.management.internal.UsageManager.UsageListener) { - return new brooklyn.management.internal.UsageManager.UsageListener.UsageListenerAdapter((brooklyn.management.internal.UsageManager.UsageListener) result.get()); - } else { - return (brooklyn.management.internal.UsageListener) result.get(); - } - } else { - throw new IllegalStateException("Failed to create UsageListener from class name '"+input+"' using no-arg constructor"); - } - } - }); - } - - @VisibleForTesting - public static final String APPLICATION_USAGE_KEY = "usage-application"; - - @VisibleForTesting - public static final String LOCATION_USAGE_KEY = "usage-location"; - - private final LocalManagementContext managementContext; - - private final Object mutex = new Object(); - - private final List<brooklyn.management.internal.UsageListener> listeners = Lists.newCopyOnWriteArrayList(); - - private final AtomicInteger listenerQueueSize = new AtomicInteger(); - - private ListeningExecutorService listenerExecutor = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor(new ThreadFactoryBuilder() - .setNameFormat("brooklyn-usagemanager-listener-%d") - .build())); - - public LocalUsageManager(LocalManagementContext managementContext) { - this.managementContext = checkNotNull(managementContext, "managementContext"); - - // TODO Once brooklyn.management.internal.UsageManager.UsageListener is deleted, restore this - // to normal generics! - Collection<?> listeners = managementContext.getBrooklynProperties().getConfig(UsageManager.USAGE_LISTENERS); - if (listeners != null) { - for (Object listener : listeners) { - if (listener instanceof ManagementContextInjectable) { - ((ManagementContextInjectable)listener).injectManagementContext(managementContext); - } - if (listener instanceof brooklyn.management.internal.UsageManager.UsageListener) { - addUsageListener((brooklyn.management.internal.UsageManager.UsageListener)listener); - } else if (listener instanceof brooklyn.management.internal.UsageListener) { - addUsageListener((brooklyn.management.internal.UsageListener)listener); - } else if (listener == null) { - throw new NullPointerException("null listener in config "+UsageManager.USAGE_LISTENERS); - } else { - throw new ClassCastException("listener "+listener+" of type "+listener.getClass()+" is not of type "+brooklyn.management.internal.UsageListener.class.getName()); - } - } - } - } - - public void terminate() { - // Wait for the listeners to finish + close the listeners - Duration timeout = managementContext.getBrooklynProperties().getConfig(UsageManager.USAGE_LISTENER_TERMINATION_TIMEOUT); - if (listenerQueueSize.get() > 0) { - log.info("Usage manager waiting for "+listenerQueueSize+" listener events for up to "+timeout); - } - List<ListenableFuture<?>> futures = Lists.newArrayList(); - for (final brooklyn.management.internal.UsageListener listener : listeners) { - ListenableFuture<?> future = listenerExecutor.submit(new Runnable() { - public void run() { - if (listener instanceof Closeable) { - try { - ((Closeable)listener).close(); - } catch (IOException e) { - log.warn("Problem closing usage listener "+listener+" (continuing)", e); - } - } - }}); - futures.add(future); - } - try { - Futures.successfulAsList(futures).get(timeout.toMilliseconds(), TimeUnit.MILLISECONDS); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - log.warn("Problem terminiating usage listeners (continuing)", e); - } finally { - listenerExecutor.shutdownNow(); - } - } - - private void execOnListeners(final Function<brooklyn.management.internal.UsageListener, Void> job) { - for (final brooklyn.management.internal.UsageListener listener : listeners) { - listenerQueueSize.incrementAndGet(); - listenerExecutor.execute(new Runnable() { - public void run() { - try { - job.apply(listener); - } catch (RuntimeException e) { - log.error("Problem notifying listener "+listener+" of "+job, e); - Exceptions.propagateIfFatal(e); - } finally { - listenerQueueSize.decrementAndGet(); - } - }}); - } - } - - @Override - public void recordApplicationEvent(final Application app, final Lifecycle state) { - log.debug("Storing application lifecycle usage event: application {} in state {}", new Object[] {app, state}); - ConcurrentMap<String, ApplicationUsage> eventMap = managementContext.getStorage().getMap(APPLICATION_USAGE_KEY); - synchronized (mutex) { - ApplicationUsage usage = eventMap.get(app.getId()); - if (usage == null) { - usage = new ApplicationUsage(app.getId(), app.getDisplayName(), app.getEntityType().getName(), ((EntityInternal)app).toMetadataRecord()); - } - final ApplicationUsage.ApplicationEvent event = new ApplicationUsage.ApplicationEvent(state, getUser()); - usage.addEvent(event); - eventMap.put(app.getId(), usage); - - execOnListeners(new Function<brooklyn.management.internal.UsageListener, Void>() { - public Void apply(brooklyn.management.internal.UsageListener listener) { - listener.onApplicationEvent(new ApplicationMetadataImpl(Entities.proxy(app)), event); - return null; - } - public String toString() { - return "applicationEvent("+app+", "+state+")"; - }}); - } - } - - /** - * Adds this location event to the usage record for the given location (creating the usage - * record if one does not already exist). - */ - @Override - public void recordLocationEvent(final Location loc, final Lifecycle state) { - // TODO This approach (i.e. recording events on manage/unmanage would not work for - // locations that are reused. For example, in a FixedListMachineProvisioningLocation - // the ssh machine location is returned to the pool and handed back out again. - // But maybe the solution there is to hand out different instances so that one user - // can't change the config of the SshMachineLocation to subsequently affect the next - // user. - // - // TODO Should perhaps extract the location storage methods into their own class, - // but no strong enough feelings yet... - - checkNotNull(loc, "location"); - if (loc.getConfig(AbstractLocation.TEMPORARY_LOCATION)) { - log.info("Ignoring location lifecycle usage event for {} (state {}), because location is a temporary location", loc, state); - return; - } - checkNotNull(state, "state of location %s", loc); - if (loc.getId() == null) { - log.error("Ignoring location lifecycle usage event for {} (state {}), because location has no id", loc, state); - return; - } - if (managementContext.getStorage() == null) { - log.warn("Cannot store location lifecycle usage event for {} (state {}), because storage not available", loc, state); - return; - } - - Object callerContext = loc.getConfig(LocationConfigKeys.CALLER_CONTEXT); - - if (callerContext != null && callerContext instanceof Entity) { - log.debug("Storing location lifecycle usage event: location {} in state {}; caller context {}", new Object[] {loc, state, callerContext}); - - Entity caller = (Entity) callerContext; - String entityTypeName = caller.getEntityType().getName(); - String appId = caller.getApplicationId(); - - final LocationUsage.LocationEvent event = new LocationUsage.LocationEvent(state, caller.getId(), entityTypeName, appId, getUser()); - - ConcurrentMap<String, LocationUsage> usageMap = managementContext.getStorage().<String, LocationUsage>getMap(LOCATION_USAGE_KEY); - synchronized (mutex) { - LocationUsage usage = usageMap.get(loc.getId()); - if (usage == null) { - usage = new LocationUsage(loc.getId(), ((LocationInternal)loc).toMetadataRecord()); - } - usage.addEvent(event); - usageMap.put(loc.getId(), usage); - - execOnListeners(new Function<brooklyn.management.internal.UsageListener, Void>() { - public Void apply(brooklyn.management.internal.UsageListener listener) { - listener.onLocationEvent(new LocationMetadataImpl(loc), event); - return null; - } - public String toString() { - return "locationEvent("+loc+", "+state+")"; - }}); - } - } else { - // normal for high-level locations - log.trace("Not recording location lifecycle usage event for {} in state {}, because no caller context", new Object[] {loc, state}); - } - } - - /** - * Returns the usage info for the location with the given id, or null if unknown. - */ - @Override - public LocationUsage getLocationUsage(String locationId) { - BrooklynStorage storage = managementContext.getStorage(); - - Map<String, LocationUsage> usageMap = storage.getMap(LOCATION_USAGE_KEY); - return usageMap.get(locationId); - } - - /** - * Returns the usage info that matches the given predicate. - * For example, could be used to find locations used within a given time period. - */ - @Override - public Set<LocationUsage> getLocationUsage(Predicate<? super LocationUsage> filter) { - // TODO could do more efficient indexing, to more easily find locations in use during a given period. - // But this is good enough for first-pass. - - Map<String, LocationUsage> usageMap = managementContext.getStorage().getMap(LOCATION_USAGE_KEY); - Set<LocationUsage> result = Sets.newLinkedHashSet(); - - for (LocationUsage usage : usageMap.values()) { - if (filter.apply(usage)) { - result.add(usage); - } - } - return result; - } - - /** - * Returns the usage info for the location with the given id, or null if unknown. - */ - @Override - public ApplicationUsage getApplicationUsage(String appId) { - BrooklynStorage storage = managementContext.getStorage(); - - Map<String, ApplicationUsage> usageMap = storage.getMap(APPLICATION_USAGE_KEY); - return usageMap.get(appId); - } - - /** - * Returns the usage info that matches the given predicate. - * For example, could be used to find applications used within a given time period. - */ - @Override - public Set<ApplicationUsage> getApplicationUsage(Predicate<? super ApplicationUsage> filter) { - // TODO could do more efficient indexing, to more easily find locations in use during a given period. - // But this is good enough for first-pass. - - Map<String, ApplicationUsage> usageMap = managementContext.getStorage().getMap(APPLICATION_USAGE_KEY); - Set<ApplicationUsage> result = Sets.newLinkedHashSet(); - - for (ApplicationUsage usage : usageMap.values()) { - if (filter.apply(usage)) { - result.add(usage); - } - } - return result; - } - - @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) { - listeners.add(listener); - } - - @Override - public void removeUsageListener(brooklyn.management.internal.UsageListener listener) { - listeners.remove(listener); - } - - private String getUser() { - EntitlementContext entitlementContext = Entitlements.getEntitlementContext(); - if (entitlementContext != null) { - return entitlementContext.user(); - } - return null; - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/LocationManagerInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/LocationManagerInternal.java b/core/src/main/java/brooklyn/management/internal/LocationManagerInternal.java deleted file mode 100644 index 17ecd5a..0000000 --- a/core/src/main/java/brooklyn/management/internal/LocationManagerInternal.java +++ /dev/null @@ -1,28 +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 org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.management.LocationManager; - -public interface LocationManagerInternal extends LocationManager, BrooklynObjectManagerInternal<Location> { - - public Iterable<String> getLocationIds(); - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java b/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java deleted file mode 100644 index b21f73f..0000000 --- a/core/src/main/java/brooklyn/management/internal/ManagementContextInternal.java +++ /dev/null @@ -1,122 +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.net.URI; -import java.net.URL; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; - -import org.apache.brooklyn.api.entity.Effector; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.management.ManagementContext; -import org.apache.brooklyn.api.management.Task; - -import brooklyn.catalog.internal.CatalogInitialization; -import brooklyn.config.BrooklynProperties; -import brooklyn.entity.basic.BrooklynTaskTags; -import brooklyn.entity.proxying.InternalEntityFactory; -import brooklyn.entity.proxying.InternalLocationFactory; -import brooklyn.entity.proxying.InternalPolicyFactory; -import brooklyn.internal.storage.BrooklynStorage; -import brooklyn.management.ha.OsgiManager; -import brooklyn.util.guava.Maybe; -import brooklyn.util.task.TaskTags; - -import com.google.common.annotations.Beta; - -public interface ManagementContextInternal extends ManagementContext { - - public static final String SUB_TASK_TAG = TaskTags.SUB_TASK_TAG; - - public static final String EFFECTOR_TAG = BrooklynTaskTags.EFFECTOR_TAG; - public static final String NON_TRANSIENT_TASK_TAG = BrooklynTaskTags.NON_TRANSIENT_TASK_TAG; - public static final String TRANSIENT_TASK_TAG = BrooklynTaskTags.TRANSIENT_TASK_TAG; - - public static final String EMPTY_CATALOG_URL = "classpath://brooklyn/empty.catalog.bom"; - - ClassLoader getBaseClassLoader(); - - Iterable<URL> getBaseClassPathForScanning(); - - void setBaseClassPathForScanning(Iterable<URL> urls); - - void setManagementNodeUri(URI uri); - - void addEntitySetListener(CollectionChangeListener<Entity> listener); - - void removeEntitySetListener(CollectionChangeListener<Entity> listener); - - void terminate(); - - long getTotalEffectorInvocations(); - - <T> T invokeEffectorMethodSync(final Entity entity, final Effector<T> eff, final Object args) throws ExecutionException; - - <T> Task<T> invokeEffector(final Entity entity, final Effector<T> eff, @SuppressWarnings("rawtypes") final Map parameters); - - BrooklynStorage getStorage(); - - BrooklynProperties getBrooklynProperties(); - - AccessManager getAccessManager(); - - UsageManager getUsageManager(); - - /** - * @return The OSGi manager, if available; may be absent if OSGi is not supported, - * e.g. in test contexts (but will be supported in all major contexts). - */ - Maybe<OsgiManager> getOsgiManager(); - - InternalEntityFactory getEntityFactory(); - - InternalLocationFactory getLocationFactory(); - - InternalPolicyFactory getPolicyFactory(); - - /** - * Registers an entity that has been created, but that has not yet begun to be managed. - * <p> - * This differs from the idea of "preManaged" where the entities are in the process of being - * managed, but where management is not yet complete. - */ - // TODO would benefit from better naming! The name has percolated up from LocalEntityManager. - // should we just rename here as register or preManage? - void prePreManage(Entity entity); - - /** - * Registers a location that has been created, but that has not yet begun to be managed. - */ - void prePreManage(Location location); - - /** Object which allows adding, removing, and clearing errors. - * TODO In future this will change to a custom interface with a unique identifier for each error. */ - @Beta - List<Throwable> errors(); - - @Beta - CatalogInitialization getCatalogInitialization(); - - @Beta - void setCatalogInitialization(CatalogInitialization catalogInitialization); - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java b/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java deleted file mode 100644 index c16ff8e..0000000 --- a/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java +++ /dev/null @@ -1,48 +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 org.apache.brooklyn.api.management.ManagementContext; - -/** Stores a management transition mode, and the management context. */ -// TODO does this class really pull its weight? -public class ManagementTransitionInfo { - - final ManagementContext mgmtContext; - final ManagementTransitionMode mode; - - public ManagementTransitionInfo(ManagementContext mgmtContext, ManagementTransitionMode mode) { - this.mgmtContext = mgmtContext; - this.mode = mode; - } - - - public ManagementContext getManagementContext() { - return mgmtContext; - } - - public ManagementTransitionMode getMode() { - return mode; - } - - @Override - public String toString() { - return super.toString()+"["+mgmtContext+";"+mode+"]"; - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/ManagementTransitionMode.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/ManagementTransitionMode.java b/core/src/main/java/brooklyn/management/internal/ManagementTransitionMode.java deleted file mode 100644 index 1d25902..0000000 --- a/core/src/main/java/brooklyn/management/internal/ManagementTransitionMode.java +++ /dev/null @@ -1,127 +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 org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Preconditions; - -/** - * Records details of a management transition, specifically the {@link BrooklynObjectManagementMode} before and after, - * and allows easy checking of various aspects of that. - * <p> - * This helps make code readable and keep correct logic if we expand/change the management modes. - */ -public class ManagementTransitionMode { - - private static final Logger log = LoggerFactory.getLogger(ManagementTransitionMode.class); - - private final BrooklynObjectManagementMode modeBefore, modeAfter; - - private ManagementTransitionMode(BrooklynObjectManagementMode modeBefore, BrooklynObjectManagementMode modeAfter) { - this.modeBefore = modeBefore; - this.modeAfter = modeAfter; - } - - public static ManagementTransitionMode transitioning(BrooklynObjectManagementMode modeBefore, BrooklynObjectManagementMode modeAfter) { - return new ManagementTransitionMode(Preconditions.checkNotNull(modeBefore, "modeBefore"), Preconditions.checkNotNull(modeAfter, "modeAfter")); - } - - @Deprecated /** @deprecated marking places where we aren't sure */ - public static ManagementTransitionMode guessing(BrooklynObjectManagementMode modeBefore, BrooklynObjectManagementMode modeAfter) { - return transitioning(modeBefore, modeAfter); - } - - /** @return the mode this object was previously managed as */ - public BrooklynObjectManagementMode getModeBefore() { - return modeBefore; - } - - /** @return the mode this object is now being managed as */ - public BrooklynObjectManagementMode getModeAfter() { - return modeAfter; - } - - /** This management node was previously not loaded here, - * either it did not exist (and is just being created) or it was in persisted state but - * not loaded at this node. */ - public boolean wasNotLoaded() { - return getModeBefore()==BrooklynObjectManagementMode.NONEXISTENT || getModeBefore()==BrooklynObjectManagementMode.UNMANAGED_PERSISTED; - } - - /** This management node is now not going to be loaded here, either it is being destroyed - * (not known anywhere, not even persisted) or simply forgotten here */ - public boolean isNoLongerLoaded() { - return getModeAfter()==BrooklynObjectManagementMode.NONEXISTENT || getModeAfter()==BrooklynObjectManagementMode.UNMANAGED_PERSISTED; - } - - /** This management node was the master for the given object */ - public boolean wasPrimary() { - return getModeBefore()==BrooklynObjectManagementMode.MANAGED_PRIMARY; - } - - /** This management node is now the master for the given object */ - public boolean isPrimary() { - return getModeAfter()==BrooklynObjectManagementMode.MANAGED_PRIMARY; - } - - /** Object was previously loaded as read-only at this management node; - * active management was occurring elsewhere (or not at all) - */ - public boolean wasReadOnly() { - return getModeBefore()==BrooklynObjectManagementMode.LOADED_READ_ONLY; - } - - /** Object is now being loaded as read-only at this management node; - * expect active management to be occurring elsewhere - */ - public boolean isReadOnly() { - return getModeAfter()==BrooklynObjectManagementMode.LOADED_READ_ONLY; - } - - /** Object is being created: - * previously did not exist (not even in persisted state); - * implies that we are the active manager creating it, - * i.e. {@link #getModeAfter()} should indicate {@link BrooklynObjectManagementMode#MANAGED_PRIMARY}. - * (if we're read-only and the manager has just created it, - * {@link #getModeBefore()} should indicate {@link BrooklynObjectManagementMode#UNMANAGED_PERSISTED}) - */ - public boolean isCreating() { - if (getModeBefore()!=BrooklynObjectManagementMode.NONEXISTENT) - return false; - - if (getModeAfter()==BrooklynObjectManagementMode.LOADED_READ_ONLY) { - log.warn("isCreating set on RO object; highly irregular!"); - } - return true; - } - - /** Object is being destroyed: - * either destroyed elsewhere and we're catching up (in read-only mode), - * or we've been the active manager and are destroying it */ - public boolean isDestroying() { - return getModeAfter()==BrooklynObjectManagementMode.NONEXISTENT; - } - - @Override - public String toString() { - return ManagementTransitionMode.class.getSimpleName()+"["+getModeBefore()+"->"+getModeAfter()+"]"; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/main/java/brooklyn/management/internal/NonDeploymentAccessManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentAccessManager.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentAccessManager.java deleted file mode 100644 index 4cc6bba..0000000 --- a/core/src/main/java/brooklyn/management/internal/NonDeploymentAccessManager.java +++ /dev/null @@ -1,98 +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 org.apache.brooklyn.api.management.AccessController; - - -public class NonDeploymentAccessManager implements AccessManager { - - private final ManagementContextInternal initialManagementContext; - - public NonDeploymentAccessManager(ManagementContextInternal initialManagementContext) { - this.initialManagementContext = initialManagementContext; - } - - private boolean isInitialManagementContextReal() { - return (initialManagementContext != null && !(initialManagementContext instanceof NonDeploymentManagementContext)); - } - - @Override - public AccessController getAccessController() { - if (isInitialManagementContextReal()) { - return initialManagementContext.getAccessManager().getAccessController(); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public boolean isLocationProvisioningAllowed() { - if (isInitialManagementContextReal()) { - return initialManagementContext.getAccessManager().isLocationProvisioningAllowed(); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public boolean isLocationManagementAllowed() { - if (isInitialManagementContextReal()) { - return initialManagementContext.getAccessManager().isLocationManagementAllowed(); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public boolean isEntityManagementAllowed() { - if (isInitialManagementContextReal()) { - return initialManagementContext.getAccessManager().isEntityManagementAllowed(); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public void setLocationProvisioningAllowed(boolean allowed) { - if (isInitialManagementContextReal()) { - initialManagementContext.getAccessManager().setLocationProvisioningAllowed(allowed); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public void setLocationManagementAllowed(boolean allowed) { - if (isInitialManagementContextReal()) { - initialManagementContext.getAccessManager().setLocationManagementAllowed(allowed); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public void setEntityManagementAllowed(boolean allowed) { - if (isInitialManagementContextReal()) { - initialManagementContext.getAccessManager().setEntityManagementAllowed(allowed); - } 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/NonDeploymentEntityManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentEntityManager.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentEntityManager.java deleted file mode 100644 index 8b85975..0000000 --- a/core/src/main/java/brooklyn/management/internal/NonDeploymentEntityManager.java +++ /dev/null @@ -1,196 +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 java.util.Collections; -import java.util.Map; - -import org.apache.brooklyn.api.entity.Application; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.proxying.EntitySpec; -import org.apache.brooklyn.api.entity.proxying.EntityTypeRegistry; -import org.apache.brooklyn.api.management.ManagementContext; -import org.apache.brooklyn.api.policy.Enricher; -import org.apache.brooklyn.api.policy.EnricherSpec; -import org.apache.brooklyn.api.policy.Policy; -import org.apache.brooklyn.api.policy.PolicySpec; - -import com.google.common.base.Predicate; - -public class NonDeploymentEntityManager implements EntityManagerInternal { - - private final ManagementContext initialManagementContext; - - public NonDeploymentEntityManager(ManagementContext initialManagementContext) { - this.initialManagementContext = initialManagementContext; - } - - @Override - public EntityTypeRegistry getEntityTypeRegistry() { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().getEntityTypeRegistry(); - } else { - throw new IllegalStateException("Non-deployment context "+this+" (with no initial management context supplied) is not valid for this operation."); - } - } - - @Override - public <T extends Entity> T createEntity(EntitySpec<T> spec) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().createEntity(spec); - } else { - throw new IllegalStateException("Non-deployment context "+this+" (with no initial management context supplied) is not valid for this operation."); - } - } - - @Override - public <T extends Entity> T createEntity(Map<?,?> config, Class<T> type) { - return createEntity(EntitySpec.create(type).configure(config)); - } - - @Override - public <T extends Policy> T createPolicy(PolicySpec<T> spec) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().createPolicy(spec); - } else { - throw new IllegalStateException("Non-deployment context "+this+" (with no initial management context supplied) is not valid for this operation."); - } - } - - @Override - public <T extends Enricher> T createEnricher(EnricherSpec<T> spec) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().createEnricher(spec); - } else { - throw new IllegalStateException("Non-deployment context "+this+" (with no initial management context supplied) is not valid for this operation."); - } - } - - @Override - public Collection<Entity> getEntities() { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().getEntities(); - } else { - return Collections.emptyList(); - } - } - - @Override - public Collection<Entity> getEntitiesInApplication(Application application) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().getEntitiesInApplication(application); - } else { - return Collections.emptyList(); - } - } - - @Override - public Collection<Entity> findEntities(Predicate<? super Entity> filter) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().findEntities(filter); - } else { - return Collections.emptyList(); - } - } - - @Override - public Collection<Entity> findEntitiesInApplication(Application application, Predicate<? super Entity> filter) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().findEntitiesInApplication(application, filter); - } else { - return Collections.emptyList(); - } - } - - @Override - public Entity getEntity(String id) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getEntityManager().getEntity(id); - } else { - return null; - } - } - - @Override - public Iterable<String> getEntityIds() { - if (isInitialManagementContextReal()) { - return ((EntityManagerInternal)initialManagementContext.getEntityManager()).getEntityIds(); - } else { - return Collections.emptyList(); - } - } - - @Override - public ManagementTransitionMode getLastManagementTransitionMode(String itemId) { - if (isInitialManagementContextReal()) { - return ((EntityManagerInternal)initialManagementContext.getEntityManager()).getLastManagementTransitionMode(itemId); - } else { - return null; - } - } - - @Override - public void setManagementTransitionMode(Entity item, ManagementTransitionMode mode) { - if (isInitialManagementContextReal()) { - ((EntityManagerInternal)initialManagementContext.getEntityManager()).setManagementTransitionMode(item, mode); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public boolean isManaged(Entity entity) { - return false; - } - - @Override - public void manage(Entity e) { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot manage "+e); - } - - @Override - public void unmanage(Entity e, ManagementTransitionMode info) { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - - @Override - public void manageRebindedRoot(Entity item) { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - - @Override - public void unmanage(Entity e) { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot unmanage "+e); - } - - private boolean isInitialManagementContextReal() { - return (initialManagementContext != null && !(initialManagementContext instanceof NonDeploymentManagementContext)); - } - - @Override - public Iterable<Entity> getAllEntitiesInApplication(Application application) { - if (isInitialManagementContextReal()) { - return ((EntityManagerInternal)initialManagementContext.getEntityManager()).getAllEntitiesInApplication(application); - } else { - throw new IllegalStateException("Non-deployment context "+this+" (with no initial management context supplied) 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/NonDeploymentLocationManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentLocationManager.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentLocationManager.java deleted file mode 100644 index 5d68db6..0000000 --- a/core/src/main/java/brooklyn/management/internal/NonDeploymentLocationManager.java +++ /dev/null @@ -1,146 +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 java.util.Collections; -import java.util.Map; - -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.api.management.ManagementContext; - -public class NonDeploymentLocationManager implements LocationManagerInternal { - - private final ManagementContext initialManagementContext; - - public NonDeploymentLocationManager(ManagementContext initialManagementContext) { - this.initialManagementContext = initialManagementContext; - } - - @Override - public <T extends Location> T createLocation(LocationSpec<T> spec) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getLocationManager().createLocation(spec); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot create "+spec); - } - } - - @Override - public <T extends Location> T createLocation(Map<?, ?> config, Class<T> type) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getLocationManager().createLocation(config, type); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot create "+type); - } - } - - @Override - public Collection<Location> getLocations() { - if (isInitialManagementContextReal()) { - return initialManagementContext.getLocationManager().getLocations(); - } else { - return Collections.emptyList(); - } - } - - @Override - public Location getLocation(String id) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getLocationManager().getLocation(id); - } else { - return null; - } - } - - @Override - public Iterable<String> getLocationIds() { - if (isInitialManagementContextReal()) { - return ((LocationManagerInternal)initialManagementContext.getLocationManager()).getLocationIds(); - } else { - return Collections.emptyList(); - } - } - - @Override - public boolean isManaged(Location loc) { - return false; - } - - @Override - public void manageRebindedRoot(Location loc) { - if (isInitialManagementContextReal()) { - ((LocationManagerInternal)initialManagementContext.getLocationManager()).manageRebindedRoot(loc); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot manage "+loc); - } - } - - @Override - @Deprecated - public Location manage(Location loc) { - if (isInitialManagementContextReal()) { - return initialManagementContext.getLocationManager().manage(loc); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot manage "+loc); - } - } - - - @Override - public ManagementTransitionMode getLastManagementTransitionMode(String itemId) { - if (isInitialManagementContextReal()) { - return ((LocationManagerInternal)initialManagementContext.getLocationManager()).getLastManagementTransitionMode(itemId); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public void setManagementTransitionMode(Location item, ManagementTransitionMode mode) { - if (isInitialManagementContextReal()) { - ((LocationManagerInternal)initialManagementContext.getLocationManager()).setManagementTransitionMode(item, mode); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public void unmanage(Location item, ManagementTransitionMode info) { - if (isInitialManagementContextReal()) { - ((LocationManagerInternal)initialManagementContext.getLocationManager()).unmanage(item, info); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation"); - } - } - - @Override - public void unmanage(Location loc) { - if (isInitialManagementContextReal()) { - initialManagementContext.getLocationManager().unmanage(loc); - } else { - throw new IllegalStateException("Non-deployment context "+this+" is not valid for this operation: cannot unmanage "+loc); - } - } - - private boolean isInitialManagementContextReal() { - return (initialManagementContext != null && !(initialManagementContext instanceof NonDeploymentManagementContext)); - } -}
