You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ha...@apache.org on 2015/08/05 22:56:22 UTC
[18/20] incubator-brooklyn git commit: Package rename to
org.apache.brooklyn: usage/camp/
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
deleted file mode 100644
index 699bc12..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
+++ /dev/null
@@ -1,193 +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 io.brooklyn.camp.brooklyn.spi.creation;
-
-import io.brooklyn.camp.brooklyn.BrooklynCampConstants;
-import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-import io.brooklyn.camp.spi.PlatformComponentTemplate.Builder;
-import io.brooklyn.camp.spi.pdp.AssemblyTemplateConstructor;
-import io.brooklyn.camp.spi.pdp.Service;
-import io.brooklyn.camp.spi.resolve.PdpMatcher;
-
-import java.util.List;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.catalog.internal.BasicBrooklynCatalog;
-import brooklyn.management.ManagementContext;
-import brooklyn.management.classloading.BrooklynClassLoadingContext;
-import brooklyn.management.classloading.JavaBrooklynClassLoadingContext;
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.net.Urls;
-import brooklyn.util.text.Strings;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-public class BrooklynEntityMatcher implements PdpMatcher {
-
- private static final Logger log = LoggerFactory.getLogger(BrooklynEntityMatcher.class);
-
- protected final ManagementContext mgmt;
-
- public BrooklynEntityMatcher(ManagementContext bmc) {
- this.mgmt = bmc;
- }
-
- @Override
- public boolean accepts(Object deploymentPlanItem) {
- return lookupType(deploymentPlanItem) != null;
- }
-
- /** returns the type of the given plan item,
- * typically whether a Service can be matched to a Brooklyn entity,
- * or null if not supported */
- protected String lookupType(Object deploymentPlanItem) {
- if (deploymentPlanItem instanceof Service) {
- Service service = (Service)deploymentPlanItem;
-
- String serviceType = service.getServiceType();
- BrooklynClassLoadingContext loader = BasicBrooklynCatalog.BrooklynLoaderTracker.getLoader();
- if (loader == null) loader = JavaBrooklynClassLoadingContext.create(mgmt);
- if (BrooklynComponentTemplateResolver.Factory.supportsType(loader, serviceType))
- return serviceType;
-
- String protocol = Urls.getProtocol(serviceType);
- if (protocol != null) {
- if (BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST.contains(protocol)) {
- return serviceType;
- } else {
- log.debug("The reference '" + serviceType + "' looks like a URL (running the CAMP Brooklyn entity-matcher) but the protocol '" +
- protocol + "' isn't white listed " + BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST + ". " +
- "Not recognized as catalog item or java item as well!");
- }
- }
- }
- return null;
- }
-
- @Override
- public boolean apply(Object deploymentPlanItem, AssemblyTemplateConstructor atc) {
- if (!(deploymentPlanItem instanceof Service)) return false;
-
- String type = lookupType(deploymentPlanItem);
- if (type==null) return false;
-
- log.debug("Item "+deploymentPlanItem+" being instantiated with "+type);
-
- Object old = atc.getInstantiator();
- if (old!=null && !old.equals(BrooklynAssemblyTemplateInstantiator.class)) {
- log.warn("Can't mix Brooklyn entities with non-Brooklyn entities (at present): "+old);
- return false;
- }
-
- // TODO should we build up a new type, BrooklynEntityComponentTemplate here
- // complete w EntitySpec -- ie merge w BrooklynComponentTemplateResolver ?
-
- Builder<? extends PlatformComponentTemplate> builder = PlatformComponentTemplate.builder();
- builder.type( type.indexOf(':')==-1 ? "brooklyn:"+type : type );
-
- // currently instantiator must be brooklyn at the ATC level
- // optionally would be nice to support multiple/mixed instantiators,
- // ie at the component level, perhaps with the first one responsible for building the app
- atc.instantiator(BrooklynAssemblyTemplateInstantiator.class);
-
- String name = ((Service)deploymentPlanItem).getName();
- if (!Strings.isBlank(name)) builder.name(name);
-
- // configuration
- Map<String, Object> attrs = MutableMap.copyOf( ((Service)deploymentPlanItem).getCustomAttributes() );
-
- if (attrs.containsKey("id"))
- builder.customAttribute("planId", attrs.remove("id"));
-
- Object location = attrs.remove("location");
- if (location!=null)
- builder.customAttribute("location", location);
- Object locations = attrs.remove("locations");
- if (locations!=null)
- builder.customAttribute("locations", locations);
-
- MutableMap<Object, Object> brooklynFlags = MutableMap.of();
- Object origBrooklynFlags = attrs.remove(BrooklynCampReservedKeys.BROOKLYN_FLAGS);
- if (origBrooklynFlags!=null) {
- if (!(origBrooklynFlags instanceof Map))
- throw new IllegalArgumentException("brooklyn.flags must be a map of brooklyn flags");
- brooklynFlags.putAll((Map<?,?>)origBrooklynFlags);
- }
-
- addCustomMapAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_CONFIG);
- addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_POLICIES);
- addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_ENRICHERS);
- addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_INITIALIZERS);
- addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_CHILDREN);
- addCustomMapAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_CATALOG);
-
- brooklynFlags.putAll(attrs);
- if (!brooklynFlags.isEmpty()) {
- builder.customAttribute(BrooklynCampReservedKeys.BROOKLYN_FLAGS, brooklynFlags);
- }
-
- atc.add(builder.build());
-
- return true;
- }
-
- /**
- * Looks for the given key in the map of attributes and adds it to the given builder
- * as a custom attribute with type List.
- * @throws java.lang.IllegalArgumentException if map[key] is not an instance of List
- */
- private void addCustomListAttributeIfNonNull(Builder<? extends PlatformComponentTemplate> builder, Map<?,?> attrs, String key) {
- Object items = attrs.remove(key);
- if (items != null) {
- if (items instanceof List) {
- List<?> itemList = (List<?>) items;
- if (!itemList.isEmpty()) {
- builder.customAttribute(key, Lists.newArrayList(itemList));
- }
- } else {
- throw new IllegalArgumentException(key + " must be a list, is: " + items.getClass().getName());
- }
- }
- }
-
- /**
- * Looks for the given key in the map of attributes and adds it to the given builder
- * as a custom attribute with type Map.
- * @throws java.lang.IllegalArgumentException if map[key] is not an instance of Map
- */
- private void addCustomMapAttributeIfNonNull(Builder<? extends PlatformComponentTemplate> builder, Map<?,?> attrs, String key) {
- Object items = attrs.remove(key);
- if (items != null) {
- if (items instanceof Map) {
- Map<?, ?> itemMap = (Map<?, ?>) items;
- if (!itemMap.isEmpty()) {
- builder.customAttribute(key, Maps.newHashMap(itemMap));
- }
- } else {
- throw new IllegalArgumentException(key + " must be a map, is: " + items.getClass().getName());
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java
deleted file mode 100644
index 3495687..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlLocationResolver.java
+++ /dev/null
@@ -1,142 +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 io.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import brooklyn.location.Location;
-import brooklyn.location.LocationDefinition;
-import brooklyn.management.ManagementContext;
-import brooklyn.util.collections.MutableList;
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.guava.Maybe;
-import brooklyn.util.guava.Maybe.Absent;
-import brooklyn.util.text.Strings;
-
-import com.google.common.collect.Iterables;
-
-public class BrooklynYamlLocationResolver {
-
- protected final ManagementContext mgmt;
-
- public BrooklynYamlLocationResolver(ManagementContext bmc) {
- this.mgmt = bmc;
- }
-
- /** returns list of locations, if any were supplied, or null if none indicated */
- @SuppressWarnings("unchecked")
- public List<Location> resolveLocations(Map<? super String,?> attrs, boolean removeUsedAttributes) {
- Object location = attrs.get("location");
- Object locations = attrs.get("locations");
-
- if (location==null && locations==null)
- return null;
-
- Location locationFromString = null;
- List<Location> locationsFromList = null;
-
- if (location!=null) {
- if (location instanceof String) {
- locationFromString = resolveLocationFromString((String)location);
- } else if (location instanceof Map) {
- locationFromString = resolveLocationFromMap((Map<?,?>)location);
- } else {
- throw new IllegalStateException("Illegal parameter for 'location'; must be a string or map (but got "+location+")");
- }
- }
-
- if (locations!=null) {
- if (!(locations instanceof Iterable))
- throw new IllegalStateException("Illegal parameter for 'locations'; must be an iterable (but got "+locations+")");
- locationsFromList = resolveLocations( (Iterable<Object>)locations );
- }
-
- if (locationFromString!=null && locationsFromList!=null) {
- if (locationsFromList.size() != 1)
- throw new IllegalStateException("Conflicting 'location' and 'locations' ("+location+" and "+locations+"); "
- + "if both are supplied the list must have exactly one element being the same");
- if (!locationFromString.equals( Iterables.getOnlyElement(locationsFromList) ))
- throw new IllegalStateException("Conflicting 'location' and 'locations' ("+location+" and "+locations+"); "
- + "different location specified in each");
- } else if (locationFromString!=null) {
- locationsFromList = Arrays.asList(locationFromString);
- }
-
- return locationsFromList;
- }
-
- public List<Location> resolveLocations(Iterable<Object> locations) {
- List<Location> result = MutableList.of();
- for (Object l: locations) {
- Location ll = resolveLocation(l);
- if (ll!=null) result.add(ll);
- }
- return result;
- }
-
- public Location resolveLocation(Object location) {
- if (location instanceof String) {
- return resolveLocationFromString((String)location);
- } else if (location instanceof Map) {
- return resolveLocationFromMap((Map<?,?>)location);
- }
- // could support e.g. location definition
- throw new IllegalStateException("Illegal parameter for 'location' ("+location+"); must be a string or map");
- }
-
- /** resolves the location from the given spec string, either "Named Location", or "named:Named Location" format;
- * returns null if input is blank (or null); otherwise guaranteed to resolve or throw error */
- public Location resolveLocationFromString(String location) {
- if (Strings.isBlank(location)) return null;
- return resolveLocation(location, MutableMap.of());
- }
-
- public Location resolveLocationFromMap(Map<?,?> location) {
- if (location.size() > 1) {
- throw new IllegalStateException("Illegal parameter for 'location'; expected a single entry in map ("+location+")");
- }
- Object key = Iterables.getOnlyElement(location.keySet());
- Object value = location.get(key);
-
- if (!(key instanceof String)) {
- throw new IllegalStateException("Illegal parameter for 'location'; expected String key ("+location+")");
- }
- if (!(value instanceof Map)) {
- throw new IllegalStateException("Illegal parameter for 'location'; expected config map ("+location+")");
- }
- return resolveLocation((String)key, (Map<?,?>)value);
- }
-
- protected Location resolveLocation(String spec, Map<?,?> flags) {
- LocationDefinition ldef = mgmt.getLocationRegistry().getDefinedLocationByName((String)spec);
- if (ldef!=null)
- // found it as a named location
- return mgmt.getLocationRegistry().resolve(ldef, null, flags).get();
-
- Maybe<Location> l = mgmt.getLocationRegistry().resolve(spec, null, flags);
- if (l.isPresent()) return l.get();
-
- RuntimeException exception = ((Absent<?>)l).getException();
- throw new IllegalStateException("Illegal parameter for 'location' ("+spec+"); not resolvable: "+
- Exceptions.collapseText( exception ), exception);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
deleted file mode 100644
index b78f359..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
+++ /dev/null
@@ -1,208 +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 io.brooklyn.camp.brooklyn.spi.creation;
-
-import java.util.Map;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.management.classloading.BrooklynClassLoadingContext;
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.config.ConfigBag;
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.guava.Maybe;
-import brooklyn.util.javalang.Reflections;
-import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-/** Assists in loading types referenced from YAML;
- * mainly as a way to share logic used in very different contexts. */
-public abstract class BrooklynYamlTypeInstantiator {
-
- private static final Logger log = LoggerFactory.getLogger(BrooklynYamlTypeInstantiator.class);
-
- protected final Factory factory;
-
- @Beta
- public static class Factory {
- final BrooklynClassLoadingContext loader;
- final Object contextForLogging;
-
- public Factory(BrooklynClassLoadingContext loader, Object contextForLogging) {
- this.loader = loader;
- this.contextForLogging = contextForLogging;
- }
-
- public InstantiatorFromKey from(Map<?,?> data) {
- return new InstantiatorFromKey(this, ConfigBag.newInstance(data));
- }
-
- public InstantiatorFromKey from(ConfigBag data) {
- return new InstantiatorFromKey(this, data);
- }
-
- public InstantiatorFromName type(String typeName) {
- return new InstantiatorFromName(this, typeName);
- }
-
- }
-
- public static class InstantiatorFromKey extends BrooklynYamlTypeInstantiator {
- protected final ConfigBag data;
- protected String typeKeyPrefix = null;
-
- /** Nullable only permitted for instances which do not do loading, e.g. LoaderFromKey#lookup */
- protected InstantiatorFromKey(@Nullable Factory factory, ConfigBag data) {
- super(factory);
- this.data = data;
- }
-
- public static Maybe<String> extractTypeName(String prefix, ConfigBag data) {
- if (data==null) return Maybe.absent();
- return new InstantiatorFromKey(null, data).prefix(prefix).getTypeName();
- }
-
- public InstantiatorFromKey prefix(String prefix) {
- typeKeyPrefix = prefix;
- return this;
- }
-
- public Maybe<String> getTypeName() {
- Maybe<Object> result = data.getStringKeyMaybe(getPreferredKeyName());
- if (result.isAbsent() && typeKeyPrefix!=null) {
- // try alternatives if a prefix was specified
- result = data.getStringKeyMaybe(typeKeyPrefix+"Type");
- if (result.isAbsent()) result = data.getStringKeyMaybe("type");
- }
-
- if (result.isAbsent() || result.get()==null)
- return Maybe.absent("Missing key '"+getPreferredKeyName()+"'");
-
- if (result.get() instanceof String) return Maybe.of((String)result.get());
-
- throw new IllegalArgumentException("Invalid value "+result.get().getClass()+" for "+getPreferredKeyName()+"; "
- + "expected String, got "+result.get());
- }
-
- protected String getPreferredKeyName() {
- if (typeKeyPrefix!=null) return typeKeyPrefix+"_type";
- return "type";
- }
-
- /** as {@link #newInstance(Class)} but inferring the type */
- public Object newInstance() {
- return newInstance(null);
- }
-
- /** creates a new instance of the type referred to by this description,
- * as a subtype of the type supplied here,
- * inferring a Map from <code>brooklyn.config</code> key.
- * TODO in future also picking up recognized flags and config keys (those declared on the type).
- * <p>
- * constructs the object using:
- * <li> a constructor on the class taking a Map
- * <li> a no-arg constructor, only if the inferred map is empty
- **/
- public <T> T newInstance(@Nullable Class<T> supertype) {
- Class<? extends T> type = getType(supertype);
- Map<String, ?> cfg = getConfigMap();
- Optional<? extends T> result = Reflections.invokeConstructorWithArgs(type, cfg);
- if (result.isPresent())
- return result.get();
-
- ConfigBag cfgBag = ConfigBag.newInstance(cfg);
- result = Reflections.invokeConstructorWithArgs(type, cfgBag);
- if (result.isPresent())
- return result.get();
-
- if (cfg.isEmpty()) {
- result = Reflections.invokeConstructorWithArgs(type);
- if (result.isPresent())
- return result.get();
- }
-
- throw new IllegalStateException("No known mechanism for constructing type "+type+" in "+factory.contextForLogging);
- }
-
- /** finds the map of config for the type specified;
- * currently only gets <code>brooklyn.config</code>, returning empty map if none,
- * but TODO in future should support recognized flags and config keys (those declared on the type),
- * incorporating code in {@link BrooklynEntityMatcher}.
- */
- @SuppressWarnings("unchecked")
- @Nonnull
- public Map<String,?> getConfigMap() {
- MutableMap<String,Object> result = MutableMap.of();
- Object bc = data.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CONFIG);
- if (bc!=null) {
- if (bc instanceof Map)
- result.putAll((Map<? extends String, ?>) bc);
- else
- throw new IllegalArgumentException("brooklyn.config key in "+factory.contextForLogging+" should be a map, not "+bc.getClass()+" ("+bc+")");
- }
- return result;
- }
-
- }
-
- public static class InstantiatorFromName extends BrooklynYamlTypeInstantiator {
- protected final String typeName;
- protected InstantiatorFromName(Factory factory, String typeName) {
- super(factory);
- this.typeName = typeName;
- }
-
- public Maybe<String> getTypeName() {
- return Maybe.fromNullable(typeName);
- }
- }
-
- protected BrooklynYamlTypeInstantiator(Factory factory) {
- this.factory = factory;
- }
-
- public abstract Maybe<String> getTypeName();
-
- public BrooklynClassLoadingContext getClassLoadingContext() {
- Preconditions.checkNotNull(factory, "No factory set; cannot use this instance for type loading");
- return factory.loader;
- }
-
- public Class<?> getType() {
- return getType(Object.class);
- }
-
- public <T> Class<? extends T> getType(@Nonnull Class<T> type) {
- try {
- return getClassLoadingContext().loadClass(getTypeName().get(), type);
- } catch (Exception e) {
- Exceptions.propagateIfFatal(e);
- log.debug("Unable to resolve " + type + " " + getTypeName().get() + " (rethrowing) in spec " + factory.contextForLogging);
- throw Exceptions.propagate(e);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/EntitySpecConfiguration.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/EntitySpecConfiguration.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/EntitySpecConfiguration.java
deleted file mode 100644
index 7d9a62a..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/EntitySpecConfiguration.java
+++ /dev/null
@@ -1,58 +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 io.brooklyn.camp.brooklyn.spi.creation;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.entity.proxying.EntitySpec;
-
-import com.google.common.collect.Maps;
-
-/**
- * Captures the {@link EntitySpec} configuration defined in YAML.
- *
- * This class does not parse that output; it just stores it.
- */
-public class EntitySpecConfiguration {
-
- @SuppressWarnings("unused")
- private static final Logger LOG = LoggerFactory.getLogger(EntitySpecConfiguration.class);
-
- private Map<String, Object> specConfiguration;
-
- public EntitySpecConfiguration(Map<String, ?> specConfiguration) {
- this.specConfiguration = Maps.newHashMap(checkNotNull(specConfiguration, "specConfiguration"));
- }
-
- public Map<String, Object> getSpecConfiguration() {
- return specConfiguration;
- }
-
- /**
- * Allows BrooklynComponentTemplateResolver to traverse the configuration and resolve any entity specs
- */
- public void setSpecConfiguration(Map<String, Object> specConfiguration) {
- this.specConfiguration = specConfiguration;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java
deleted file mode 100644
index 8796d0d..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java
+++ /dev/null
@@ -1,72 +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 io.brooklyn.camp.brooklyn.spi.creation.service;
-
-import io.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver;
-import io.brooklyn.camp.brooklyn.spi.creation.BrooklynEntityDecorationResolver;
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-
-import javax.annotation.Nullable;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.brooklyn.catalog.CatalogItem;
-import brooklyn.catalog.internal.CatalogUtils;
-import brooklyn.entity.Entity;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.util.text.Strings;
-
-/**
- * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code brooklyn:}
- * to Brooklyn {@link EntitySpec} instances.
- */
-public class BrooklynServiceTypeResolver implements ServiceTypeResolver {
-
- private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
-
- @Override
- public String getTypePrefix() { return DEFAULT_TYPE_PREFIX; }
-
- @Override
- public String getBrooklynType(String serviceType) {
- String type = Strings.removeFromStart(serviceType, getTypePrefix() + ":").trim();
- if (type == null) return null;
- return type;
- }
-
- @Nullable
- @Override
- public CatalogItem<Entity,EntitySpec<?>> getCatalogItem(BrooklynComponentTemplateResolver resolver, String serviceType) {
- String type = getBrooklynType(serviceType);
- if (type != null) {
- return CatalogUtils.getCatalogItemOptionalVersion(resolver.getManagementContext(), Entity.class, type);
- } else {
- return null;
- }
- }
-
- @Override
- public <T extends Entity> void decorateSpec(BrooklynComponentTemplateResolver resolver, EntitySpec<T> spec) {
- new BrooklynEntityDecorationResolver.PolicySpecResolver(resolver.getYamlLoader()).decorate(spec, resolver.getAttrs());
- new BrooklynEntityDecorationResolver.EnricherSpecResolver(resolver.getYamlLoader()).decorate(spec, resolver.getAttrs());
- new BrooklynEntityDecorationResolver.InitializerResolver(resolver.getYamlLoader()).decorate(spec, resolver.getAttrs());
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java
deleted file mode 100644
index d082b13..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java
+++ /dev/null
@@ -1,78 +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 io.brooklyn.camp.brooklyn.spi.creation.service;
-
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.entity.basic.VanillaSoftwareProcess;
-import brooklyn.entity.brooklynnode.BrooklynNode;
-import brooklyn.entity.group.DynamicCluster;
-import brooklyn.entity.group.DynamicRegionsFabric;
-import brooklyn.entity.java.VanillaJavaApp;
-import brooklyn.entity.proxying.EntitySpec;
-
-import com.google.common.base.CaseFormat;
-import com.google.common.base.Converter;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code catalog:}
- * to Brooklyn {@link EntitySpec} instances.
- */
-public class CatalogServiceTypeResolver extends BrooklynServiceTypeResolver {
-
- private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
-
- // TODO currently a hardcoded list of aliases; would like that to come from mgmt somehow
- private static final Map<String, String> CATALOG_TYPES = ImmutableMap.<String, String>builder()
- .put("cluster", DynamicCluster.class.getName())
- .put("fabric", DynamicRegionsFabric.class.getName())
- .put("vanilla", VanillaSoftwareProcess.class.getName())
- .put("software-process", VanillaSoftwareProcess.class.getName())
- .put("java-app", VanillaJavaApp.class.getName())
- .put("brooklyn-node", BrooklynNode.class.getName())
- .put("web-app-cluster","brooklyn.entity.webapp.ControlledDynamicWebAppCluster")
- .build();
-
- // Allow catalog-type or CatalogType as service type string
- private static final Converter<String, String> FMT = CaseFormat.LOWER_HYPHEN.converterTo(CaseFormat.UPPER_CAMEL);
-
- @Override
- public String getTypePrefix() { return "catalog"; }
-
- @Override
- public String getBrooklynType(String serviceType) {
- String type = super.getBrooklynType(serviceType);
- if (type == null) return null;
-
- for (String check : CATALOG_TYPES.keySet()) {
- if (type.equals(check) || type.equals(FMT.convert(check))) {
- return CATALOG_TYPES.get(check);
- }
- }
-
- return type;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java
deleted file mode 100644
index c9ff893..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java
+++ /dev/null
@@ -1,62 +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 io.brooklyn.camp.brooklyn.spi.creation.service;
-
-import io.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver;
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.brooklyn.catalog.CatalogItem;
-import brooklyn.entity.Entity;
-import brooklyn.entity.chef.ChefConfig;
-import brooklyn.entity.chef.ChefEntity;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.util.text.Strings;
-
-/**
- * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code chef:}
- * to Brooklyn {@link EntitySpec} instances.
- */
-public class ChefServiceTypeResolver extends BrooklynServiceTypeResolver {
-
- private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
-
- @Override
- public String getTypePrefix() { return "chef"; }
-
- @Override
- public String getBrooklynType(String serviceType) {
- return ChefEntity.class.getName();
- }
-
- /** Chef items are not in the catalog. */
- @Override
- public CatalogItem<Entity, EntitySpec<?>> getCatalogItem(BrooklynComponentTemplateResolver resolver, String serviceType) {
- return null;
- }
-
- @Override
- public <T extends Entity> void decorateSpec(BrooklynComponentTemplateResolver resolver, EntitySpec<T> spec) {
- spec.configure(ChefConfig.CHEF_COOKBOOK_PRIMARY_NAME, Strings.removeFromStart(resolver.getDeclaredType(), "chef:"));
- super.decorateSpec(resolver, spec);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java
deleted file mode 100644
index f348ea8..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java
+++ /dev/null
@@ -1,39 +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 io.brooklyn.camp.brooklyn.spi.creation.service;
-
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.entity.proxying.EntitySpec;
-
-/**
- * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code java:}
- * to Brooklyn {@link EntitySpec} instances.
- */
-public class JavaServiceTypeResolver extends BrooklynServiceTypeResolver {
-
- private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
-
- @Override
- public String getTypePrefix() { return "java"; }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java
deleted file mode 100644
index 21b48d6..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java
+++ /dev/null
@@ -1,73 +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 io.brooklyn.camp.brooklyn.spi.creation.service;
-
-import java.util.ServiceLoader;
-
-import io.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver;
-import org.apache.brooklyn.catalog.CatalogItem;
-import brooklyn.entity.Entity;
-import brooklyn.entity.proxying.EntitySpec;
-
-/**
- * Resolves and decorates {@link EntitySpec entity specifications} based on the {@code serviceType} in a template.
- * <p>
- * The {@link #getTypePrefix()} method returns a string that should match the beginning of the
- * service type. The resolver implementation will use the rest of the service type information
- * to create and decorate an approprate {@link EntitySpec entity}.
- * <p>
- * The resolvers are loaded using the {@link ServiceLoader} mechanism, allowing external libraries
- * to add extra service type implementations that will be picked up at runtime.
- *
- * @see BrooklynServiceTypeResolver
- * @see ChefServiceTypeResolver
- */
-public interface ServiceTypeResolver {
-
- String DEFAULT_TYPE_PREFIX = "brooklyn";
-
- /**
- * The service type prefix the resolver is responsible for.
- */
- String getTypePrefix();
-
- /**
- * The name of the Java type that Brooklyn will instantiate to create the
- * service. This can be generated from parts of the service type information
- * or may be a fixed value.
- */
- String getBrooklynType(String serviceType);
-
- /**
- * Returns the {@link CatalogItem} if there is one for the given type.
- * <p>
- * If no type, callers should fall back to default classloading.
- */
- CatalogItem<Entity, EntitySpec<?>> getCatalogItem(BrooklynComponentTemplateResolver resolver, String serviceType);
-
- /**
- * Takes the provided {@link EntitySpec} and decorates it appropriately for the service type.
- * <p>
- * This includes setting configuration and adding policies, enrichers and initializers.
- *
- * @see BrooklynServiceTypeResolver#decorateSpec(BrooklynComponentTemplateResolver, EntitySpec)
- */
- <T extends Entity> void decorateSpec(BrooklynComponentTemplateResolver resolver, EntitySpec<T> spec);
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslDeferredSupplier.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslDeferredSupplier.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslDeferredSupplier.java
deleted file mode 100644
index 4f65a77..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslDeferredSupplier.java
+++ /dev/null
@@ -1,99 +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 io.brooklyn.camp.brooklyn.spi.dsl;
-
-import java.io.Serializable;
-
-import io.brooklyn.camp.spi.Assembly;
-import io.brooklyn.camp.spi.AssemblyTemplate;
-import io.brooklyn.camp.spi.resolve.interpret.PlanInterpretationNode;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityInternal;
-import brooklyn.entity.effector.EffectorTasks;
-import brooklyn.management.Task;
-import brooklyn.management.TaskFactory;
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.task.DeferredSupplier;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/** provide an object suitable to resolve chained invocations in a parsed YAML / Deployment Plan DSL,
- * which also implements {@link DeferredSupplier} so that they can be resolved when needed
- * (e.g. when entity-lookup and execution contexts are available).
- * <p>
- * implementations of this abstract class are expected to be immutable,
- * as instances must support usage in multiple {@link Assembly} instances
- * created from a single {@link AssemblyTemplate}
- * <p>
- * subclasses which return a deferred value are typically only
- * resolvable in the context of a {@link Task} on an {@link Entity};
- * these should be only used as the value of a {@link ConfigKey} set in the YAML,
- * and should not accessed until after the components / entities are created
- * and are being started.
- * (TODO the precise semantics of this are under development.)
- * <p>
- **/
-public abstract class BrooklynDslDeferredSupplier<T> implements DeferredSupplier<T>, TaskFactory<Task<T>>, Serializable {
-
- private static final long serialVersionUID = -8789624905412198233L;
-
- private static final Logger log = LoggerFactory.getLogger(BrooklynDslDeferredSupplier.class);
-
- // TODO json of this object should *be* this, not wrapped this ($brooklyn:literal is a bit of a hack, though it might work!)
- @JsonInclude
- @JsonProperty(value="$brooklyn:literal")
- // currently marked transient because it's only needed for logging
- private transient Object dsl = "(gone)";
-
- public BrooklynDslDeferredSupplier() {
- PlanInterpretationNode sourceNode = BrooklynDslInterpreter.currentNode();
- dsl = sourceNode!=null ? sourceNode.getOriginalValue() : null;
- }
-
- /** returns the current entity; for use in implementations of {@link #get()} */
- protected final static EntityInternal entity() {
- // rely on implicit ThreadLocal for now
- return (EntityInternal) EffectorTasks.findEntity();
- }
-
- @Override
- public final synchronized T get() {
- try {
- if (log.isDebugEnabled())
- log.debug("Queuing task to resolve "+dsl);
- T result = Entities.submit(entity(), newTask()).get();
- if (log.isDebugEnabled())
- log.debug("Resolved "+result+" from "+dsl);
- return result;
- } catch (Exception e) {
- throw Exceptions.propagate(e);
- }
- }
-
- @Override
- public abstract Task<T> newTask();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java
deleted file mode 100644
index d661403..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/BrooklynDslInterpreter.java
+++ /dev/null
@@ -1,188 +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 io.brooklyn.camp.brooklyn.spi.dsl;
-
-import io.brooklyn.camp.brooklyn.spi.dsl.methods.BrooklynDslCommon;
-import io.brooklyn.camp.brooklyn.spi.dsl.parse.DslParser;
-import io.brooklyn.camp.brooklyn.spi.dsl.parse.FunctionWithArgs;
-import io.brooklyn.camp.brooklyn.spi.dsl.parse.QuotedString;
-import io.brooklyn.camp.spi.resolve.PlanInterpreter;
-import io.brooklyn.camp.spi.resolve.PlanInterpreter.PlanInterpreterAdapter;
-import io.brooklyn.camp.spi.resolve.interpret.PlanInterpretationNode;
-import io.brooklyn.camp.spi.resolve.interpret.PlanInterpretationNode.Role;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.javalang.Reflections;
-import brooklyn.util.text.Strings;
-
-import com.google.common.base.Optional;
-
-/**
- * {@link PlanInterpreter} which understands the $brooklyn DSL
- */
-public class BrooklynDslInterpreter extends PlanInterpreterAdapter {
-
- private static final Logger log = LoggerFactory.getLogger(BrooklynDslInterpreter.class);
-
- @Override
- public boolean isInterestedIn(PlanInterpretationNode node) {
- return node.matchesPrefix("$brooklyn:") || node.getNewValue() instanceof FunctionWithArgs;
- }
-
- private static ThreadLocal<PlanInterpretationNode> currentNode = new ThreadLocal<PlanInterpretationNode>();
- /** returns the current node, stored in a thread-local, to populate the dsl field of {@link BrooklynDslDeferredSupplier} instances */
- public static PlanInterpretationNode currentNode() {
- return currentNode.get();
- }
- /** sets the current node */
- public static void currentNode(PlanInterpretationNode node) {
- currentNode.set(node);
- }
- public static void currentNodeClear() {
- currentNode.set(null);
- }
-
- @Override
- public void applyYamlPrimitive(PlanInterpretationNode node) {
- String expression = node.getNewValue().toString();
-
- try {
- currentNode.set(node);
- Object parsedNode = new DslParser(expression).parse();
- if ((parsedNode instanceof FunctionWithArgs) && ((FunctionWithArgs)parsedNode).getArgs()==null) {
- if (node.getRoleInParent() == Role.MAP_KEY) {
- node.setNewValue(parsedNode);
- // will be handled later
- } else {
- throw new IllegalStateException("Invalid function-only expression '"+((FunctionWithArgs)parsedNode).getFunction()+"'");
- }
- } else {
- node.setNewValue( evaluate(parsedNode, true) );
- }
- } catch (Exception e) {
- log.warn("Error evaluating node (rethrowing) '"+expression+"': "+e);
- Exceptions.propagateIfFatal(e);
- throw new IllegalArgumentException("Error evaluating node '"+expression+"'", e);
- } finally {
- currentNodeClear();
- }
- }
-
- @Override
- public boolean applyMapEntry(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut,
- PlanInterpretationNode key, PlanInterpretationNode value) {
- if (key.getNewValue() instanceof FunctionWithArgs) {
- try {
- currentNode.set(node);
-
- FunctionWithArgs f = (FunctionWithArgs) key.getNewValue();
- if (f.getArgs()!=null)
- throw new IllegalStateException("Invalid map key function "+f.getFunction()+"; should not have arguments if taking arguments from map");
-
- // means evaluation acts on values
- List<Object> args = new ArrayList<Object>();
- if (value.getNewValue() instanceof Iterable<?>) {
- for (Object vi: (Iterable<?>)value.getNewValue())
- args.add(vi);
- } else {
- args.add(value.getNewValue());
- }
-
- try {
- // TODO in future we should support functions of the form 'Maps.clear', 'Maps.reset', 'Maps.remove', etc;
- // default approach only supported if mapIn has single item and mapOut is empty
- if (mapIn.size()!=1)
- throw new IllegalStateException("Map-entry DSL syntax only supported with single item in map, not "+mapIn);
- if (mapOut.size()!=0)
- throw new IllegalStateException("Map-entry DSL syntax only supported with empty output map-so-far, not "+mapOut);
-
- node.setNewValue( evaluate(new FunctionWithArgs(f.getFunction(), args), false) );
- return false;
- } catch (Exception e) {
- log.warn("Error evaluating map-entry (rethrowing) '"+f.getFunction()+args+"': "+e);
- Exceptions.propagateIfFatal(e);
- throw new IllegalArgumentException("Error evaluating map-entry '"+f.getFunction()+args+"'", e);
- }
-
- } finally {
- currentNodeClear();
- }
- }
- return super.applyMapEntry(node, mapIn, mapOut, key, value);
- }
-
- public Object evaluate(Object f, boolean deepEvaluation) {
- if (f instanceof FunctionWithArgs) {
- return evaluateOn(BrooklynDslCommon.class, (FunctionWithArgs) f, deepEvaluation);
- }
-
- if (f instanceof List) {
- Object o = BrooklynDslCommon.class;
- for (Object i: (List<?>)f) {
- o = evaluateOn( o, (FunctionWithArgs)i, deepEvaluation );
- }
- return o;
- }
-
- if (f instanceof QuotedString) {
- return ((QuotedString)f).unwrapped();
- }
-
- throw new IllegalArgumentException("Unexpected element in parse tree: '"+f+"' (type "+(f!=null ? f.getClass() : null)+")");
- }
-
- public Object evaluateOn(Object o, FunctionWithArgs f, boolean deepEvaluation) {
- if (f.getArgs()==null)
- throw new IllegalStateException("Invalid function-only expression '"+f.getFunction()+"'");
-
- Class<?> clazz;
- if (o instanceof Class) {
- clazz = (Class<?>)o;
- } else {
- clazz = o.getClass();
- }
- if (!(clazz.getPackage().getName().startsWith(BrooklynDslCommon.class.getPackage().getName())))
- throw new IllegalArgumentException("Not permitted to invoke function on '"+clazz+"' (outside allowed package scope)");
-
- String fn = f.getFunction();
- fn = Strings.removeFromStart(fn, "$brooklyn:");
- try {
- List<Object> args = new ArrayList<Object>();
- for (Object arg: f.getArgs()) {
- args.add( deepEvaluation ? evaluate(arg, true) : arg );
- }
- Optional<Object> v = Reflections.invokeMethodWithArgs(o, fn, args);
- if (v.isPresent()) return v.get();
- } catch (Exception e) {
- Exceptions.propagateIfFatal(e);
- throw Exceptions.propagate(new InvocationTargetException(e, "Error invoking '"+fn+"' on '"+o+"'"));
- }
-
- throw new IllegalArgumentException("No such function '"+fn+"' on "+o);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java
deleted file mode 100644
index 7ad8abe..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/DslUtils.java
+++ /dev/null
@@ -1,44 +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 io.brooklyn.camp.brooklyn.spi.dsl;
-
-import brooklyn.util.task.DeferredSupplier;
-
-import com.google.common.collect.Iterables;
-
-public class DslUtils {
-
- /** true iff none of the args are deferred / tasks */
- public static boolean resolved(Iterable<Object> args) {
- return resolved(Iterables.toArray(args, Object.class));
- }
-
- /** true iff none of the args are deferred / tasks */
- public static boolean resolved(final Object... args) {
- boolean allResolved = true;
- for (Object arg: args) {
- if (arg instanceof DeferredSupplier<?>) {
- allResolved = false;
- break;
- }
- }
- return allResolved;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
deleted file mode 100644
index efcdd49..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ /dev/null
@@ -1,302 +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 io.brooklyn.camp.brooklyn.spi.dsl.methods;
-
-import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
-import io.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator;
-import io.brooklyn.camp.brooklyn.spi.creation.EntitySpecConfiguration;
-import io.brooklyn.camp.brooklyn.spi.dsl.BrooklynDslDeferredSupplier;
-import io.brooklyn.camp.brooklyn.spi.dsl.DslUtils;
-import io.brooklyn.camp.brooklyn.spi.dsl.methods.DslComponent.Scope;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.beanutils.BeanUtils;
-
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.EntityDynamicType;
-import brooklyn.entity.trait.Configurable;
-import brooklyn.event.Sensor;
-import brooklyn.event.basic.DependentConfiguration;
-import brooklyn.management.Task;
-import brooklyn.management.TaskAdaptable;
-import brooklyn.management.TaskFactory;
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.config.ConfigBag;
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.flags.ClassCoercionException;
-import brooklyn.util.flags.FlagUtils;
-import brooklyn.util.flags.TypeCoercions;
-import brooklyn.util.javalang.Reflections;
-import brooklyn.util.task.DeferredSupplier;
-import brooklyn.util.text.StringEscapes.JavaStringEscapes;
-import brooklyn.util.text.Strings;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-/** static import functions which can be used in `$brooklyn:xxx` contexts */
-public class BrooklynDslCommon {
-
- // Access specific entities
-
- public static DslComponent entity(String id) {
- return new DslComponent(Scope.GLOBAL, id);
- }
- public static DslComponent parent() {
- return new DslComponent(Scope.PARENT, null);
- }
- public static DslComponent child(String id) {
- return new DslComponent(Scope.CHILD, id);
- }
- public static DslComponent sibling(String id) {
- return new DslComponent(Scope.SIBLING, id);
- }
- public static DslComponent descendant(String id) {
- return new DslComponent(Scope.DESCENDANT, id);
- }
- public static DslComponent ancestor(String id) {
- return new DslComponent(Scope.ANCESTOR, id);
- }
- // prefer the syntax above to the below now, but not deprecating the below
- public static DslComponent component(String id) {
- return component("global", id);
- }
- public static DslComponent component(String scope, String id) {
- if (!DslComponent.Scope.isValid(scope)) {
- throw new IllegalArgumentException(scope + " is not a valid scope");
- }
- return new DslComponent(DslComponent.Scope.fromString(scope), id);
- }
-
- // Access things on entities
-
- public static BrooklynDslDeferredSupplier<?> config(String keyName) {
- return new DslComponent(Scope.THIS, "").config(keyName);
- }
-
- public static BrooklynDslDeferredSupplier<?> attributeWhenReady(String sensorName) {
- return new DslComponent(Scope.THIS, "").attributeWhenReady(sensorName);
- }
-
- /** Returns a {@link Sensor}, looking up the sensor on the context if available and using that,
- * or else defining an untyped (Object) sensor */
- public static BrooklynDslDeferredSupplier<Sensor<?>> sensor(String sensorName) {
- return new DslComponent(Scope.THIS, "").sensor(sensorName);
- }
-
- /** Returns a {@link Sensor} declared on the type (e.g. entity class) declared in the first argument. */
- @SuppressWarnings({ "unchecked", "rawtypes" })
- public static Sensor<?> sensor(String clazzName, String sensorName) {
- try {
- // TODO Should use catalog's classloader, rather than Class.forName; how to get that? Should we return a future?!
- Class<?> clazz = Class.forName(clazzName);
- Sensor<?> sensor;
- if (Entity.class.isAssignableFrom(clazz)) {
- sensor = new EntityDynamicType((Class<? extends Entity>) clazz).getSensor(sensorName);
- } else {
- // Some non-entity classes (e.g. ServiceRestarter policy) declare sensors that other
- // entities/policies/enrichers may wish to reference.
- Map<String,Sensor<?>> sensors = EntityDynamicType.findSensors((Class)clazz, null);
- sensor = sensors.get(sensorName);
- }
- if (sensor == null) {
- // TODO could extend API to return a sensor of the given type; useful but makes API ambiguous in theory (unlikely in practise, but still...)
- throw new IllegalArgumentException("Sensor " + sensorName + " not found on class " + clazzName);
- }
- return sensor;
- } catch (ClassNotFoundException e) {
- throw Exceptions.propagate(e);
- }
- }
-
- // Build complex things
-
- public static EntitySpecConfiguration entitySpec(Map<String, Object> arguments) {
- return new EntitySpecConfiguration(arguments);
- }
-
- /**
- * Return an instance of the specified class with its fields set according
- * to the {@link Map} or a {@link BrooklynDslDeferredSupplier} if the arguments are not
- * yet fully resolved.
- */
- @SuppressWarnings("unchecked")
- public static Object object(Map<String, Object> arguments) {
- ConfigBag config = ConfigBag.newInstance(arguments);
- String typeName = BrooklynYamlTypeInstantiator.InstantiatorFromKey.extractTypeName("object", config).orNull();
- Map<String,Object> objectFields = (Map<String, Object>) config.getStringKeyMaybe("object.fields").or(MutableMap.of());
- Map<String,Object> brooklynConfig = (Map<String, Object>) config.getStringKeyMaybe(BrooklynCampReservedKeys.BROOKLYN_CONFIG).or(MutableMap.of());
- try {
- // TODO Should use catalog's classloader, rather than Class.forName; how to get that? Should we return a future?!
- Class<?> type = Class.forName(typeName);
- if (!Reflections.hasNoArgConstructor(type)) {
- throw new IllegalStateException(String.format("Cannot construct %s bean: No public no-arg constructor available", type));
- }
- if ((objectFields.isEmpty() || DslUtils.resolved(objectFields.values())) &&
- (brooklynConfig.isEmpty() || DslUtils.resolved(brooklynConfig.values()))) {
- return DslObject.create(type, objectFields, brooklynConfig);
- } else {
- return new DslObject(type, objectFields, brooklynConfig);
- }
- } catch (ClassNotFoundException e) {
- throw Exceptions.propagate(e);
- }
- }
-
- // String manipulation
-
- /** Return the expression as a literal string without any further parsing. */
- public static Object literal(Object expression) {
- return expression;
- }
-
- /**
- * Returns a formatted string or a {@link BrooklynDslDeferredSupplier} if the arguments
- * are not yet fully resolved.
- */
- public static Object formatString(final String pattern, final Object...args) {
- if (DslUtils.resolved(args)) {
- // if all args are resolved, apply the format string now
- return String.format(pattern, args);
- } else {
- return new DslFormatString(pattern, args);
- }
- }
-
- /**
- * Deferred execution of String formatting.
- *
- * @see DependentConfiguration#formatString(String, Object...)
- */
- protected static class DslFormatString extends BrooklynDslDeferredSupplier<String> {
-
- private static final long serialVersionUID = -4849297712650560863L;
-
- private String pattern;
- private Object[] args;
-
- public DslFormatString(String pattern, Object ...args) {
- this.pattern = pattern;
- this.args = args;
- }
-
- @Override
- public Task<String> newTask() {
- return DependentConfiguration.formatString(pattern, args);
- }
-
- @Override
- public String toString() {
- return "$brooklyn:formatString("+
- JavaStringEscapes.wrapJavaString(pattern)+
- (args==null || args.length==0 ? "" : ","+Strings.join(args, ","))+")";
- }
- }
-
- /** @deprecated since 0.7.0; use {@link DslFormatString} */
- @SuppressWarnings("serial")
- @Deprecated
- protected static class FormatString extends DslFormatString {
- public FormatString(String pattern, Object[] args) {
- super(pattern, args);
- }
- }
-
- /** Deferred execution of Object creation. */
- protected static class DslObject extends BrooklynDslDeferredSupplier<Object> {
-
- private static final long serialVersionUID = 8878388748085419L;
-
- private Class<?> type;
- private Map<String,Object> fields, config;
-
- public DslObject(Class<?> type, Map<String,Object> fields, Map<String,Object> config) {
- this.type = type;
- this.fields = MutableMap.copyOf(fields);
- this.config = MutableMap.copyOf(config);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Task<Object> newTask() {
- List<TaskAdaptable<Object>> tasks = Lists.newLinkedList();
- for (Object value : Iterables.concat(fields.values(), config.values())) {
- if (value instanceof TaskAdaptable) {
- tasks.add((TaskAdaptable<Object>) value);
- } else if (value instanceof TaskFactory) {
- tasks.add(((TaskFactory<TaskAdaptable<Object>>) value).newTask());
- }
- }
- Map<String,?> flags = MutableMap.<String,String>of("displayName", "building '"+type+"' with "+tasks.size()+" task"+(tasks.size()!=1?"s":""));
- return DependentConfiguration.transformMultiple(flags, new Function<List<Object>, Object>() {
- @Override
- public Object apply(List<Object> input) {
- Iterator<Object> values = input.iterator();
- for (String name : fields.keySet()) {
- Object value = fields.get(name);
- if (value instanceof TaskAdaptable || value instanceof TaskFactory) {
- fields.put(name, values.next());
- } else if (value instanceof DeferredSupplier) {
- fields.put(name, ((DeferredSupplier<?>) value).get());
- }
- }
- for (String name : config.keySet()) {
- Object value = config.get(name);
- if (value instanceof TaskAdaptable || value instanceof TaskFactory) {
- config.put(name, values.next());
- } else if (value instanceof DeferredSupplier) {
- config.put(name, ((DeferredSupplier<?>) value).get());
- }
- }
- return create(type, fields, config);
- }
- }, tasks);
- }
-
- public static <T> T create(Class<T> type, Map<String,?> fields, Map<String,?> config) {
- try {
- T bean;
- try {
- bean = (T) TypeCoercions.coerce(fields, type);
- } catch (ClassCoercionException ex) {
- bean = Reflections.invokeConstructorWithArgs(type).get();
- BeanUtils.populate(bean, fields);
- }
- if (bean instanceof Configurable && config.size() > 0) {
- ConfigBag brooklyn = ConfigBag.newInstance(config);
- FlagUtils.setFieldsFromFlags(bean, brooklyn);
- FlagUtils.setAllConfigKeys((Configurable) bean, brooklyn, true);
- }
- return bean;
- } catch (Exception e) {
- throw Exceptions.propagate(e);
- }
- }
-
- @Override
- public String toString() {
- return "$brooklyn:object(\""+type.getName()+"\")";
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
deleted file mode 100644
index 1cb52b3..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
+++ /dev/null
@@ -1,320 +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 io.brooklyn.camp.brooklyn.spi.dsl.methods;
-
-import io.brooklyn.camp.brooklyn.BrooklynCampConstants;
-import io.brooklyn.camp.brooklyn.spi.dsl.BrooklynDslDeferredSupplier;
-
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.concurrent.Callable;
-
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.BrooklynTaskTags;
-import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityInternal;
-import brooklyn.entity.basic.EntityPredicates;
-import brooklyn.event.AttributeSensor;
-import brooklyn.event.Sensor;
-import brooklyn.event.basic.DependentConfiguration;
-import brooklyn.event.basic.Sensors;
-import brooklyn.management.Task;
-import brooklyn.management.internal.EntityManagerInternal;
-import brooklyn.util.guava.Maybe;
-import brooklyn.util.task.TaskBuilder;
-import brooklyn.util.task.Tasks;
-import brooklyn.util.text.StringEscapes.JavaStringEscapes;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-
-public class DslComponent extends BrooklynDslDeferredSupplier<Entity> {
-
- private static final long serialVersionUID = -7715984495268724954L;
-
- private final String componentId;
- private final DslComponent scopeComponent;
- private final Scope scope;
-
- public DslComponent(String componentId) {
- this(Scope.GLOBAL, componentId);
- }
-
- public DslComponent(Scope scope, String componentId) {
- this(null, scope, componentId);
- }
-
- public DslComponent(DslComponent scopeComponent, Scope scope, String componentId) {
- Preconditions.checkNotNull(scope, "scope");
- this.scopeComponent = scopeComponent;
- this.componentId = componentId;
- this.scope = scope;
- }
-
- // ---------------------------
-
- @Override
- public Task<Entity> newTask() {
- return TaskBuilder.<Entity>builder().name(toString()).tag(BrooklynTaskTags.TRANSIENT_TASK_TAG)
- .body(new EntityInScopeFinder(scopeComponent, scope, componentId)).build();
- }
-
- protected static class EntityInScopeFinder implements Callable<Entity> {
- protected final DslComponent scopeComponent;
- protected final Scope scope;
- protected final String componentId;
-
- public EntityInScopeFinder(DslComponent scopeComponent, Scope scope, String componentId) {
- this.scopeComponent = scopeComponent;
- this.scope = scope;
- this.componentId = componentId;
- }
-
- protected EntityInternal getEntity() {
- if (scopeComponent!=null) {
- return (EntityInternal)scopeComponent.get();
- } else {
- return entity();
- }
- }
-
- @Override
- public Entity call() throws Exception {
- Iterable<Entity> entitiesToSearch = null;
- switch (scope) {
- case THIS:
- return getEntity();
- case PARENT:
- return getEntity().getParent();
- case GLOBAL:
- entitiesToSearch = ((EntityManagerInternal)getEntity().getManagementContext().getEntityManager())
- .getAllEntitiesInApplication( entity().getApplication() );
- break;
- case DESCENDANT:
- entitiesToSearch = Entities.descendants(getEntity());
- break;
- case ANCESTOR:
- entitiesToSearch = Entities.ancestors(getEntity());
- break;
- case SIBLING:
- entitiesToSearch = getEntity().getParent().getChildren();
- break;
- case CHILD:
- entitiesToSearch = getEntity().getChildren();
- break;
- default:
- throw new IllegalStateException("Unexpected scope "+scope);
- }
-
- Optional<Entity> result = Iterables.tryFind(entitiesToSearch, EntityPredicates.configEqualTo(BrooklynCampConstants.PLAN_ID, componentId));
-
- if (result.isPresent())
- return result.get();
-
- // TODO may want to block and repeat on new entities joining?
- throw new NoSuchElementException("No entity matching id " + componentId+
- (scope==Scope.GLOBAL ? "" : ", in scope "+scope+" wrt "+getEntity()+
- (scopeComponent!=null ? " ("+scopeComponent+" from "+entity()+")" : "")));
- }
- }
-
- // -------------------------------
-
- // DSL words which move to a new component
-
- public DslComponent entity(String scopeOrId) {
- return new DslComponent(this, Scope.GLOBAL, scopeOrId);
- }
- public DslComponent child(String scopeOrId) {
- return new DslComponent(this, Scope.CHILD, scopeOrId);
- }
- public DslComponent sibling(String scopeOrId) {
- return new DslComponent(this, Scope.SIBLING, scopeOrId);
- }
- public DslComponent descendant(String scopeOrId) {
- return new DslComponent(this, Scope.DESCENDANT, scopeOrId);
- }
- public DslComponent ancestor(String scopeOrId) {
- return new DslComponent(this, Scope.ANCESTOR, scopeOrId);
- }
-
- @Deprecated /** @deprecated since 0.7.0 */
- public DslComponent component(String scopeOrId) {
- return new DslComponent(this, Scope.GLOBAL, scopeOrId);
- }
-
- public DslComponent parent() {
- return new DslComponent(this, Scope.PARENT, "");
- }
-
- public DslComponent component(String scope, String id) {
- if (!DslComponent.Scope.isValid(scope)) {
- throw new IllegalArgumentException(scope + " is not a vlaid scope");
- }
- return new DslComponent(this, DslComponent.Scope.fromString(scope), id);
- }
-
- // DSL words which return things
-
- public BrooklynDslDeferredSupplier<?> attributeWhenReady(final String sensorName) {
- return new AttributeWhenReady(this, sensorName);
- }
- // class simply makes the memento XML files nicer
- protected static class AttributeWhenReady extends BrooklynDslDeferredSupplier<Object> {
- private static final long serialVersionUID = 1740899524088902383L;
- private final DslComponent component;
- private final String sensorName;
- public AttributeWhenReady(DslComponent component, String sensorName) {
- this.component = Preconditions.checkNotNull(component);
- this.sensorName = sensorName;
- }
- @SuppressWarnings("unchecked")
- @Override
- public Task<Object> newTask() {
- Entity targetEntity = component.get();
- Sensor<?> targetSensor = targetEntity.getEntityType().getSensor(sensorName);
- if (!(targetSensor instanceof AttributeSensor<?>)) {
- targetSensor = Sensors.newSensor(Object.class, sensorName);
- }
- return (Task<Object>) DependentConfiguration.attributeWhenReady(targetEntity, (AttributeSensor<?>)targetSensor);
- }
- @Override
- public String toString() {
- return (component.scope==Scope.THIS ? "" : component.toString()+".") +
- "attributeWhenReady("+JavaStringEscapes.wrapJavaString(sensorName)+")";
- }
- }
-
- public BrooklynDslDeferredSupplier<?> config(final String keyName) {
- return new DslConfigSupplier(this, keyName);
- }
- protected final static class DslConfigSupplier extends BrooklynDslDeferredSupplier<Object> {
- private final DslComponent component;
- private final String keyName;
- private static final long serialVersionUID = -4735177561947722511L;
-
- public DslConfigSupplier(DslComponent component, String keyName) {
- this.component = Preconditions.checkNotNull(component);
- this.keyName = keyName;
- }
-
- @Override
- public Task<Object> newTask() {
- return Tasks.builder().name("retrieving config for "+keyName).tag(BrooklynTaskTags.TRANSIENT_TASK_TAG).dynamic(false).body(new Callable<Object>() {
- @Override
- public Object call() throws Exception {
- Entity targetEntity = component.get();
- return targetEntity.getConfig(ConfigKeys.newConfigKey(Object.class, keyName));
- }
- }).build();
- }
-
- @Override
- public String toString() {
- return (component.scope==Scope.THIS ? "" : component.toString()+".") +
- "config("+JavaStringEscapes.wrapJavaString(keyName)+")";
- }
- }
-
- public BrooklynDslDeferredSupplier<Sensor<?>> sensor(final String sensorName) {
- return new DslSensorSupplier(this, sensorName);
- }
- protected final static class DslSensorSupplier extends BrooklynDslDeferredSupplier<Sensor<?>> {
- private final DslComponent component;
- private final String sensorName;
- private static final long serialVersionUID = -4735177561947722511L;
-
- public DslSensorSupplier(DslComponent component, String sensorName) {
- this.component = Preconditions.checkNotNull(component);
- this.sensorName = sensorName;
- }
-
- @Override
- public Task<Sensor<?>> newTask() {
- return Tasks.<Sensor<?>>builder().name("looking up sensor for "+sensorName).dynamic(false).body(new Callable<Sensor<?>>() {
- @Override
- public Sensor<?> call() throws Exception {
- Entity targetEntity = component.get();
- Sensor<?> result = null;
- if (targetEntity!=null) {
- result = targetEntity.getEntityType().getSensor(sensorName);
- }
- if (result!=null) return result;
- return Sensors.newSensor(Object.class, sensorName);
- }
- }).build();
- }
-
- @Override
- public String toString() {
- return (component.scope==Scope.THIS ? "" : component.toString()+".") +
- "sensor("+JavaStringEscapes.wrapJavaString(sensorName)+")";
- }
- }
-
- public static enum Scope {
- GLOBAL ("global"),
- CHILD ("child"),
- PARENT ("parent"),
- SIBLING ("sibling"),
- DESCENDANT ("descendant"),
- ANCESTOR("ancestor"),
- THIS ("this");
-
- public static final Set<Scope> VALUES = ImmutableSet.of(GLOBAL, CHILD, PARENT, SIBLING, DESCENDANT, ANCESTOR, THIS);
-
- private final String name;
-
- private Scope(String name) {
- this.name = name;
- }
-
- public static Scope fromString(String name) {
- return tryFromString(name).get();
- }
-
- public static Maybe<Scope> tryFromString(String name) {
- for (Scope scope : VALUES)
- if (scope.name.toLowerCase().equals(name.toLowerCase()))
- return Maybe.of(scope);
- return Maybe.absent(new IllegalArgumentException(name + " is not a valid scope"));
- }
-
- public static boolean isValid(String name) {
- for (Scope scope : VALUES)
- if (scope.name.toLowerCase().equals(name.toLowerCase()))
- return true;
- return false;
- }
- }
-
-
- @Override
- public String toString() {
- return "$brooklyn:entity("+
- (scopeComponent==null ? "" : JavaStringEscapes.wrapJavaString(scopeComponent.toString())+", ")+
- (scope==Scope.GLOBAL ? "" : JavaStringEscapes.wrapJavaString(scope.toString())+", ")+
- JavaStringEscapes.wrapJavaString(componentId)+
- ")";
- }
-
-}
\ No newline at end of file