You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:51:00 UTC
[18/51] [abbrv] [partial] brooklyn-server git commit: move subdir
from incubator up a level as it is promoted to its own repo (first
non-incubator commit!)
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Attributes.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Attributes.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Attributes.java
deleted file mode 100644
index 80ed765..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Attributes.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.entity;
-
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.api.sensor.Sensor;
-import org.apache.brooklyn.core.config.render.RendererHints;
-import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
-import org.apache.brooklyn.core.sensor.BasicAttributeSensorAndConfigKey;
-import org.apache.brooklyn.core.sensor.BasicNotificationSensor;
-import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
-import org.apache.brooklyn.core.sensor.Sensors;
-import org.apache.brooklyn.util.net.UserAndHostAndPort;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.common.reflect.TypeToken;
-
-/**
- * This interface should be used to access {@link Sensor} definitions.
- */
-public interface Attributes {
-
- BasicNotificationSensor<Void> LOCATION_CHANGED = new BasicNotificationSensor<Void>(
- Void.class, "entity.locationChanged", "Indicates that an entity's location has been changed");
-
- // TODO these should switch to being TemplatedStringAttributeSensorAndConfigKey
- BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>(
- String.class, "download.url", "URL pattern for downloading the installer (will substitute things like ${version} automatically)");
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- BasicAttributeSensorAndConfigKey<Map<String,String>> DOWNLOAD_ADDON_URLS = new BasicAttributeSensorAndConfigKey(
- Map.class, "download.addon.urls", "URL patterns for downloading named add-ons (will substitute things like ${version} automatically)");
-
- /*
- * Port number attributes.
- */
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- AttributeSensor<List<Integer>> PORT_NUMBERS = new BasicAttributeSensor(
- List.class, "port.list", "List of port numbers");
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- AttributeSensor<List<Sensor<Integer>>> PORT_SENSORS = new BasicAttributeSensor(
- List.class, "port.list.sensors", "List of port number attributes");
-
- PortAttributeSensorAndConfigKey HTTP_PORT = new PortAttributeSensorAndConfigKey(
- "http.port", "HTTP port", ImmutableList.of(8080,"18080+"));
-
- PortAttributeSensorAndConfigKey HTTPS_PORT = new PortAttributeSensorAndConfigKey(
- "https.port", "HTTP port (with SSL/TLS)", ImmutableList.of(8443,"18443+"));
-
- PortAttributeSensorAndConfigKey SSH_PORT = new PortAttributeSensorAndConfigKey("ssh.port", "SSH port", 22);
- PortAttributeSensorAndConfigKey SMTP_PORT = new PortAttributeSensorAndConfigKey("smtp.port", "SMTP port", 25);
- PortAttributeSensorAndConfigKey DNS_PORT = new PortAttributeSensorAndConfigKey("dns.port", "DNS port", 53);
- PortAttributeSensorAndConfigKey AMQP_PORT = new PortAttributeSensorAndConfigKey("amqp.port", "AMQP port", "5672+");
-
- /*
- * Location/connection attributes.
- */
-
- AttributeSensor<String> HOSTNAME = Sensors.newStringSensor( "host.name", "Host name");
- AttributeSensor<String> ADDRESS = Sensors.newStringSensor( "host.address", "Host IP address");
- AttributeSensor<UserAndHostAndPort> SSH_ADDRESS = Sensors.newSensor(
- UserAndHostAndPort.class,
- "host.sshAddress",
- "user@host:port for ssh'ing (or null if inappropriate)");
- AttributeSensor<UserAndHostAndPort> WINRM_ADDRESS = Sensors.newSensor(
- UserAndHostAndPort.class,
- "host.winrmAddress",
- "user@host:port for WinRM'ing (or null if inappropriate)");
- AttributeSensor<String> SUBNET_HOSTNAME = Sensors.newStringSensor( "host.subnet.hostname", "Host name as known internally in " +
- "the subnet where it is running (if different to host.name)");
- AttributeSensor<String> SUBNET_ADDRESS = Sensors.newStringSensor( "host.subnet.address", "Host address as known internally in " +
- "the subnet where it is running (if different to host.name)");
-
- AttributeSensor<String> HOST_AND_PORT = Sensors.newStringSensor( "hostandport", "host:port" );
-
- /*
- * Lifecycle attributes
- */
- AttributeSensor<Boolean> SERVICE_UP = Sensors.newBooleanSensor("service.isUp",
- "Whether the service is active and availability (confirmed and monitored)");
-
- @SuppressWarnings("serial")
- AttributeSensor<Map<String,Object>> SERVICE_NOT_UP_INDICATORS = Sensors.newSensor(
- new TypeToken<Map<String,Object>>() {},
- "service.notUp.indicators",
- "A map of namespaced indicators that the service is not up");
-
- @SuppressWarnings("serial")
- AttributeSensor<Map<String,Object>> SERVICE_PROBLEMS = Sensors.newSensor(
- new TypeToken<Map<String,Object>>() {},
- "service.problems",
- "A map of namespaced indicators of problems with a service");
-
- /**
- * @since 0.8.0
- */
- @SuppressWarnings("serial")
- AttributeSensor<Map<String,Object>> SERVICE_NOT_UP_DIAGNOSTICS = Sensors.newSensor(
- new TypeToken<Map<String,Object>>() {},
- "service.notUp.diagnostics",
- "A map of namespaced diagnostics, from when the service is not up");
-
- AttributeSensor<Lifecycle> SERVICE_STATE_ACTUAL = Sensors.newSensor(Lifecycle.class,
- "service.state", "Actual lifecycle state of the service");
- AttributeSensor<Lifecycle.Transition> SERVICE_STATE_EXPECTED = Sensors.newSensor(Lifecycle.Transition.class,
- "service.state.expected", "Last controlled change to service state, indicating what the expected state should be");
-
- /** @deprecated since 0.7.0 use {@link #SERVICE_STATE_ACTUAL} or {@link #SERVICE_STATE_EXPECTED} as appropriate. */
- @Deprecated
- AttributeSensor<Lifecycle> SERVICE_STATE = SERVICE_STATE_ACTUAL;
-
- /*
- * Other metadata (optional)
- */
-
- AttributeSensor<Integer> PID = Sensors.newIntegerSensor("pid", "Process ID for the previously launched instance");
-
- AttributeSensor<String> LOG_FILE_LOCATION = Sensors.newStringSensor("log.location", "Log file location");
-
- AttributeSensor<URI> MAIN_URI = MainUri.MAIN_URI;
-
- // this class is added because the MAIN_URI relies on a static initialization which unfortunately can't be added to an interface.
- class MainUri {
- private final static AttributeSensor<URI> MAIN_URI = Sensors.newSensor(URI.class, "main.uri", "Main URI for contacting the service/endpoint offered by this entity");
-
- static {
- RendererHints.register(MAIN_URI, RendererHints.namedActionWithUrl());
- }
- }
-
- /*
- * Brooklyn management attributes (optional)
- */
-
- /**
- * Used by entities registering a {@link ManagementContext.PropertiesReloadListener} to store a persistent
- * reference to it, for use when unregistering the listener.
- */
- @Beta
- AttributeSensor<ManagementContext.PropertiesReloadListener> PROPERTIES_RELOAD_LISTENER = Sensors.newSensor(
- ManagementContext.PropertiesReloadListener.class,
- "brooklyn.management.propertiesReloadListener", "Properties reload listener");
-
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
deleted file mode 100644
index 974f88c..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/BrooklynConfigKeys.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.entity;
-
-import static org.apache.brooklyn.core.config.ConfigKeys.newBooleanConfigKey;
-import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKey;
-import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKeyWithPrefix;
-import static org.apache.brooklyn.core.config.ConfigKeys.newStringConfigKey;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.config.MapConfigKey;
-import org.apache.brooklyn.core.entity.trait.Startable;
-import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
-import org.apache.brooklyn.core.sensor.TemplatedStringAttributeSensorAndConfigKey;
-import org.apache.brooklyn.core.server.BrooklynServerConfig;
-import org.apache.brooklyn.location.ssh.SshMachineLocation;
-import org.apache.brooklyn.util.core.flags.SetFromFlag;
-import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
-import org.apache.brooklyn.util.core.internal.ssh.SshTool;
-import org.apache.brooklyn.util.time.Duration;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-
-/** Commonly used config keys, for use in entities. Similar to {@link Attributes}.
- * See also {@link BrooklynServerConfig} for config keys for controlling the server. */
-public class BrooklynConfigKeys {
-
- @Deprecated /** @deprecated since 0.7.0 see BrooklynServerConfig#getPeristenceDir() and BrooklynServerConfigKeys#PERSISTENCE_DIR */
- public static final ConfigKey<String> BROOKLYN_PERSISTENCE_DIR = BrooklynServerConfig.PERSISTENCE_DIR;
-
- @Deprecated /** @deprecated since 0.7.0 use BrooklynServerConfig routines */
- public static final ConfigKey<String> BROOKLYN_DATA_DIR = BrooklynServerConfig.BROOKLYN_DATA_DIR;
-
- public static final ConfigKey<String> ONBOX_BASE_DIR = newStringConfigKey("onbox.base.dir",
- "Default base directory on target machines where Brooklyn config data is stored; " +
- "default depends on the location, either ~/brooklyn-managed-processes or /tmp/brooklyn-${username} on localhost");
-
- public static final ConfigKey<Boolean> SKIP_ON_BOX_BASE_DIR_RESOLUTION = ConfigKeys.newBooleanConfigKey("onbox.base.dir.skipResolution",
- "Whether to skip on-box directory resolution (which can require ssh'ing), and just assume the directory exists; can be set on machine or on entity",
- false);
-
- // TODO Rename to VERSION, instead of SUGGESTED_VERSION? And declare as BasicAttributeSensorAndConfigKey?
- public static final ConfigKey<String> SUGGESTED_VERSION = newStringConfigKey("install.version", "Suggested version");
-
- public static final ConfigKey<String> INSTALL_UNIQUE_LABEL = ConfigKeys.newStringConfigKey("install.unique_label",
- "Provides a label which uniquely identifies an installation, used in the computation of the install dir; " +
- "this should include something readable, and must include a hash of all data which differentiates an installation " +
- "(e.g. version, plugins, etc), but should be the same where install dirs can be shared to allow for re-use");
-
- /**
- * Set this configuration value to true if the entity installation, customization and launch process is to be skipped entirely.
- * <p>
- * This is usually because the process or service the entity represents is already present and started, as part of the image
- * being used. The {@link Startable#SERVICE_UP} attribute will be set in the usual manner.
- * <p>
- * If this key is set on a {@link Location} then all entities in that location will be treated in this way. This is useful
- * when the location is configured with a particular image containing installed and running services.
- *
- * @see #ENTITY_RUNNING
- */
- public static final ConfigKey<Boolean> SKIP_ENTITY_START = newBooleanConfigKey("entity.started", "Skip the startup process entirely, for running services");
-
- /**
- * Set this configuration value to true to skip the entity startup process as with {@link #ENTITY_STARTED} if the process or
- * service represented by the entity is already running, otherwise proceed normally. This is determined using the driver's
- * {@code isRunning()} method.
- * <p>
- * If this key is set on a {@link Location} then all entities in that location will be treated in this way, again as with {@link #ENTITY_STARTED}.
- *
- * @see #ENTITY_STARTED
- */
- public static final ConfigKey<Boolean> SKIP_ENTITY_START_IF_RUNNING = newBooleanConfigKey("entity.running", "Skip the startup process entirely, if service already running");
-
- /**
- * Set this configuration value to true if the entity installation, customization and launch process is to be skipped entirely.
- * <p>
- * This will skip the installation phase of the lifecycle, and move directl;y to customization and launching of the entity.
- */
- public static final ConfigKey<Boolean> SKIP_ENTITY_INSTALLATION = newBooleanConfigKey("install.skip", "Skip the driver install commands entirely, for pre-installed software");
-
- // The implementation in AbstractSoftwareSshDriver runs this command as an SSH command
- public static final ConfigKey<String> PRE_INSTALL_COMMAND = ConfigKeys.newStringConfigKey("pre.install.command",
- "Command to be run prior to the install method being called on the driver");
- public static final ConfigKey<String> POST_INSTALL_COMMAND = ConfigKeys.newStringConfigKey("post.install.command",
- "Command to be run after the install method being called on the driver");
- public static final ConfigKey<String> PRE_LAUNCH_COMMAND = ConfigKeys.newStringConfigKey("pre.launch.command",
- "Command to be run prior to the launch method being called on the driver");
- public static final ConfigKey<String> POST_LAUNCH_COMMAND = ConfigKeys.newStringConfigKey("post.launch.command",
- "Command to be run after the launch method being called on the driver");
-
- public static final MapConfigKey<Object> SHELL_ENVIRONMENT = new MapConfigKey<Object>(
- Object.class,
- "shell.env",
- "Map of environment variables to pass to the runtime shell",
- ImmutableMap.<String,Object>of());
-
- public static final AttributeSensorAndConfigKey<String, String> INSTALL_DIR = new TemplatedStringAttributeSensorAndConfigKey("install.dir", "Directory for this software to be installed in",
- "${" +
- "config['"+ONBOX_BASE_DIR.getName()+"']!" +
- "config['"+BROOKLYN_DATA_DIR.getName()+"']!" +
- "'/<ERROR>-ONBOX_BASE_DIR-not-set'" +
- "}" +
- "/" +
- "installs/" +
- // the var?? tests if it exists, passing value to ?string(if_present,if_absent)
- // the ! provides a default value afterwards, which is never used, but is required for parsing
- // when the config key is not available;
- // thus the below prefers the install.unique_label, but falls back to simple name
- // plus a version identifier *if* the version is explicitly set
- "${(config['install.unique_label']??)?string(config['install.unique_label']!'X'," +
- "(entity.entityType.simpleName)+" +
- "((config['install.version']??)?string('_'+(config['install.version']!'X'),''))" +
- ")}");
-
- public static final AttributeSensorAndConfigKey<String, String> RUN_DIR = new TemplatedStringAttributeSensorAndConfigKey("run.dir", "Directory for this software to be run from",
- "${" +
- "config['"+ONBOX_BASE_DIR.getName()+"']!" +
- "config['"+BROOKLYN_DATA_DIR.getName()+"']!" +
- "'/<ERROR>-ONBOX_BASE_DIR-not-set'" +
- "}" +
- "/" +
- "apps/${entity.applicationId}/" +
- "entities/${entity.entityType.simpleName}_" +
- "${entity.id}");
-
- public static final AttributeSensorAndConfigKey<String, String> EXPANDED_INSTALL_DIR = new TemplatedStringAttributeSensorAndConfigKey(
- "expandedinstall.dir",
- "Directory for installed artifacts (e.g. expanded dir after unpacking .tgz)",
- null);
-
- /** @deprecated since 0.7.0; use {@link #INSTALL_DIR} */
- public static final ConfigKey<String> SUGGESTED_INSTALL_DIR = INSTALL_DIR.getConfigKey();
- /** @deprecated since 0.7.0; use {@link #RUN_DIR} */
- public static final ConfigKey<String> SUGGESTED_RUN_DIR = RUN_DIR.getConfigKey();
-
- /*
- * Intention is to use these with DependentConfiguration.attributeWhenReady, to allow an entity's start
- * to block until dependents are ready. This is particularly useful when we want to block until a dependent
- * component is up, but this entity does not care about the dependent component's actual config values.
- */
-
- public static final ConfigKey<Boolean> PROVISION_LATCH = newBooleanConfigKey("provision.latch", "Latch for blocking location provision until ready");
- public static final ConfigKey<Boolean> START_LATCH = newBooleanConfigKey("start.latch", "Latch for blocking start until ready");
- public static final ConfigKey<Boolean> SETUP_LATCH = newBooleanConfigKey("setup.latch", "Latch for blocking setup until ready");
- public static final ConfigKey<Boolean> PRE_INSTALL_RESOURCES_LATCH = newBooleanConfigKey("resources.preInstall.latch", "Latch for blocking pre-install resources until ready");
- public static final ConfigKey<Boolean> INSTALL_RESOURCES_LATCH = newBooleanConfigKey("resources.install.latch", "Latch for blocking install resources until ready");
- public static final ConfigKey<Boolean> INSTALL_LATCH = newBooleanConfigKey("install.latch", "Latch for blocking install until ready");
- public static final ConfigKey<Boolean> RUNTIME_RESOURCES_LATCH = newBooleanConfigKey("resources.runtime.latch", "Latch for blocking runtime resources until ready");
- public static final ConfigKey<Boolean> CUSTOMIZE_LATCH = newBooleanConfigKey("customize.latch", "Latch for blocking customize until ready");
- public static final ConfigKey<Boolean> LAUNCH_LATCH = newBooleanConfigKey("launch.latch", "Latch for blocking launch until ready");
-
- public static final ConfigKey<Duration> START_TIMEOUT = newConfigKey(
- "start.timeout", "Time to wait for process and for SERVICE_UP before failing (in seconds, default 2m)", Duration.seconds(120));
-
- /* selected properties from SshTool for external public access (e.g. putting on entities) */
-
- /** Public-facing global config keys for Brooklyn are defined in ConfigKeys,
- * and have this prefix pre-prended to the config keys in this class. */
- public static final String BROOKLYN_SSH_CONFIG_KEY_PREFIX = "brooklyn.ssh.config.";
-
- /** Public-facing global config keys for Brooklyn are defined in ConfigKeys,
- * and have this prefix pre-prended to the config keys in this class. */
- public static final String BROOKLYN_WINRM_CONFIG_KEY_PREFIX = "brooklyn.winrm.config.";
-
- // some checks (this line, and a few Preconditions below) that the remote values aren't null,
- // because they have some funny circular references
- static { assert BROOKLYN_SSH_CONFIG_KEY_PREFIX.equals(SshTool.BROOKLYN_CONFIG_KEY_PREFIX) : "static final initializer classload ordering problem"; }
-
- public static final ConfigKey<String> SSH_TOOL_CLASS = newStringConfigKey(
- BROOKLYN_SSH_CONFIG_KEY_PREFIX + "sshToolClass",
- "SshTool implementation to use (or null for default)",
- null);
-
- public static final ConfigKey<String> WINRM_TOOL_CLASS = newStringConfigKey(
- BROOKLYN_WINRM_CONFIG_KEY_PREFIX + "winrmToolClass",
- "WinRmTool implementation to use (or null for default)",
- null);
-
- /**
- * @deprecated since 0.9.0; use {@link #SSH_TOOL_CLASS}
- */
- @Deprecated
- public static final ConfigKey<String> LEGACY_SSH_TOOL_CLASS = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX,
- Preconditions.checkNotNull(SshTool.PROP_TOOL_CLASS, "static final initializer classload ordering problem"));
-
- public static final ConfigKey<String> SSH_CONFIG_HOST = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_HOST);
- public static final ConfigKey<Integer> SSH_CONFIG_PORT = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_PORT);
- public static final ConfigKey<String> SSH_CONFIG_USER = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_USER);
- public static final ConfigKey<String> SSH_CONFIG_PASSWORD = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_PASSWORD);
-
- public static final ConfigKey<String> SSH_CONFIG_SCRIPT_DIR = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX,
- Preconditions.checkNotNull(ShellTool.PROP_SCRIPT_DIR, "static final initializer classload ordering problem"));
- public static final ConfigKey<String> SSH_CONFIG_SCRIPT_HEADER = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_SCRIPT_HEADER);
- public static final ConfigKey<String> SSH_CONFIG_DIRECT_HEADER = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_DIRECT_HEADER);
- public static final ConfigKey<Boolean> SSH_CONFIG_NO_DELETE_SCRIPT = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_NO_DELETE_SCRIPT);
-
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
deleted file mode 100644
index 9c8ebc8..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
+++ /dev/null
@@ -1,1201 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.entity;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Stack;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.Application;
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.entity.Group;
-import org.apache.brooklyn.api.entity.drivers.EntityDriver;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolver;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.mgmt.EntityManager;
-import org.apache.brooklyn.api.mgmt.ExecutionContext;
-import org.apache.brooklyn.api.mgmt.LocationManager;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.api.mgmt.TaskAdaptable;
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.api.policy.Policy;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.api.sensor.Enricher;
-import org.apache.brooklyn.api.sensor.Feed;
-import org.apache.brooklyn.api.sensor.Sensor;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
-import org.apache.brooklyn.core.config.Sanitizer;
-import org.apache.brooklyn.core.effector.Effectors;
-import org.apache.brooklyn.core.entity.trait.Startable;
-import org.apache.brooklyn.core.entity.trait.StartableMethods;
-import org.apache.brooklyn.core.internal.BrooklynProperties;
-import org.apache.brooklyn.core.location.Locations;
-import org.apache.brooklyn.core.location.internal.LocationInternal;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.core.mgmt.internal.BrooklynShutdownHooks;
-import org.apache.brooklyn.core.mgmt.internal.EffectorUtils;
-import org.apache.brooklyn.core.mgmt.internal.EntityManagerInternal;
-import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
-import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
-import org.apache.brooklyn.core.mgmt.internal.NonDeploymentManagementContext;
-import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
-import org.apache.brooklyn.core.objs.proxy.EntityProxyImpl;
-import org.apache.brooklyn.core.sensor.DependentConfiguration;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.core.ResourceUtils;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.flags.FlagUtils;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.ParallelTask;
-import org.apache.brooklyn.util.core.task.TaskTags;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.core.task.system.SystemTasks;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Maybe;
-import org.apache.brooklyn.util.repeat.Repeater;
-import org.apache.brooklyn.util.stream.Streams;
-import org.apache.brooklyn.util.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.annotations.Beta;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.reflect.TypeToken;
-import com.google.common.util.concurrent.Atomics;
-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;
-
-/**
- * Convenience methods for working with entities.
- * <p>
- * Also see the various {@code *Methods} classes for traits,
- * such as {@link StartableMethods} for {@link Startable} implementations.
- */
-public class Entities {
-
- private static final Logger log = LoggerFactory.getLogger(Entities.class);
-
- /**
- * Names that, if they appear anywhere in an attribute/config/field indicates that it
- * may be private, so should not be logged etc.
- *
- * @deprecated since 0.7; instead use {@link Sanitizer#SECRET_NAMES}
- */
- @Deprecated
- public static final List<String> SECRET_NAMES = ImmutableList.of(
- "password",
- "passwd",
- "credential",
- "secret",
- "private",
- "access.cert",
- "access.key");
-
- /**
- * Special object used by some setting methods to indicate that a value should be ignored.
- * <p>
- * See specific usages of this field to confirm where.
- */
- public static final Object UNCHANGED = new Object();
-
- /**
- * Special object used by some setting methods to indicate that a value should be removed.
- * <p>
- * See specific usages of this field to confirm where.
- */
- public static final Object REMOVE = new Object();
-
- /**
- * Invokes an {@link Effector} on multiple entities, with the named arguments from the parameters {@link Map}
- * using the context of the provided {@link Entity}.
- * <p>
- * Intended for use only from the callingEntity.
- * <p>
- * Returns a {@link ParallelTask} containing the results from each tasks invocation. Calling
- * {@link java.util.concurrent.Future#get() get()} on this will block until all tasks are complete,
- * and will throw an exception if any task resulted in an error.
- *
- * @return {@link ParallelTask} containing results from each invocation
- */
- public static <T> Task<List<T>> invokeEffectorList(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
- final Effector<T> effector, final Map<String,?> parameters) {
- // formulation is complicated, but it is building up a list of tasks, without blocking on them initially,
- // but ensuring that when the parallel task is gotten it does block on all of them
-
- if (entitiesToCall == null){
- entitiesToCall = ImmutableList.of();
- }
-
- List<TaskAdaptable<T>> tasks = Lists.newArrayList();
-
- for (final Entity entity : entitiesToCall) {
- tasks.add( Effectors.invocation(entity, effector, parameters) );
- }
- ParallelTask<T> invoke = new ParallelTask<T>(
- MutableMap.of(
- "displayName", effector.getName()+" (parallel)",
- "description", "Invoking effector \""+effector.getName()+"\" on "+tasks.size()+(tasks.size() == 1 ? " entity" : " entities"),
- "tag", BrooklynTaskTags.tagForCallerEntity(callingEntity)),
- tasks);
- TaskTags.markInessential(invoke);
- return DynamicTasks.queueIfPossible(invoke).orSubmitAsync(callingEntity).asTask();
- }
-
- public static <T> Task<List<T>> invokeEffectorListWithMap(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
- final Effector<T> effector, final Map<String,?> parameters) {
- return invokeEffectorList(callingEntity, entitiesToCall, effector, parameters);
- }
-
- @SuppressWarnings("unchecked")
- public static <T> Task<List<T>> invokeEffectorListWithArgs(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
- final Effector<T> effector, Object ...args) {
- return invokeEffectorListWithMap(callingEntity, entitiesToCall, effector,
- // putting into a map, unnecessarily, as it ends up being the array again...
- EffectorUtils.prepareArgsForEffectorAsMapFromArray(effector, args));
- }
-
- public static <T> Task<List<T>> invokeEffectorList(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
- final Effector<T> effector) {
- return invokeEffectorList(callingEntity, entitiesToCall, effector, Collections.<String,Object>emptyMap());
- }
-
- public static <T> Task<T> invokeEffector(Entity callingEntity, Entity entityToCall,
- final Effector<T> effector, final Map<String,?> parameters) {
- Task<T> t = Effectors.invocation(entityToCall, effector, parameters).asTask();
- TaskTags.markInessential(t);
-
- // we pass to callingEntity for consistency above, but in exec-context it should be re-dispatched to targetEntity
- // reassign t as the return value may be a wrapper, if it is switching execution contexts; see submitInternal's javadoc
- t = ((EntityInternal)callingEntity).getManagementSupport().getExecutionContext().submit(
- MutableMap.of("tag", BrooklynTaskTags.tagForCallerEntity(callingEntity)), t);
-
- if (DynamicTasks.getTaskQueuingContext()!=null) {
- // include it as a child (in the gui), marked inessential, because the caller is invoking programmatically
- DynamicTasks.queue(t);
- }
-
- return t;
- }
-
- @SuppressWarnings("unchecked")
- public static <T> Task<T> invokeEffectorWithArgs(Entity callingEntity, Entity entityToCall,
- final Effector<T> effector, Object ...args) {
- return invokeEffector(callingEntity, entityToCall, effector,
- EffectorUtils.prepareArgsForEffectorAsMapFromArray(effector, args));
- }
-
- public static <T> Task<T> invokeEffector(Entity callingEntity, Entity entityToCall,
- final Effector<T> effector) {
- return invokeEffector(callingEntity, entityToCall, effector, Collections.<String,Object>emptyMap());
- }
-
- /** Invokes in parallel if multiple, but otherwise invokes the item directly. */
- public static Task<?> invokeEffector(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
- final Effector<?> effector, final Map<String,?> parameters) {
- if (Iterables.size(entitiesToCall)==1)
- return invokeEffector(callingEntity, entitiesToCall.iterator().next(), effector, parameters);
- else
- return invokeEffectorList(callingEntity, entitiesToCall, effector, parameters);
- }
-
- /** Invokes in parallel if multiple, but otherwise invokes the item directly. */
- public static Task<?> invokeEffector(Entity callingEntity, Iterable<? extends Entity> entitiesToCall,
- final Effector<?> effector) {
- return invokeEffector(callingEntity, entitiesToCall, effector, Collections.<String,Object>emptyMap());
- }
-
- /**
- * @deprecated since 0.7; instead use {@link Sanitizer#IS_SECRET_PREDICATE.apply(Object)}
- */
- @Deprecated
- public static boolean isSecret(String name) {
- return Sanitizer.IS_SECRET_PREDICATE.apply(name);
- }
-
- public static boolean isTrivial(Object v) {
- if (v instanceof Maybe) {
- if (!((Maybe<?>)v).isPresent())
- return true;
- v = ((Maybe<?>) v).get();
- }
-
- return v==null || (v instanceof Map && ((Map<?,?>)v).isEmpty()) ||
- (v instanceof Collection && ((Collection<?>)v).isEmpty()) ||
- (v instanceof CharSequence&& ((CharSequence)v).length() == 0);
- }
-
- /**
- * @deprecated since 0.7; instead use {@link Sanitizer#sanitize(ConfigBag)}
- */
- @Deprecated
- public static Map<String,Object> sanitize(ConfigBag input) {
- return Sanitizer.sanitize(input );
- }
-
- /**
- * @deprecated since 0.7; instead use {@link Sanitizer#sanitize(Map)}
- */
- @Deprecated
- public static <K> Map<K,Object> sanitize(Map<K,?> input) {
- return Sanitizer.sanitize(input);
- }
-
- public static void dumpInfo(Iterable<? extends Entity> entities) {
- for (Entity e : entities) {
- dumpInfo(e);
- }
- }
-
- public static void dumpInfo(Entity e) {
- try {
- dumpInfo(e, new PrintWriter(System.out), "", " ");
- } catch (IOException exc) {
- // system.out throwing an exception is odd, so don't have IOException on signature
- throw new RuntimeException(exc);
- }
- }
- public static void dumpInfo(Entity e, Writer out) throws IOException {
- dumpInfo(e, out, "", " ");
- }
- public static void dumpInfo(Entity e, String currentIndentation, String tab) throws IOException {
- dumpInfo(e, new PrintWriter(System.out), currentIndentation, tab);
- }
- public static void dumpInfo(Entity e, Writer out, String currentIndentation, String tab) throws IOException {
- out.append(currentIndentation+e.toString()+" "+e.getId()+"\n");
-
- out.append(currentIndentation+tab+tab+"displayName = "+e.getDisplayName()+"\n");
-
- out.append(currentIndentation+tab+tab+"locations = "+e.getLocations()+"\n");
-
- Set<ConfigKey<?>> keys = Sets.newLinkedHashSet(
- ((EntityInternal)e).config().getLocalBag().getAllConfigAsConfigKeyMap().keySet()
- //((EntityInternal)e).getConfigMap().getLocalConfig().keySet()
- );
- for (ConfigKey<?> it : sortConfigKeys(keys)) {
- // use the official config key declared on the type if available
- // (since the map sometimes contains <object> keys
- ConfigKey<?> realKey = e.getEntityType().getConfigKey(it.getName());
- if (realKey!=null) it = realKey;
-
- Maybe<Object> mv = ((EntityInternal)e).config().getLocalRaw(it);
- if (!isTrivial(mv)) {
- Object v = mv.get();
- out.append(currentIndentation+tab+tab+it.getName());
- out.append(" = ");
- if (isSecret(it.getName())) out.append("xxxxxxxx");
- else if ((v instanceof Task) && ((Task<?>)v).isDone()) {
- if (((Task<?>)v).isError()) {
- out.append("ERROR in "+v);
- } else {
- try {
- out.append(((Task<?>)v).get() + " (from "+v+")");
- } catch (ExecutionException ee) {
- throw new IllegalStateException("task "+v+" done and !isError, but threw exception on get", ee);
- } catch (InterruptedException ie) {
- Thread.currentThread().interrupt();
- return;
- }
- }
- } else out.append(""+v);
- out.append("\n");
- }
- }
-
- for (Sensor<?> it : sortSensors(e.getEntityType().getSensors())) {
- if (it instanceof AttributeSensor) {
- Object v = e.getAttribute((AttributeSensor<?>)it);
- if (!isTrivial(v)) {
- out.append(currentIndentation+tab+tab+it.getName());
- out.append(": ");
- if (isSecret(it.getName())) out.append("xxxxxxxx");
- else out.append(""+v);
- out.append("\n");
- }
- }
- }
-
- if (e instanceof Group) {
- StringBuilder members = new StringBuilder();
- for (Entity it : ((Group)e).getMembers()) {
- if (members.length()>0) members.append(", ");
- members.append(it.getId());
- }
- out.append(currentIndentation+tab+tab+"Members: "+members.toString()+"\n");
- }
-
- if (!e.policies().isEmpty()) {
- out.append(currentIndentation+tab+tab+"Policies:\n");
- for (Policy policy : e.policies()) {
- dumpInfo(policy, out, currentIndentation+tab+tab+tab, tab);
- }
- }
-
- if (!e.enrichers().isEmpty()) {
- out.append(currentIndentation+tab+tab+"Enrichers:\n");
- for (Enricher enricher : e.enrichers()) {
- dumpInfo(enricher, out, currentIndentation+tab+tab+tab, tab);
- }
- }
-
- if (!((EntityInternal)e).feeds().getFeeds().isEmpty()) {
- out.append(currentIndentation+tab+tab+"Feeds:\n");
- for (Feed feed : ((EntityInternal)e).feeds().getFeeds()) {
- dumpInfo(feed, out, currentIndentation+tab+tab+tab, tab);
- }
- }
-
- for (Entity it : e.getChildren()) {
- dumpInfo(it, out, currentIndentation+tab, tab);
- }
-
- out.flush();
- }
-
- public static void dumpInfo(Location loc) {
- try {
- dumpInfo(loc, new PrintWriter(System.out), "", " ");
- } catch (IOException exc) {
- // system.out throwing an exception is odd, so don't have IOException on signature
- throw new RuntimeException(exc);
- }
- }
- public static void dumpInfo(Location loc, Writer out) throws IOException {
- dumpInfo(loc, out, "", " ");
- }
- public static void dumpInfo(Location loc, String currentIndentation, String tab) throws IOException {
- dumpInfo(loc, new PrintWriter(System.out), currentIndentation, tab);
- }
- @SuppressWarnings("rawtypes")
- public static void dumpInfo(Location loc, Writer out, String currentIndentation, String tab) throws IOException {
- out.append(currentIndentation+loc.toString()+"\n");
-
- for (Object entryO : ((LocationInternal)loc).config().getBag().getAllConfig().entrySet()) {
- Map.Entry entry = (Map.Entry)entryO;
- Object keyO = entry.getKey();
- String key =
- keyO instanceof HasConfigKey ? ((HasConfigKey)keyO).getConfigKey().getName() :
- keyO instanceof ConfigKey ? ((ConfigKey)keyO).getName() :
- keyO == null ? null :
- keyO.toString();
- Object val = entry.getValue();
- if (!isTrivial(val)) {
- out.append(currentIndentation+tab+tab+key);
- out.append(" = ");
- if (isSecret(key)) out.append("xxxxxxxx");
- else out.append(""+val);
- out.append("\n");
- }
- }
-
- for (Map.Entry<String,?> entry : sortMap(FlagUtils.getFieldsWithFlags(loc)).entrySet()) {
- String key = entry.getKey();
- Object val = entry.getValue();
- if (!isTrivial(val)) {
- out.append(currentIndentation+tab+tab+key);
- out.append(" = ");
- if (isSecret(key)) out.append("xxxxxxxx");
- else out.append(""+val);
- out.append("\n");
- }
- }
-
- for (Location it : loc.getChildren()) {
- dumpInfo(it, out, currentIndentation+tab, tab);
- }
-
- out.flush();
- }
-
- public static void dumpInfo(Enricher enr) {
- try {
- dumpInfo(enr, new PrintWriter(System.out), "", " ");
- } catch (IOException exc) {
- // system.out throwing an exception is odd, so don't have IOException on signature
- throw new RuntimeException(exc);
- }
- }
- public static void dumpInfo(Enricher enr, Writer out) throws IOException {
- dumpInfo(enr, out, "", " ");
- }
- public static void dumpInfo(Enricher enr, String currentIndentation, String tab) throws IOException {
- dumpInfo(enr, new PrintWriter(System.out), currentIndentation, tab);
- }
- public static void dumpInfo(Enricher enr, Writer out, String currentIndentation, String tab) throws IOException {
- out.append(currentIndentation+enr.toString()+"\n");
-
- for (ConfigKey<?> key : sortConfigKeys(enr.getEnricherType().getConfigKeys())) {
- Maybe<Object> val = ((BrooklynObjectInternal)enr).config().getRaw(key);
- if (!isTrivial(val)) {
- out.append(currentIndentation+tab+tab+key);
- out.append(" = ");
- if (isSecret(key.getName())) out.append("xxxxxxxx");
- else out.append(""+val.get());
- out.append("\n");
- }
- }
-
- out.flush();
- }
- public static void dumpInfo(Feed feed, String currentIndentation, String tab) throws IOException {
- dumpInfo(feed, new PrintWriter(System.out), currentIndentation, tab);
- }
- public static void dumpInfo(Feed feed, Writer out, String currentIndentation, String tab) throws IOException {
- out.append(currentIndentation+feed.toString()+"\n");
-
- // TODO create a FeedType cf EnricherType ?
- for (ConfigKey<?> key : sortConfigKeys(((BrooklynObjectInternal)feed).config().getBag().getAllConfigAsConfigKeyMap().keySet())) {
- Maybe<Object> val = ((BrooklynObjectInternal)feed).config().getRaw(key);
- if (!isTrivial(val)) {
- out.append(currentIndentation+tab+tab+key);
- out.append(" = ");
- if (isSecret(key.getName())) out.append("xxxxxxxx");
- else out.append(""+val.get());
- out.append("\n");
- }
- }
-
- out.flush();
- }
-
- public static void dumpInfo(Policy pol) {
- try {
- dumpInfo(pol, new PrintWriter(System.out), "", " ");
- } catch (IOException exc) {
- // system.out throwing an exception is odd, so don't have IOException on signature
- throw new RuntimeException(exc);
- }
- }
- public static void dumpInfo(Policy pol, Writer out) throws IOException {
- dumpInfo(pol, out, "", " ");
- }
- public static void dumpInfo(Policy pol, String currentIndentation, String tab) throws IOException {
- dumpInfo(pol, new PrintWriter(System.out), currentIndentation, tab);
- }
- public static void dumpInfo(Policy pol, Writer out, String currentIndentation, String tab) throws IOException {
- out.append(currentIndentation+pol.toString()+"\n");
-
- for (ConfigKey<?> key : sortConfigKeys(pol.getPolicyType().getConfigKeys())) {
- Maybe<Object> val = ((BrooklynObjectInternal)pol).config().getRaw(key);
- if (!isTrivial(val)) {
- out.append(currentIndentation+tab+tab+key);
- out.append(" = ");
- if (isSecret(key.getName())) out.append("xxxxxxxx");
- else out.append(""+val.get());
- out.append("\n");
- }
- }
-
- out.flush();
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List<Sensor<?>> sortSensors(Set<Sensor<?>> sensors) {
- List result = new ArrayList(sensors);
- Collections.sort(result, new Comparator<Sensor>() {
- @Override
- public int compare(Sensor arg0, Sensor arg1) {
- return arg0.getName().compareTo(arg1.getName());
- }
-
- });
- return result;
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static List<ConfigKey<?>> sortConfigKeys(Set<ConfigKey<?>> configs) {
- List result = new ArrayList(configs);
- Collections.sort(result, new Comparator<ConfigKey>() {
- @Override
- public int compare(ConfigKey arg0, ConfigKey arg1) {
- return arg0.getName().compareTo(arg1.getName());
- }
-
- });
- return result;
- }
-
- public static <T> Map<String, T> sortMap(Map<String, T> map) {
- Map<String,T> result = Maps.newLinkedHashMap();
- List<String> order = Lists.newArrayList(map.keySet());
- Collections.sort(order, String.CASE_INSENSITIVE_ORDER);
-
- for (String key : order) {
- result.put(key, map.get(key));
- }
- return result;
- }
-
- /**
- * Returns true if the given descendant includes the given ancestor in its chain.
- * Does <i>NOT</i> count a node as its ancestor.
- */
- public static boolean isAncestor(Entity descendant, Entity potentialAncestor) {
- Entity ancestor = descendant.getParent();
- while (ancestor != null) {
- if (ancestor.equals(potentialAncestor)) return true;
- ancestor = ancestor.getParent();
- }
- return false;
- }
-
- /**
- * Checks whether the descendants of the given ancestor contains the given potentialDescendant.
- * <p>
- * In this test, unlike in {@link #descendants(Entity)}, an entity is not counted as a descendant.
- * note, it is usually preferred to use isAncestor() and swap the order, it is a cheaper method.
- */
- public static boolean isDescendant(Entity ancestor, Entity potentialDescendant) {
- Set<Entity> inspected = Sets.newLinkedHashSet();
- Stack<Entity> toinspect = new Stack<Entity>();
- toinspect.add(ancestor);
-
- while (!toinspect.isEmpty()) {
- Entity e = toinspect.pop();
- if (e.getChildren().contains(potentialDescendant)) {
- return true;
- }
- inspected.add(e);
- toinspect.addAll(e.getChildren());
- toinspect.removeAll(inspected);
- }
-
- return false;
- }
-
- /**
- * Return all descendants of given entity matching the given predicate and optionally the entity itself.
- *
- * @see {@link EntityPredicates} for useful second arguments.
- */
- public static Iterable<Entity> descendants(Entity root, Predicate<? super Entity> matching, boolean includeSelf) {
- Iterable<Entity> descs = Iterables.concat(Iterables.transform(root.getChildren(), new Function<Entity,Iterable<Entity>>() {
- @Override
- public Iterable<Entity> apply(Entity input) {
- return descendants(input);
- }
- }));
- return Iterables.filter(Iterables.concat(descs, Collections.singleton(root)), matching);
- }
-
- /**
- * Returns the entity matching the given predicate
- *
- * @see #descendants(Entity, Predicate, boolean)
- */
- public static Iterable<Entity> descendants(Entity root, Predicate<? super Entity> matching) {
- return descendants(root, matching, true);
- }
-
- /**
- * Returns the entity, its children, and all its children, and so on.
- *
- * @see #descendants(Entity, Predicate, boolean)
- */
- public static Iterable<Entity> descendants(Entity root) {
- return descendants(root, Predicates.alwaysTrue(), true);
- }
-
- /**
- * Return all descendants of given entity of the given type, potentially including the given root.
- *
- * @see #descendants(Entity)
- * @see Iterables#filter(Iterable, Class)
- */
- public static <T extends Entity> Iterable<T> descendants(Entity root, Class<T> ofType) {
- return Iterables.filter(descendants(root), ofType);
- }
-
- /** Returns the entity, its parent, its parent, and so on. */
- public static Iterable<Entity> ancestors(final Entity root) {
- return new Iterable<Entity>() {
- @Override
- public Iterator<Entity> iterator() {
- return new Iterator<Entity>() {
- Entity next = root;
- @Override
- public boolean hasNext() {
- return next!=null;
- }
- @Override
- public Entity next() {
- Entity result = next;
- next = next.getParent();
- return result;
- }
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- };
- }
- };
- }
-
- /**
- * Registers a {@link BrooklynShutdownHooks#invokeStopOnShutdown(Entity)} to shutdown this entity when the JVM exits.
- * (Convenience method located in this class for easy access.)
- */
- public static void invokeStopOnShutdown(Entity entity) {
- BrooklynShutdownHooks.invokeStopOnShutdown(entity);
- }
-
- /** convenience for starting an entity, esp a new Startable instance which has been created dynamically
- * (after the application is started) */
- public static void start(Entity e, Collection<? extends Location> locations) {
- if (!isManaged(e) && !manage(e)) {
- log.warn("Using deprecated discouraged mechanism to start management -- Entities.start(Application, Locations) -- caller should create and use the preferred management context");
- startManagement(e);
- }
- if (e instanceof Startable) Entities.invokeEffector(e, e, Startable.START,
- MutableMap.of("locations", locations)).getUnchecked();
- }
-
- /**
- * Attempts to stop, destroy, and unmanage the given entity.
- * <p>
- * Actual actions performed will depend on the entity type and its current state.
- */
- public static void destroy(Entity e) {
- if (isManaged(e)) {
- if (isReadOnly(e)) {
- unmanage(e);
- log.debug("destroyed and unmanaged read-only copy of "+e);
- } else {
- if (e instanceof Startable) Entities.invokeEffector(e, e, Startable.STOP).getUnchecked();
-
- // if destroying gracefully we might also want to do this (currently gets done by GC after unmanage,
- // which is good enough for leaks, but not sure if that's ideal for subscriptions etc)
-// ((LocalEntityManager)e.getApplication().getManagementContext().getEntityManager()).stopTasks(e, null);
-
- if (e instanceof EntityInternal) ((EntityInternal)e).destroy();
-
- unmanage(e);
-
- log.debug("destroyed and unmanaged "+e+"; mgmt now "+
- (e.getApplicationId()==null ? "(no app)" : e.getApplication().getManagementContext())+" - managed? "+isManaged(e));
- }
- } else {
- log.debug("skipping destroy of "+e+": not managed");
- }
- }
-
- /** Same as {@link #destroy(Entity)} but catching all errors. */
- public static void destroyCatching(Entity entity) {
- try {
- destroy(entity);
- } catch (Exception e) {
- log.warn("ERROR destroying "+entity+" (ignoring): "+e, e);
- Exceptions.propagateIfFatal(e);
- }
- }
-
- /** Destroys the given location. */
- public static void destroy(Location loc) {
- // TODO unmanage the location, if possible?
- if (loc instanceof Closeable) {
- Streams.closeQuietly((Closeable)loc);
- log.debug("closed "+loc);
- }
- }
-
- /** Same as {@link #destroy(Location)} but catching all errors. */
- public static void destroyCatching(Location loc) {
- try {
- destroy(loc);
- } catch (Exception e) {
- log.warn("ERROR destroying "+loc+" (ignoring): "+e, e);
- Exceptions.propagateIfFatal(e);
- }
- }
-
- /**
- * Stops, destroys, and unmanages all apps in the given context, and then terminates the management context.
- *
- * Apps will be stopped+destroyed+unmanaged concurrently, waiting for all to complete.
- */
- public static void destroyAll(final ManagementContext mgmt) {
- if (mgmt instanceof NonDeploymentManagementContext) {
- // log here because it is easy for tests to destroyAll(app.getMgmtContext())
- // which will *not* destroy the mgmt context if the app has been stopped!
- log.warn("Entities.destroyAll invoked on non-deployment "+mgmt+" - not likely to have much effect! " +
- "(This usually means the mgmt context has been taken from an entity that has been destroyed. " +
- "To destroy other things on the management context ensure you keep a handle to the context " +
- "before the entity is destroyed, such as by creating the management context first.)");
- }
- if (!mgmt.isRunning()) return;
-
- ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
- List<ListenableFuture<?>> futures = Lists.newArrayList();
- final AtomicReference<Exception> error = Atomics.newReference();
- try {
- log.debug("destroying all apps in "+mgmt+": "+mgmt.getApplications());
- for (final Application app: mgmt.getApplications()) {
- futures.add(executor.submit(new Runnable() {
- public void run() {
- log.debug("destroying app "+app+" (managed? "+isManaged(app)+"; mgmt is "+mgmt+")");
- try {
- destroy(app);
- log.debug("destroyed app "+app+"; mgmt now "+mgmt);
- } catch (Exception e) {
- log.warn("problems destroying app "+app+" (mgmt now "+mgmt+", will rethrow at least one exception): "+e);
- error.compareAndSet(null, e);
- }
- }}));
- }
- Futures.allAsList(futures).get();
-
- for (Location loc : mgmt.getLocationManager().getLocations()) {
- destroyCatching(loc);
- }
- if (mgmt instanceof ManagementContextInternal) {
- ((ManagementContextInternal)mgmt).terminate();
- }
- if (error.get() != null) throw Exceptions.propagate(error.get());
- } catch (Exception e) {
- if (!mgmt.isRunning()) {
- // we've checked this above so it would only happen if a different thread stopped it;
- // this does happen sometimes e.g. in CliTest where the server shutdown occurs concurrently
- log.debug("Destroying apps gave an error, but mgmt context was concurrently stopped so not really a problem; swallowing (unless fatal): "+e);
- Exceptions.propagateIfFatal(e);
- } else {
- throw Exceptions.propagate(e);
- }
- } finally {
- executor.shutdownNow();
- }
- }
-
- /** Same as {@link #destroyAll(ManagementContext)} but catching all errors */
- public static void destroyAllCatching(ManagementContext mgmt) {
- try {
- destroyAll(mgmt);
- } catch (Exception e) {
- log.warn("ERROR destroying "+mgmt+" (ignoring): "+e, e);
- Exceptions.propagateIfFatal(e);
- }
- }
-
- public static boolean isManaged(Entity e) {
- return ((EntityInternal)e).getManagementSupport().isDeployed() && ((EntityInternal)e).getManagementContext().isRunning();
- }
-
- public static boolean isNoLongerManaged(Entity e) {
- return ((EntityInternal)e).getManagementSupport().isNoLongerManaged();
- }
-
- /** as {@link EntityManagerInternal#isReadOnly(Entity)} */
- @Beta
- public static Boolean isReadOnly(Entity e) {
- return ((EntityInternal)e).getManagementSupport().isReadOnly();
- }
-
- /** Unwraps a proxy to retrieve the real item, if available.
- * <p>
- * Only intended for use in tests and occasional internal usage, e.g. persistence.
- * For normal operations, callers should ensure the method is available on an interface and accessed via the proxy. */
- @Beta @VisibleForTesting
- public static AbstractEntity deproxy(Entity e) {
- if (!(Proxy.isProxyClass(e.getClass()))) {
- log.warn("Attempt to deproxy non-proxy "+e, new Throwable("Location of attempt to deproxy non-proxy "+e));
- return (AbstractEntity) e;
- }
- return (AbstractEntity) ((EntityProxyImpl)Proxy.getInvocationHandler(e)).getDelegate();
- }
-
- /**
- * Returns the proxy form (if available) of the entity. If already a proxy, returns unmodified.
- *
- * If null is passed in, then null is returned.
- *
- * For legacy entities (that did not use {@link EntitySpec} or YAML for creation), the
- * proxy may not be avilable; in which case the concrete class passed in will be returned.
- */
- @Beta
- @SuppressWarnings("unchecked")
- public static <T extends Entity> T proxy(T e) {
- return (e == null) ? null : e instanceof Proxy ? e : (T) ((AbstractEntity)e).getProxyIfAvailable();
- }
-
- /**
- * Brings this entity under management only if its ancestor is managed.
- * <p>
- * Returns true if successful, otherwise returns false in the expectation that the ancestor
- * will become managed, or throws exception if it has no parent or a non-application root.
- *
- * @throws IllegalStateException if {@literal e} is an {@link Application}.
- * @see #startManagement(Entity)
- *
- * @deprecated since 0.9.0; entities are automatically managed when created via {@link Entity#addChild(EntitySpec)},
- * or with {@link EntityManager#createEntity(EntitySpec)} (it is strongly encouraged to include the parent
- * if using the latter for anything but a top-level app).
- */
- @Deprecated
- public static boolean manage(Entity e) {
- if (Entities.isManaged(e)) {
- return true; // no-op
- }
-
- log.warn("Deprecated use of Entities.manage(Entity), for unmanaged entity "+e);
- Entity o = e.getParent();
- Entity eum = e; // Highest unmanaged ancestor
- if (o==null) throw new IllegalArgumentException("Can't manage "+e+" because it is an orphan");
- while (o.getParent()!=null) {
- if (!isManaged(o)) eum = o;
- o = o.getParent();
- }
- if (isManaged(o)) {
- ((EntityInternal)o).getManagementContext().getEntityManager().manage(eum);
- return true;
- }
- if (!(o instanceof Application)) {
- throw new IllegalStateException("Can't manage "+e+" because it is not rooted at an application");
- }
- return false;
- }
-
- /**
- * Brings this entity under management, creating a local management context if necessary,
- * assuming root is an application.
- * <p>
- * Returns existing management context if there is one (non-deployment) or a new local management
- * context if not, or throws an exception if root is not an application. Callers are recommended
- * to use {@link #manage(Entity)} instead unless they know a plain-vanilla non-root management
- * context is sufficient e.g. in tests.
- * <p>
- * <b>NOTE</b> This method may change, but is provided as a stop-gap to prevent ad-hoc things
- * being done in the code which are even more likely to break!
- *
- * @deprecated since 0.9.0; entities are automatically managed when created via {@link Entity#addChild(EntitySpec)},
- * or with {@link EntityManager#createEntity(EntitySpec)}.
- */
- @Deprecated
- @Beta
- public static ManagementContext startManagement(Entity e) {
- log.warn("Deprecated use of Entities.startManagement(Entity), for entity "+e);
-
- Entity o = e;
- Entity eum = e; // Highest unmanaged ancestor
- while (o.getParent()!=null) {
- if (!isManaged(o)) eum = o;
- o = o.getParent();
- }
- if (isManaged(o)) {
- ManagementContext mgmt = ((EntityInternal)o).getManagementContext();
- mgmt.getEntityManager().manage(eum);
- return mgmt;
- }
- if (!(o instanceof Application))
- throw new IllegalStateException("Can't manage "+e+" because it is not rooted at an application");
-
- log.warn("Deprecated invocation of startManagement for "+e+" without a management context present; "
- + "a new local management context is being created! (Not recommended unless you really know what you are doing.)");
- ManagementContext mgmt = new LocalManagementContext();
- mgmt.getEntityManager().manage(o);
- return mgmt;
- }
-
- /**
- * Starts managing the given (unmanaged) app, using the given management context.
- *
- * @see #startManagement(Entity)
- *
- * @deprecated since 0.9.0; entities are automatically managed when created with
- * {@link EntityManager#createEntity(EntitySpec)}. For top-level apps, use code like
- * {@code managementContext.getEntityManager().createEntity(EntitySpec.create(...))}.
- */
- @Deprecated
- public static ManagementContext startManagement(Application app, ManagementContext mgmt) {
- log.warn("Deprecated use of Entities.startManagement(Application, ManagementContext), for app "+app);
-
- if (isManaged(app)) {
- if (app.getManagementContext() == mgmt) {
- // no-op; app was presumably auto-managed
- return mgmt;
- } else {
- throw new IllegalStateException("Application "+app+" is already managed by "+app.getManagementContext()+", so cannot be managed by "+mgmt);
- }
- }
-
- mgmt.getEntityManager().manage(app);
- return mgmt;
- }
-
- /**
- * Starts managing the given (unmanaged) app, setting the given brooklyn properties on the new
- * management context.
- *
- * @see #startManagement(Entity)
- *
- * @deprecated since 0.9.0; entities are automatically managed when created via {@link Entity#addChild(EntitySpec)},
- * or with {@link EntityManager#createEntity(EntitySpec)}. For top-level apps, use code like
- * {@code managementContext.getEntityManager().createEntity(EntitySpec.create(...))}.
- */
- @Deprecated
- public static ManagementContext startManagement(Application app, BrooklynProperties props) {
- log.warn("Deprecated use of Entities.startManagement(Application, BrooklynProperties), for app "+app);
-
- if (isManaged(app)) {
- throw new IllegalStateException("Application "+app+" is already managed, so can't set brooklyn properties");
- }
- ManagementContext mgmt = new LocalManagementContext(props);
- mgmt.getEntityManager().manage(app);
- return mgmt;
- }
-
- public static ManagementContext newManagementContext() {
- return new LocalManagementContext();
- }
-
- public static ManagementContext newManagementContext(BrooklynProperties props) {
- return new LocalManagementContext(props);
- }
-
- public static ManagementContext newManagementContext(Map<?,?> props) {
- return new LocalManagementContext( BrooklynProperties.Factory.newEmpty().addFromMap(props));
- }
-
- public static ManagementContext getManagementContext(Entity entity) {
- return ((EntityInternal) entity).getManagementContext();
- }
-
- public static void unmanage(Entity entity) {
- if (((EntityInternal)entity).getManagementSupport().isDeployed()) {
- ((EntityInternal)entity).getManagementContext().getEntityManager().unmanage(entity);
- }
- }
-
- public static DownloadResolver newDownloader(EntityDriver driver) {
- return newDownloader(driver, ImmutableMap.<String,Object>of());
- }
-
- public static DownloadResolver newDownloader(EntityDriver driver, Map<String,?> properties) {
- EntityInternal internal = (EntityInternal) driver.getEntity();
- return internal.getManagementContext().getEntityDownloadsManager().newDownloader(driver, properties);
- }
-
- public static DownloadResolver newDownloader(EntityDriver driver, String addon) {
- return newDownloader(driver, addon, ImmutableMap.<String,Object>of());
- }
-
- public static DownloadResolver newDownloader(EntityDriver driver, String addon, Map<String,?> properties) {
- EntityInternal internal = (EntityInternal) driver.getEntity();
- return internal.getManagementContext().getEntityDownloadsManager().newDownloader(driver, addon, properties);
- }
-
- public static <T> Supplier<T> attributeSupplier(Entity entity, AttributeSensor<T> sensor) {
- return EntityAndAttribute.create(entity, sensor);
- }
-
- public static <T> Supplier<T> attributeSupplier(EntityAndAttribute<T> tuple) { return tuple; }
-
- public static <T> Supplier<T> attributeSupplierWhenReady(EntityAndAttribute<T> tuple) {
- return attributeSupplierWhenReady(tuple.getEntity(), tuple.getAttribute());
- }
-
- @SuppressWarnings({ "unchecked", "serial" })
- public static <T> Supplier<T> attributeSupplierWhenReady(final Entity entity, final AttributeSensor<T> sensor) {
- final Task<T> task = DependentConfiguration.attributeWhenReady(entity, sensor);
- return new Supplier<T>() {
- @Override public T get() {
- try {
- TypeToken<T> type = new TypeToken<T>(sensor.getType()) {};
- return Tasks.resolveValue(task, (Class<T>) type.getRawType(), ((EntityInternal) entity).getExecutionContext(), "attributeSupplierWhenReady");
- } catch (Exception e) {
- throw Exceptions.propagate(e);
- }
- }
- };
- }
-
- /**
- * @since 0.6.0 Added only for backwards compatibility, where locations are being created directly.
- * @deprecated in 0.6.0; use {@link LocationManager#createLocation(LocationSpec)} instead
- */
- @Deprecated
- public static void manage(Location loc, ManagementContext managementContext) {
- Locations.manage(loc, managementContext);
- }
-
- /** Fails-fast if value of the given key is null or unresolveable. */
- public static String getRequiredUrlConfig(Entity entity, ConfigKey<String> urlKey) {
- String url = entity.getConfig(urlKey);
- Preconditions.checkNotNull(url, "Key %s on %s should not be null", urlKey, entity);
- if (!ResourceUtils.create(entity).doesUrlExist(url)) {
- throw new IllegalStateException(String.format("Key %s on %s contains unavailable URL %s", urlKey, entity, url));
- }
- return url;
- }
-
- /** @see #getRequiredUrlConfig(Entity, ConfigKey) */
- public static String getRequiredUrlConfig(Entity entity, HasConfigKey<String> urlKey) {
- return getRequiredUrlConfig(entity, urlKey.getConfigKey());
- }
-
- /** Fails-fast if value of the given URL is null or unresolveable. */
- public static String checkRequiredUrl(Entity entity, String url) {
- Preconditions.checkNotNull(url, "url");
- if (!ResourceUtils.create(entity).doesUrlExist(url)) {
- throw new IllegalStateException(String.format("URL %s on %s is unavailable", url, entity));
- }
- return url;
- }
-
- /**
- * Submits a {@link TaskFactory} to construct its task at the entity (in a precursor task) and then to submit it.
- * <p>
- * Important if task construction relies on an entity being in scope (in tags, via {@link BrooklynTaskTags})
- */
- public static <T extends TaskAdaptable<?>> T submit(final Entity entity, final TaskFactory<T> taskFactory) {
- // TODO it is messy to have to do this, but not sure there is a cleaner way :(
- final Semaphore s = new Semaphore(0);
- final AtomicReference<T> result = new AtomicReference<T>();
- final ExecutionContext executionContext = ((EntityInternal)entity).getManagementSupport().getExecutionContext();
- executionContext.execute(new Runnable() {
- // TODO could give this task a name, like "create task from factory"
- @Override
- public void run() {
- T t = taskFactory.newTask();
- result.set(t);
- s.release();
- }
- });
- try {
- s.acquire();
- } catch (InterruptedException e) {
- throw Exceptions.propagate(e);
- }
- executionContext.submit(result.get().asTask());
- return result.get();
- }
-
- /**
- * Submits a task to run at the entity.
- *
- * @return the task passed in, for fluency
- */
- public static <T extends TaskAdaptable<?>> T submit(final Entity entity, final T task) {
- final ExecutionContext executionContext = ((EntityInternal)entity).getManagementSupport().getExecutionContext();
- executionContext.submit(task.asTask());
- return task;
- }
-
- /** Logs a warning if an entity has a value for a config key. */
- public static void warnOnIgnoringConfig(Entity entity, ConfigKey<?> key) {
- if (((EntityInternal)entity).config().getRaw(key).isPresentAndNonNull())
- log.warn("Ignoring "+key+" set on "+entity+" ("+entity.getConfig(key)+")");
- }
-
- /** Waits until {@link Startable#SERVICE_UP} returns true. */
- public static void waitForServiceUp(final Entity entity, Duration timeout) {
- String description = "Waiting for SERVICE_UP on "+entity;
- Tasks.setBlockingDetails(description);
- try {
- if (!Repeater.create(description).limitTimeTo(timeout)
- .rethrowException().backoffTo(Duration.ONE_SECOND)
- .until(new Callable<Boolean>() {
- public Boolean call() {
- return Boolean.TRUE.equals(entity.getAttribute(Startable.SERVICE_UP));
- }})
- .run()) {
- throw new IllegalStateException("Timeout waiting for SERVICE_UP from "+entity);
- }
- } finally {
- Tasks.resetBlockingDetails();
- }
- log.debug("Detected SERVICE_UP for software {}", entity);
- }
- public static void waitForServiceUp(final Entity entity, long duration, TimeUnit units) {
- waitForServiceUp(entity, Duration.of(duration, units));
- }
- public static void waitForServiceUp(final Entity entity) {
- Duration timeout = entity.getConfig(BrooklynConfigKeys.START_TIMEOUT);
- waitForServiceUp(entity, timeout);
- }
-
- /**
- * Convenience for creating and submitted a given shell command against the given mgmt context,
- * primarily intended for use in the groovy GUI console.
- */
- @Beta
- public static ProcessTaskWrapper<Integer> shell(ManagementContext mgmt, String command) {
- ProcessTaskWrapper<Integer> t = SystemTasks.exec(command).newTask();
- mgmt.getServerExecutionContext().submit(t).getUnchecked();
- System.out.println(t.getStdout());
- System.err.println(t.getStderr());
- return t;
- }
-
- public static Entity catalogItemScopeRoot(Entity entity) {
- Entity root = entity;
- while (root.getParent() != null &&
- root != root.getParent() &&
- Objects.equal(root.getParent().getCatalogItemId(), root.getCatalogItemId())) {
- root = root.getParent();
- }
- return root;
- }
-
- public static Set<Location> getAllInheritedLocations(Entity entity) {
- Set<Location> result = MutableSet.of();
- while (entity!=null) {
- result.addAll(entity.getLocations());
- entity = entity.getParent();
- }
- return result;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAdjuncts.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAdjuncts.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAdjuncts.java
deleted file mode 100644
index fc1daf4..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAdjuncts.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.entity;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.objs.EntityAdjunct;
-import org.apache.brooklyn.api.sensor.Enricher;
-import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ComputeServiceIndicatorsFromChildrenAndMembers;
-import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ComputeServiceState;
-import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ServiceNotUpLogic;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.guava.Maybe;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-
-/**
- * Convenience methods for working with entity adjunts.
- */
-public class EntityAdjuncts {
-
- public static <T extends EntityAdjunct> Maybe<T> tryFindWithUniqueTag(Iterable<T> adjuncts, Object tag) {
- Preconditions.checkNotNull(tag, "tag");
- for (T adjunct: adjuncts)
- if (tag.equals(adjunct.getUniqueTag()))
- return Maybe.of(adjunct);
- return Maybe.absent("Not found with tag "+tag);
- }
-
- public static final List<String> SYSTEM_ENRICHER_UNIQUE_TAGS = ImmutableList.of(
- ServiceNotUpLogic.DEFAULT_ENRICHER_UNIQUE_TAG,
- ComputeServiceState.DEFAULT_ENRICHER_UNIQUE_TAG,
- ComputeServiceIndicatorsFromChildrenAndMembers.DEFAULT_UNIQUE_TAG,
- ComputeServiceIndicatorsFromChildrenAndMembers.DEFAULT_UNIQUE_TAG_UP);
-
- public static List<Enricher> getNonSystemEnrichers(Entity entity) {
- List<Enricher> result = MutableList.copyOf(entity.enrichers());
- Iterator<Enricher> ri = result.iterator();
- while (ri.hasNext()) {
- if (isSystemEnricher(ri.next())) ri.remove();
- }
- return result;
- }
-
- public static boolean isSystemEnricher(Enricher enr) {
- if (enr.getUniqueTag()==null) return false;
- if (SYSTEM_ENRICHER_UNIQUE_TAGS.contains(enr.getUniqueTag())) return true;
- return false;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAndAttribute.java
----------------------------------------------------------------------
diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAndAttribute.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAndAttribute.java
deleted file mode 100644
index 037722c..0000000
--- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/entity/EntityAndAttribute.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.brooklyn.core.entity;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityLocal;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Supplier;
-
-/**
- * A tuple containing an {@link Entity} and an {@link AttributeSensor}, which is assumed to be present on the entity.
- * <p>
- * Allows retrieval of the attribute {@link #getValue() value} or can be used instead where a {@link Supplier} for
- * the attribute value is required.
- */
-public class EntityAndAttribute<T> implements Supplier<T> {
-
- private final Entity entity;
- private final AttributeSensor<T> attribute;
-
- public static <T> EntityAndAttribute<T> create(Entity entity, AttributeSensor<T> attribute) {
- return new EntityAndAttribute<T>(entity, attribute);
- }
-
- /**
- * @deprecated since 0.7.0; use {@link #create(Entity, AttributeSensor)}; this does not relate to {@link Supplier}
- */
- public static <T> EntityAndAttribute<T> supplier(Entity entity, AttributeSensor<T> attribute) {
- return create(entity, attribute);
- }
-
- public EntityAndAttribute(Entity entity, AttributeSensor<T> attribute) {
- this.entity = checkNotNull(entity, "entity");
- this.attribute = checkNotNull(attribute, "attribute");
- }
-
- public Entity getEntity() {
- return entity;
- }
-
- public AttributeSensor<T> getAttribute() {
- return attribute;
- }
-
- public T getValue() {
- return entity.getAttribute(attribute);
- }
-
- public void setValue(T val) {
- ((EntityLocal)entity).sensors().set(attribute, val);
- }
-
- /**
- * {@inheritDoc}
- *
- * Returns the current value of the {@link #getAttribute() attribute} on the {@link #getEntity() entity}.
- *
- * @see #getValue()
- */
- @Override
- public T get() {
- return getValue();
- }
-
- @Override
- public String toString() {
- return Objects.toStringHelper(this)
- .add("entity", entity)
- .add("attribute", attribute)
- .toString();
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(entity, attribute);
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == null) return false;
- if (!(o instanceof EntityAndAttribute)) return false;
- EntityAndAttribute<?> that = (EntityAndAttribute<?>) o;
- return Objects.equal(this.entity, that.entity) &&
- Objects.equal(this.attribute, that.attribute);
- }
-
-}