http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/ListConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/ListConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/ListConfigKey.java deleted file mode 100644 index 06a29bd..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/ListConfigKey.java +++ /dev/null @@ -1,128 +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.config; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.core.config.internal.AbstractCollectionConfigKey; -import org.apache.brooklyn.core.internal.storage.impl.ConcurrentMapAcceptingNullVals; -import org.apache.brooklyn.util.collections.MutableList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** A config key representing a list of values. - * If a value is set on this key, it is _added_ to the list. - * (With a warning is issued if a collection is passed in.) - * If a value is set against an equivalent *untyped* key which *is* a collection, - * it will be treated as a list upon discovery and used as a base to which subkey values are appended. - * If a value is discovered against this key which is not a map or collection, - * it is ignored. - * <p> - * To add all items in a collection, to add a collection as a single element, - * to clear the list, or to set a collection (clearing first), - * use the relevant {@link ListModification} in {@link ListModifications}. - * <p> - * Specific values can be added in a replaceable way by referring to a subkey. - * - * @deprecated since 0.6; use SetConfigKey. - * The ListConfigKey does not guarantee order when subkeys are used, - * due to distribution and the use of the {@link ConcurrentMapAcceptingNullVals} - * as a backing store. - * However the class will likely be kept around with tests for the time being - * as we would like to repair this. - */ -//TODO Create interface -@Deprecated -public class ListConfigKey<V> extends AbstractCollectionConfigKey<List<? extends V>,List<Object>,V> { - - private static final long serialVersionUID = 751024268729803210L; - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(ListConfigKey.class); - - public ListConfigKey(Class<V> subType, String name) { - this(subType, name, name, null); - } - - public ListConfigKey(Class<V> subType, String name, String description) { - this(subType, name, description, null); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public ListConfigKey(Class<V> subType, String name, String description, List<? extends V> defaultValue) { - super((Class)List.class, subType, name, description, (List<V>)defaultValue); - } - - @Override - protected List<Object> merge(boolean unmodifiable, Iterable<?>... sets) { - MutableList<Object> result = MutableList.of(); - for (Iterable<?> set: sets) result.addAll(set); - if (unmodifiable) return result.asUnmodifiable(); - return result; - } - - public interface ListModification<T> extends StructuredModification<ListConfigKey<T>>, List<T> { - } - - public static class ListModifications extends StructuredModifications { - /** when passed as a value to a ListConfigKey, causes each of these items to be added. - * if you have just one, no need to wrap in a mod. */ - // to prevent confusion (e.g. if a list is passed) we require two objects here. - public static final <T> ListModification<T> add(final T o1, final T o2, final T ...oo) { - List<T> l = new ArrayList<T>(); - l.add(o1); l.add(o2); - for (T o: oo) l.add(o); - return new ListModificationBase<T>(l, false); - } - /** when passed as a value to a ListConfigKey, causes each of these items to be added */ - public static final <T> ListModification<T> addAll(final Collection<T> items) { - return new ListModificationBase<T>(items, false); - } - /** when passed as a value to a ListConfigKey, causes the items to be added as a single element in the list */ - public static final <T> ListModification<T> addItem(final T item) { - return new ListModificationBase<T>(Collections.singletonList(item), false); - } - /** when passed as a value to a ListConfigKey, causes the list to be cleared and these items added */ - public static final <T> ListModification<T> set(final Collection<T> items) { - return new ListModificationBase<T>(items, true); - } - } - - public static class ListModificationBase<T> extends ArrayList<T> implements ListModification<T> { - private static final long serialVersionUID = 7131812294560446235L; - private final boolean clearFirst; - public ListModificationBase(Collection<T> delegate, boolean clearFirst) { - super(delegate); - this.clearFirst = clearFirst; - } - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public Object applyToKeyInMap(ListConfigKey<T> key, Map target) { - if (clearFirst) { - StructuredModification<StructuredConfigKey> clearing = StructuredModifications.clearing(); - clearing.applyToKeyInMap(key, target); - } - for (T o: this) target.put(key.subKey(), o); - return null; - } - } -}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/MapConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/MapConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/MapConfigKey.java deleted file mode 100644 index 96216ff..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/MapConfigKey.java +++ /dev/null @@ -1,206 +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.config; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ExecutionException; - -import org.apache.brooklyn.api.mgmt.ExecutionContext; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.internal.AbstractStructuredConfigKey; -import org.apache.brooklyn.util.collections.Jsonya; -import org.apache.brooklyn.util.collections.MutableMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Supplier; -import com.google.common.collect.Maps; - -/** A config key which represents a map, where contents can be accessed directly via subkeys. - * Items added directly to the map must be of type map, and can be updated by: - * <ul> - * <li>Putting individual subkeys ({@link SubElementConfigKey}) - * <li>Passing an an appropriate {@link MapModification} from {@link MapModifications} - * to clear, clear-and-set, or update - * <li>Setting a value against a dot-extension of the key - * (e.g. setting <code>a.map.subkey=1</code> will cause getConfig(a.map[type=MapConfigKey]) - * to return {subkey=1}; but note the above are preferred where possible) - * <li>Setting a map directly against the MapConfigKey (but note that the above are preferred where possible) - * </ul> - */ -//TODO Create interface -public class MapConfigKey<V> extends AbstractStructuredConfigKey<Map<String,V>,Map<String,Object>,V> { - - private static final long serialVersionUID = -6126481503795562602L; - private static final Logger log = LoggerFactory.getLogger(MapConfigKey.class); - - public MapConfigKey(Class<V> subType, String name) { - this(subType, name, name, null); - } - - public MapConfigKey(Class<V> subType, String name, String description) { - this(subType, name, description, null); - } - - // TODO it isn't clear whether defaultValue is an initialValue, or a value to use when map is empty - // probably the latter, currently ... but maybe better to say that map configs are never null, - // and defaultValue is really an initial value? - @SuppressWarnings({ "unchecked", "rawtypes" }) - public MapConfigKey(Class<V> subType, String name, String description, Map<String, V> defaultValue) { - super((Class)Map.class, subType, name, description, defaultValue); - } - - public ConfigKey<V> subKey(String subName) { - return super.subKey(subName); - } - public ConfigKey<V> subKey(String subName, String description) { - return super.subKey(subName, description); - } - - @SuppressWarnings("unchecked") - @Override - protected Map<String, Object> extractValueMatchingThisKey(Object potentialBase, ExecutionContext exec, boolean coerce) throws InterruptedException, ExecutionException { - if (coerce) { - potentialBase = resolveValue(potentialBase, exec); - } - - if (potentialBase==null) return null; - if (potentialBase instanceof Map<?,?>) { - return Maps.<String,Object>newLinkedHashMap( (Map<String,Object>) potentialBase); - } - log.warn("Unable to extract "+getName()+" as Map; it is "+potentialBase.getClass().getName()+" "+potentialBase); - return null; - } - - @Override - protected Map<String, Object> merge(Map<String, Object> base, Map<String, Object> subkeys, boolean unmodifiable) { - Map<String, Object> result = MutableMap.copyOf(base).add(subkeys); - if (unmodifiable) result = Collections.unmodifiableMap(result); - return result; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public Object applyValueToMap(Object value, Map target) { - if (value == null) - return null; - if (value instanceof StructuredModification) - return ((StructuredModification)value).applyToKeyInMap(this, target); - if (value instanceof Map.Entry) - return applyEntryValueToMap((Map.Entry)value, target); - if (!(value instanceof Map)) - throw new IllegalArgumentException("Cannot set non-map entries "+value+" on "+this); - - Map result = new MutableMap(); - for (Object entry: ((Map)value).entrySet()) { - Map.Entry entryT = (Map.Entry)entry; - result.put(entryT.getKey(), applyEntryValueToMap(entryT, target)); - } - if (((Map)value).isEmpty() && !isSet(target)) - target.put(this, MutableMap.of()); - return result; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected Object applyEntryValueToMap(Entry value, Map target) { - Object k = value.getKey(); - if (acceptsSubkeyStronglyTyped(k)) { - // do nothing - } else if (k instanceof ConfigKey<?>) { - k = subKey( ((ConfigKey<?>)k).getName() ); - } else if (k instanceof String) { - k = subKey((String)k); - } else { - // supplier or other unexpected value - if (k instanceof Supplier) { - Object mapAtRoot = target.get(this); - if (mapAtRoot==null) { - mapAtRoot = new LinkedHashMap(); - target.put(this, mapAtRoot); - } - // TODO above is not thread-safe, and below is assuming synching on map - // is the best way to prevent CME's, which is often but not always true - if (mapAtRoot instanceof Map) { - if (mapAtRoot instanceof ConcurrentMap) { - return ((Map)mapAtRoot).put(k, value.getValue()); - } else { - synchronized (mapAtRoot) { - return ((Map)mapAtRoot).put(k, value.getValue()); - } - } - } - } - log.warn("Unexpected subkey "+k+" being inserted into "+this+"; ignoring"); - k = null; - } - if (k!=null) - return target.put(k, value.getValue()); - else - return null; - } - - public interface MapModification<V> extends StructuredModification<MapConfigKey<V>>, Map<String,V> { - } - - public static class MapModifications extends StructuredModifications { - /** when passed as a value to a MapConfigKey, causes each of these items to be put - * (this Mod is redundant as no other value is really sensible) */ - public static final <V> MapModification<V> put(final Map<String,V> itemsToPutInMapReplacing) { - return new MapModificationBase<V>(itemsToPutInMapReplacing, false); - } - /** when passed as a value to a MapConfigKey, causes the map to be cleared and these items added */ - public static final <V> MapModification<V> set(final Map<String,V> itemsToPutInMapAfterClearing) { - return new MapModificationBase<V>(itemsToPutInMapAfterClearing, true); - } - /** when passed as a value to a MapConfigKey, causes the items to be added to the underlying map - * using {@link Jsonya} add semantics (combining maps and lists) */ - public static final <V> MapModification<V> add(final Map<String,V> itemsToAdd) { - return new MapModificationBase<V>(itemsToAdd, false /* ignored */) { - private static final long serialVersionUID = 1L; - @SuppressWarnings("rawtypes") - @Override - public Object applyToKeyInMap(MapConfigKey<V> key, Map target) { - return key.applyValueToMap(Jsonya.of(key.rawValue(target)).add(this).getRootMap(), target); - } - }; - } - } - - public static class MapModificationBase<V> extends LinkedHashMap<String,V> implements MapModification<V> { - private static final long serialVersionUID = -1670820613292286486L; - private final boolean clearFirst; - public MapModificationBase(Map<String,V> delegate, boolean clearFirst) { - super(delegate); - this.clearFirst = clearFirst; - } - @SuppressWarnings({ "rawtypes" }) - @Override - public Object applyToKeyInMap(MapConfigKey<V> key, Map target) { - if (clearFirst) { - StructuredModification<StructuredConfigKey> clearing = StructuredModifications.clearing(); - clearing.applyToKeyInMap(key, target); - } - return key.applyValueToMap(new LinkedHashMap<String,V>(this), target); - } - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java deleted file mode 100644 index 59ca6af..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/Sanitizer.java +++ /dev/null @@ -1,172 +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.config; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.brooklyn.util.core.config.ConfigBag; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - -public final class Sanitizer { - - /** - * Names that, if they appear anywhere in an attribute/config/field - * indicates that it may be private, so should not be logged etc. - */ - public static final List<String> SECRET_NAMES = ImmutableList.of( - "password", - "passwd", - "credential", - "secret", - "private", - "access.cert", - "access.key"); - - public static final Predicate<Object> IS_SECRET_PREDICATE = new IsSecretPredicate(); - - private static class IsSecretPredicate implements Predicate<Object> { - @Override - public boolean apply(Object name) { - String lowerName = name.toString().toLowerCase(); - for (String secretName : SECRET_NAMES) { - if (lowerName.contains(secretName)) - return true; - } - return false; - } - }; - - /** - * Kept only in case this anonymous inner class has made it into any persisted state. - * - * @deprecated since 0.7.0 - */ - @Deprecated - @SuppressWarnings("unused") - private static final Predicate<Object> IS_SECRET_PREDICATE_DEPRECATED = new Predicate<Object>() { - @Override - public boolean apply(Object name) { - String lowerName = name.toString().toLowerCase(); - for (String secretName : SECRET_NAMES) { - if (lowerName.contains(secretName)) - return true; - } - return false; - } - }; - - public static Sanitizer newInstance(Predicate<Object> sanitizingNeededCheck) { - return new Sanitizer(sanitizingNeededCheck); - } - - public static Sanitizer newInstance(){ - return newInstance(IS_SECRET_PREDICATE); - } - - public static Map<String, Object> sanitize(ConfigBag input) { - return sanitize(input.getAllConfig()); - } - - public static <K> Map<K, Object> sanitize(Map<K, ?> input) { - return sanitize(input, Sets.newHashSet()); - } - - static <K> Map<K, Object> sanitize(Map<K, ?> input, Set<Object> visited) { - return newInstance().apply(input, visited); - } - - private Predicate<Object> predicate; - - private Sanitizer(Predicate<Object> sanitizingNeededCheck) { - predicate = sanitizingNeededCheck; - } - - public <K> Map<K, Object> apply(Map<K, ?> input) { - return apply(input, Sets.newHashSet()); - } - - private <K> Map<K, Object> apply(Map<K, ?> input, Set<Object> visited) { - Map<K, Object> result = Maps.newLinkedHashMap(); - for (Map.Entry<K, ?> e : input.entrySet()) { - if (predicate.apply(e.getKey())){ - result.put(e.getKey(), "xxxxxxxx"); - continue; - } - - // need to compare object reference, not equality since we may miss some. - // not a perfect identifier, but very low probability of collision. - if (visited.contains(System.identityHashCode(e.getValue()))) { - result.put(e.getKey(), e.getValue()); - continue; - } - - visited.add(System.identityHashCode(e.getValue())); - if (e.getValue() instanceof Map) { - result.put(e.getKey(), apply((Map<?, ?>) e.getValue(), visited)); - } else if (e.getValue() instanceof List) { - result.put(e.getKey(), applyList((List<?>) e.getValue(), visited)); - } else if (e.getValue() instanceof Set) { - result.put(e.getKey(), applySet((Set<?>) e.getValue(), visited)); - } else { - result.put(e.getKey(), e.getValue()); - } - } - return result; - } - - private List<Object> applyIterable(Iterable<?> input, Set<Object> visited){ - List<Object> result = Lists.newArrayList(); - for(Object o : input){ - if(visited.contains(System.identityHashCode(o))){ - result.add(o); - continue; - } - - visited.add(System.identityHashCode(o)); - if (o instanceof Map) { - result.add(apply((Map<?, ?>) o, visited)); - } else if (o instanceof List) { - result.add(applyList((List<?>) o, visited)); - } else if (o instanceof Set) { - result.add(applySet((Set<?>) o, visited)); - } else { - result.add(o); - } - - } - return result; - } - - private List<Object> applyList(List<?> input, Set<Object> visited) { - return applyIterable(input, visited); - } - - private Set<Object> applySet(Set<?> input, Set<Object> visited) { - Set<Object> result = Sets.newLinkedHashSet(); - result.addAll(applyIterable(input, visited)); - return result; - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SetConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SetConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SetConfigKey.java deleted file mode 100644 index f199c38..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SetConfigKey.java +++ /dev/null @@ -1,119 +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.config; - -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -import org.apache.brooklyn.core.config.internal.AbstractCollectionConfigKey; -import org.apache.brooklyn.util.collections.MutableSet; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** A config key representing a set of values. - * If a value is set using this *typed* key, it is _added_ to the set - * (with a warning issued if a collection is passed in). - * If a value is set against an equivalent *untyped* key which *is* a collection, - * it will be treated as a set upon discovery and used as a base to which subkey values are added. - * If a value is discovered against this key which is not a map or collection, - * it is ignored. - * <p> - * To add all items in a collection, to add a collection as a single element, - * to clear the list, or to set a collection (clearing first), - * use the relevant {@link SetModification} in {@link SetModifications}. - * <p> - * Specific values can be added in a replaceable way by referring to a subkey. - */ -//TODO Create interface -public class SetConfigKey<V> extends AbstractCollectionConfigKey<Set<? extends V>, Set<Object>, V> { - - private static final long serialVersionUID = 751024268729803210L; - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(SetConfigKey.class); - - public SetConfigKey(Class<V> subType, String name) { - this(subType, name, name, null); - } - - public SetConfigKey(Class<V> subType, String name, String description) { - this(subType, name, description, null); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public SetConfigKey(Class<V> subType, String name, String description, Set<? extends V> defaultValue) { - super((Class)Set.class, subType, name, description, defaultValue); - } - - @Override - protected Set<Object> merge(boolean unmodifiable, Iterable<?>... sets) { - MutableSet<Object> result = MutableSet.of(); - for (Iterable<?> set: sets) result.addAll(set); - if (unmodifiable) return result.asUnmodifiable(); - return result; - } - - public interface SetModification<T> extends StructuredModification<SetConfigKey<T>>, Set<T> { - } - - public static class SetModifications extends StructuredModifications { - /** when passed as a value to a SetConfigKey, causes each of these items to be added. - * if you have just one, no need to wrap in a mod. */ - // to prevent confusion (e.g. if a set is passed) we require two objects here. - public static final <T> SetModification<T> add(final T o1, final T o2, final T ...oo) { - Set<T> l = new LinkedHashSet<T>(); - l.add(o1); l.add(o2); - for (T o: oo) l.add(o); - return new SetModificationBase<T>(l, false); - } - /** when passed as a value to a SetConfigKey, causes each of these items to be added */ - public static final <T> SetModification<T> addAll(final Collection<T> items) { - return new SetModificationBase<T>(items, false); - } - /** when passed as a value to a SetConfigKey, causes the items to be added as a single element in the set */ - public static final <T> SetModification<T> addItem(final T item) { - return new SetModificationBase<T>(Collections.singleton(item), false); - } - /** when passed as a value to a SetConfigKey, causes the set to be cleared and these items added */ - public static final <T> SetModification<T> set(final Collection<T> items) { - return new SetModificationBase<T>(items, true); - } - } - - public static class SetModificationBase<T> extends LinkedHashSet<T> implements SetModification<T> { - private static final long serialVersionUID = 2715025591272457705L; - private final boolean clearFirst; - public SetModificationBase(Collection<T> delegate, boolean clearFirst) { - super(delegate); - this.clearFirst = clearFirst; - } - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public Object applyToKeyInMap(SetConfigKey<T> key, Map target) { - if (clearFirst) { - StructuredModification<StructuredConfigKey> clearing = StructuredModifications.clearing(); - clearing.applyToKeyInMap(key, target); - } - for (T o: this) target.put(key.subKey(), o); - return null; - } - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/StructuredConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/StructuredConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/StructuredConfigKey.java deleted file mode 100644 index 7384b45..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/StructuredConfigKey.java +++ /dev/null @@ -1,60 +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.config; - -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -public interface StructuredConfigKey { - - /** for internal use */ - Object applyValueToMap(Object value, @SuppressWarnings("rawtypes") Map target); - - boolean acceptsKeyMatch(Object contender); - boolean acceptsSubkey(Object contender); - boolean acceptsSubkeyStronglyTyped(Object contender); - - public static class StructuredModifications { - /** when passed as a value to a StructuredConfigKey, causes the structure to be cleared */ - @SuppressWarnings("unchecked") - public static final <U extends StructuredConfigKey,T extends StructuredModification<U>> T clearing() { - return (T) new StructuredModification<U>() { - @SuppressWarnings("rawtypes") - @Override - public Object applyToKeyInMap(U key, Map target) { - Set keysToRemove = new LinkedHashSet(); - for (Object k : target.keySet()) { - if (key.acceptsKeyMatch(k) || key.acceptsSubkey(k)) - keysToRemove.add(k); - } - for (Object k : keysToRemove) { - target.remove(k); - } - return null; - } - }; - } - } - - public interface StructuredModification<T extends StructuredConfigKey> { - Object applyToKeyInMap(T key, @SuppressWarnings("rawtypes") Map target); - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SubElementConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SubElementConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SubElementConfigKey.java deleted file mode 100644 index 1c0b525..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/SubElementConfigKey.java +++ /dev/null @@ -1,77 +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.config; - -import java.util.Map; - -import org.apache.brooklyn.api.mgmt.ExecutionContext; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.util.exceptions.Exceptions; - -@SuppressWarnings("rawtypes") -public class SubElementConfigKey<T> extends BasicConfigKey<T> { - - private static final long serialVersionUID = -1587240876351450665L; - - public final ConfigKey parent; - - public SubElementConfigKey(ConfigKey parent, Class<T> type, String name) { - this(parent, type, name, name, null); - } - public SubElementConfigKey(ConfigKey parent, Class<T> type, String name, String description) { - this(parent, type, name, description, null); - } - public SubElementConfigKey(ConfigKey parent, Class<T> type, String name, String description, T defaultValue) { - super(type, name, description, defaultValue); - this.parent = parent; - } - - @SuppressWarnings("unchecked") - @Override - public T extractValue(Map vals, ExecutionContext exec) { - if (vals.containsKey(this)) return super.extractValue(vals, exec); - if (parent instanceof StructuredConfigKey) { - // look for subkey in map at parent, in the event that the parent was set as an unstructured key - Object parentVals = vals.get(parent); - if (parentVals instanceof Map) { - String subName = getName().substring(parent.getName().length()+1); - if ( ((Map) parentVals).containsKey(subName) ) { - try { - return (T) resolveValue( ((Map) parentVals).get(subName), exec ); - } catch (Exception e) { throw Exceptions.propagate(e); } - } - } - } - return null; - } - - @Override - public boolean isSet(Map<?,?> vals) { - if (super.isSet(vals)) return true; - if (parent instanceof StructuredConfigKey) { - // look for subkey in map at parent, in the event that the parent was set as an unstructured key - Object parentVals = vals.get(parent); - if (parentVals instanceof Map) { - String subName = getName().substring(parent.getName().length()+1); - if ( ((Map) parentVals).containsKey(subName) ) 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/config/WrappedConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/WrappedConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/WrappedConfigKey.java deleted file mode 100644 index 0f09ccd..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/WrappedConfigKey.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 org.apache.brooklyn.core.config; - -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.config.ConfigKey.HasConfigKey; - -import com.google.common.base.Preconditions; - -public class WrappedConfigKey<T> implements HasConfigKey<T> { - - private final ConfigKey<T> key; - - public WrappedConfigKey(ConfigKey<T> key) { - this.key = Preconditions.checkNotNull(key); - } - - @Override - public ConfigKey<T> getConfigKey() { - return key; - } - - @Override - public String toString() { - return key.toString()+"(wrapped)"; - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/AbstractExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/AbstractExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/AbstractExternalConfigSupplier.java deleted file mode 100644 index 18b25eb..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/AbstractExternalConfigSupplier.java +++ /dev/null @@ -1,45 +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.config.external; - -import org.apache.brooklyn.api.mgmt.ManagementContext; - - -/** - * Default superclass for all {@link ExternalConfigSupplier} implementations. - */ -abstract public class AbstractExternalConfigSupplier implements ExternalConfigSupplier { - - private final ManagementContext managementContext; - private final String name; - - protected AbstractExternalConfigSupplier(ManagementContext managementContext, String name) { - this.managementContext = managementContext; - this.name = name; - } - - public ManagementContext getManagementContext() { - return managementContext; - } - - public String getName() { - return name; - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/ExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/ExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/ExternalConfigSupplier.java deleted file mode 100644 index c43f7ed..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/ExternalConfigSupplier.java +++ /dev/null @@ -1,34 +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.config.external; - -import com.google.common.annotations.Beta; - -/** - * Provider of "externalised" entity configuration that is resolved at runtime. - * - * @since 0.8.0 - */ -@Beta -public interface ExternalConfigSupplier { - - String getName(); - String get(String key); - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/InPlaceExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/InPlaceExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/InPlaceExternalConfigSupplier.java deleted file mode 100644 index a5445e9..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/InPlaceExternalConfigSupplier.java +++ /dev/null @@ -1,51 +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.config.external; - -import java.util.Map; - -import org.apache.brooklyn.api.mgmt.ManagementContext; - - -/** - * Instances are populated via sub-keys specified directly in the <tt>brooklyn.properties</tt> file: - * - * <pre> - * brooklyn.external.foo = brooklyn.management.config.external.InPlaceConfigSupplier - * brooklyn.external.foo.key1 = value1 - * brooklyn.external.foo.key2 = value2 - * </pre> - * - * This will instantiate an <code>InPlaceExternalConfigSupplier</code> populated with values for <code>key1</code> - * and <code>key2</code>. Note that the <code>brooklyn.external.<name></code> prefix is stripped. - */ -public class InPlaceExternalConfigSupplier extends AbstractExternalConfigSupplier { - - private final Map<String, String> config; - - public InPlaceExternalConfigSupplier(ManagementContext managementContext, String name, Map<String, String> config) { - super(managementContext, name); - this.config = config; - } - - public String get(String key) { - return config.get(key); - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/PropertiesFileExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/PropertiesFileExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/PropertiesFileExternalConfigSupplier.java deleted file mode 100644 index f76cdf6..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/PropertiesFileExternalConfigSupplier.java +++ /dev/null @@ -1,68 +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.config.external; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.Map; -import java.util.Properties; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.util.stream.Streams; - - -/** - * Instances are populated from a plain java properties file named in the passed <code>config</code> map - * under the <code>propertiesUrl</code> key: - * - * <pre> - * brooklyn.external.foo = brooklyn.management.config.external.PropertiesFileExternalConfigSupplier - * brooklyn.external.foo.propertiesUrl = http://brooklyn.example.com/config/foo.properties - * </pre> - */ -public class PropertiesFileExternalConfigSupplier extends AbstractExternalConfigSupplier { - - public static final String PROPERTIES_URL = "propertiesUrl"; - - private final Properties properties; - - public PropertiesFileExternalConfigSupplier(ManagementContext managementContext, String name, Map<String, String> config) throws IOException { - super(managementContext, name); - this.properties = loadProperties(config.get(PROPERTIES_URL)); - } - - public String get(String key) { - return properties.getProperty(key); - } - - private static Properties loadProperties(String propertiesUrl) throws IOException { - InputStream is = null; - try { - is = new URL(propertiesUrl).openStream(); - Properties p = new Properties(); - p.load(is); - return p; - - } finally { - Streams.closeQuietly(is); - } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultAppIdExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultAppIdExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultAppIdExternalConfigSupplier.java deleted file mode 100644 index c71d57a..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultAppIdExternalConfigSupplier.java +++ /dev/null @@ -1,90 +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.config.external.vault; - -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.text.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.gson.JsonObject; - -public class VaultAppIdExternalConfigSupplier extends VaultExternalConfigSupplier { - - private static final Logger LOG = LoggerFactory.getLogger(VaultAppIdExternalConfigSupplier.class); - - public VaultAppIdExternalConfigSupplier(ManagementContext managementContext, String name, Map<String, String> config) { - super(managementContext, name, config); - } - - protected String initAndLogIn(Map<String, String> config) { - List<String> errors = Lists.newArrayListWithCapacity(1); - String appId = config.get("appId"); - if (Strings.isBlank(appId)) errors.add("missing configuration 'appId'"); - if (!errors.isEmpty()) { - String message = String.format("Problem configuration Vault external config supplier '%s': %s", - name, Joiner.on(System.lineSeparator()).join(errors)); - throw new IllegalArgumentException(message); - } - - String userId = getUserId(config); - - LOG.info("Config supplier named {} using Vault at {} appID {} userID {} path {}", new Object[] { - name, endpoint, appId, userId, path }); - - String path = "v1/auth/app-id/login"; - ImmutableMap<String, String> requestData = ImmutableMap.of("app_id", appId, "user_id", userId); - ImmutableMap<String, String> headers = MINIMAL_HEADERS; - JsonObject response = apiPost(path, headers, requestData); - return response.getAsJsonObject("auth").get("client_token").getAsString(); - } - - private String getUserId(Map<String, String> config) { - String userId = config.get("userId"); - if (Strings.isBlank(userId)) - userId = getUserIdFromMacAddress(); - return userId; - } - - private static String getUserIdFromMacAddress() { - byte[] mac; - try { - InetAddress ip = InetAddress.getLocalHost(); - NetworkInterface network = NetworkInterface.getByInetAddress(ip); - mac = network.getHardwareAddress(); - } catch (Throwable t) { - throw Exceptions.propagate(t); - } - StringBuilder sb = new StringBuilder(); - for (byte aMac : mac) { - sb.append(String.format("%02x", aMac)); - } - return sb.toString(); - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultExternalConfigSupplier.java deleted file mode 100644 index f58dbc5..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultExternalConfigSupplier.java +++ /dev/null @@ -1,133 +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.config.external.vault; - -import java.io.UnsupportedEncodingException; -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.config.external.AbstractExternalConfigSupplier; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.http.HttpTool; -import org.apache.brooklyn.util.http.HttpToolResponse; -import org.apache.brooklyn.util.net.Urls; -import org.apache.brooklyn.util.text.Strings; -import org.apache.http.client.HttpClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; - -public abstract class VaultExternalConfigSupplier extends AbstractExternalConfigSupplier { - public static final String CHARSET_NAME = "UTF-8"; - public static final ImmutableMap<String, String> MINIMAL_HEADERS = ImmutableMap.of( - "Content-Type", "application/json; charset=" + CHARSET_NAME, - "Accept", "application/json", - "Accept-Charset", CHARSET_NAME); - private static final Logger LOG = LoggerFactory.getLogger(VaultExternalConfigSupplier.class); - protected final Map<String, String> config; - protected final String name; - protected final HttpClient httpClient; - protected final Gson gson; - protected final String endpoint; - protected final String path; - protected final String token; - protected final ImmutableMap<String, String> headersWithToken; - - public VaultExternalConfigSupplier(ManagementContext managementContext, String name, Map<String, String> config) { - super(managementContext, name); - this.config = config; - this.name = name; - httpClient = HttpTool.httpClientBuilder().build(); - gson = new GsonBuilder().create(); - - List<String> errors = Lists.newArrayListWithCapacity(2); - endpoint = config.get("endpoint"); - if (Strings.isBlank(endpoint)) errors.add("missing configuration 'endpoint'"); - path = config.get("path"); - if (Strings.isBlank(path)) errors.add("missing configuration 'path'"); - if (!errors.isEmpty()) { - String message = String.format("Problem configuration Vault external config supplier '%s': %s", - name, Joiner.on(System.lineSeparator()).join(errors)); - throw new IllegalArgumentException(message); - } - - token = initAndLogIn(config); - headersWithToken = ImmutableMap.<String, String>builder() - .putAll(MINIMAL_HEADERS) - .put("X-Vault-Token", token) - .build(); - } - - protected abstract String initAndLogIn(Map<String, String> config); - - @Override - public String get(String key) { - JsonObject response = apiGet(Urls.mergePaths("v1", path), headersWithToken); - return response.getAsJsonObject("data").get(key).getAsString(); - } - - protected JsonObject apiGet(String path, ImmutableMap<String, String> headers) { - try { - String uri = Urls.mergePaths(endpoint, path); - LOG.debug("Vault request - GET: {}", uri); - LOG.debug("Vault request - headers: {}", headers.toString()); - HttpToolResponse response = HttpTool.httpGet(httpClient, Urls.toUri(uri), headers); - LOG.debug("Vault response - code: {} {}", new Object[]{Integer.toString(response.getResponseCode()), response.getReasonPhrase()}); - LOG.debug("Vault response - headers: {}", response.getHeaderLists().toString()); - String responseBody = new String(response.getContent(), CHARSET_NAME); - LOG.debug("Vault response - body: {}", responseBody); - if (HttpTool.isStatusCodeHealthy(response.getResponseCode())) { - return gson.fromJson(responseBody, JsonObject.class); - } else { - throw new IllegalStateException("HTTP request returned error"); - } - } catch (UnsupportedEncodingException e) { - throw Exceptions.propagate(e); - } - } - - protected JsonObject apiPost(String path, ImmutableMap<String, String> headers, ImmutableMap<String, String> requestData) { - try { - String body = gson.toJson(requestData); - String uri = Urls.mergePaths(endpoint, path); - LOG.debug("Vault request - POST: {}", uri); - LOG.debug("Vault request - headers: {}", headers.toString()); - LOG.debug("Vault request - body: {}", body); - HttpToolResponse response = HttpTool.httpPost(httpClient, Urls.toUri(uri), headers, body.getBytes(CHARSET_NAME)); - LOG.debug("Vault response - code: {} {}", new Object[]{Integer.toString(response.getResponseCode()), response.getReasonPhrase()}); - LOG.debug("Vault response - headers: {}", response.getHeaderLists().toString()); - String responseBody = new String(response.getContent(), CHARSET_NAME); - LOG.debug("Vault response - body: {}", responseBody); - if (HttpTool.isStatusCodeHealthy(response.getResponseCode())) { - return gson.fromJson(responseBody, JsonObject.class); - } else { - throw new IllegalStateException("HTTP request returned error"); - } - } catch (UnsupportedEncodingException e) { - throw Exceptions.propagate(e); - } - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultTokenExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultTokenExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultTokenExternalConfigSupplier.java deleted file mode 100644 index d17aad5..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultTokenExternalConfigSupplier.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 org.apache.brooklyn.core.config.external.vault; - -import static com.google.common.base.Preconditions.checkArgument; - -import java.util.Map; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.util.text.Strings; - -public class VaultTokenExternalConfigSupplier extends VaultExternalConfigSupplier { - public VaultTokenExternalConfigSupplier(ManagementContext managementContext, String name, Map<String, String> config) { - super(managementContext, name, config); - } - - @Override - protected String initAndLogIn(Map<String, String> config) { - String tokenProperty = config.get("token"); - checkArgument(Strings.isNonBlank(tokenProperty), "property not set: token"); - return tokenProperty; - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultUserPassExternalConfigSupplier.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultUserPassExternalConfigSupplier.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultUserPassExternalConfigSupplier.java deleted file mode 100644 index 15a8576..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/external/vault/VaultUserPassExternalConfigSupplier.java +++ /dev/null @@ -1,56 +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.config.external.vault; - -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.util.text.Strings; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.gson.JsonObject; - -public class VaultUserPassExternalConfigSupplier extends VaultExternalConfigSupplier { - public VaultUserPassExternalConfigSupplier(ManagementContext managementContext, String name, Map<String, String> config) { - super(managementContext, name, config); - } - - @Override - protected String initAndLogIn(Map<String, String> config) { - List<String> errors = Lists.newArrayListWithCapacity(2); - String username = config.get("username"); - if (Strings.isBlank(username)) errors.add("missing configuration 'username'"); - String password = config.get("password"); - if (Strings.isBlank(username)) errors.add("missing configuration 'password'"); - if (!errors.isEmpty()) { - String message = String.format("Problem configuration Vault external config supplier '%s': %s", - name, Joiner.on(System.lineSeparator()).join(errors)); - throw new IllegalArgumentException(message); - } - - String path = "v1/auth/userpass/login/" + username; - ImmutableMap<String, String> requestData = ImmutableMap.of("password", password); - ImmutableMap<String, String> headers = MINIMAL_HEADERS; - JsonObject response = apiPost(path, headers, requestData); - return response.getAsJsonObject("auth").get("client_token").getAsString(); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractCollectionConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractCollectionConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractCollectionConfigKey.java deleted file mode 100644 index cc536e8..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractCollectionConfigKey.java +++ /dev/null @@ -1,120 +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.config.internal; - -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ExecutionException; - -import org.apache.brooklyn.api.mgmt.ExecutionContext; -import org.apache.brooklyn.api.mgmt.TaskAdaptable; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.SubElementConfigKey; -import org.apache.brooklyn.util.collections.MutableSet; -import org.apache.brooklyn.util.text.Identifiers; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.Iterables; - -public abstract class AbstractCollectionConfigKey<T, RawT extends Collection<Object>, V> extends AbstractStructuredConfigKey<T, RawT, V> { - - private static final long serialVersionUID = 8225955960120637643L; - private static final Logger log = LoggerFactory.getLogger(AbstractCollectionConfigKey.class); - - public AbstractCollectionConfigKey(Class<T> type, Class<V> subType, String name, String description, T defaultValue) { - super(type, subType, name, description, defaultValue); - } - - public ConfigKey<V> subKey() { - String subName = Identifiers.makeRandomId(8); - return new SubElementConfigKey<V>(this, subType, getName()+"."+subName, "element of "+getName()+", uid "+subName, null); - } - - protected abstract RawT merge(boolean unmodifiable, Iterable<?> ...items); - - @Override - protected RawT merge(RawT base, Map<String, Object> subkeys, boolean unmodifiable) { - return merge(unmodifiable, base, subkeys.values()); - } - - @Override - protected RawT extractValueMatchingThisKey(Object potentialBase, ExecutionContext exec, boolean coerce) throws InterruptedException, ExecutionException { - if (coerce) { - potentialBase = resolveValue(potentialBase, exec); - } - - if (potentialBase==null) return null; - if (potentialBase instanceof Map<?,?>) { - return merge(false, ((Map<?,?>) potentialBase).values() ); - } else if (potentialBase instanceof Collection<?>) { - return merge(false, (Collection<?>) potentialBase ); - } - log.warn("Unable to extract "+getName()+" as Collection; it is "+potentialBase.getClass().getName()+" "+potentialBase); - return null; - } - - @SuppressWarnings({ "rawtypes" }) - @Override - public Object applyValueToMap(Object value, Map target) { - return applyValueToMap(value, target, false); - } - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected Object applyValueToMap(Object value, Map target, boolean isInCollection) { - if (value instanceof StructuredModification) { - return ((StructuredModification)value).applyToKeyInMap(this, target); - } else if ((value instanceof Iterable) && (!isInCollection)) { - // collections set _here_ (not in subkeys) get added - boolean isSet = isSet(target); - if (isSet) { - String warning = "Discouraged undecorated setting of a collection to in-use StructuredConfigKey "+this+": use SetModification.{set,add}. " + - "Defaulting to 'add'. Look at debug logging for call stack."; - log.warn(warning); - if (log.isDebugEnabled()) - log.debug("Trace for: "+warning, new Throwable("Trace for: "+warning)); - } - Iterable<?> valueI = (Iterable<?>)value; - for (Object v: valueI) { - // don't continue to recurse into these collections, however - applyValueToMap(v, target, true); - } - if (Iterables.isEmpty(valueI) && !isSet) { - target.put(this, MutableSet.of()); - } - return null; - } else if (value instanceof TaskAdaptable) { - boolean isSet = isSet(target); - if (isSet) { - String warning = "Discouraged undecorated setting of a task to in-use StructuredConfigKey "+this+": use SetModification.{set,add}. " + - "Defaulting to 'add'. Look at debug logging for call stack."; - log.warn(warning); - if (log.isDebugEnabled()) - log.debug("Trace for: "+warning, new Throwable("Trace for: "+warning)); - } - // just add to set, using anonymous key - target.put(subKey(), value); - return null; - } else { - // just add to set, using anonymous key - target.put(subKey(), value); - return null; - } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java deleted file mode 100644 index fd02fc1..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java +++ /dev/null @@ -1,110 +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.config.internal; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.Future; - -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.config.ConfigMap; -import org.apache.brooklyn.config.ConfigKey.HasConfigKey; -import org.apache.brooklyn.core.config.StructuredConfigKey; -import org.apache.brooklyn.core.entity.internal.ConfigMapViewWithStringKeys; -import org.apache.brooklyn.util.core.flags.TypeCoercions; -import org.apache.brooklyn.util.core.task.DeferredSupplier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public abstract class AbstractConfigMapImpl implements ConfigMap { - - private static final Logger LOG = LoggerFactory.getLogger(AbstractConfigMapImpl.class); - - protected final ConfigMapViewWithStringKeys mapViewWithStringKeys = new ConfigMapViewWithStringKeys(this); - - /** - * Map of configuration information that is defined at start-up time for the entity. These - * configuration parameters are shared and made accessible to the "children" of this - * entity. - */ - protected Map<ConfigKey<?>,Object> ownConfig = Collections.synchronizedMap(new LinkedHashMap<ConfigKey<?>, Object>()); - - public <T> T getConfig(ConfigKey<T> key) { - return getConfig(key, null); - } - - public <T> T getConfig(HasConfigKey<T> key) { - return getConfig(key.getConfigKey(), null); - } - - public <T> T getConfig(HasConfigKey<T> key, T defaultValue) { - return getConfig(key.getConfigKey(), defaultValue); - } - - @Override @Deprecated - public Object getRawConfig(ConfigKey<?> key) { - return getConfigRaw(key, true).orNull(); - } - - protected Object coerceConfigVal(ConfigKey<?> key, Object v) { - Object val; - if ((v instanceof Future) || (v instanceof DeferredSupplier)) { - // no coercion for these (coerce on exit) - val = v; - } else if (key instanceof StructuredConfigKey) { - // no coercion for these structures (they decide what to do) - val = v; - } else if ((v instanceof Map || v instanceof Iterable) && key.getType().isInstance(v)) { - // don't do coercion on put for these, if the key type is compatible, - // because that will force resolution deeply - val = v; - } else { - try { - // try to coerce on input, to detect errors sooner - val = TypeCoercions.coerce(v, key.getTypeToken()); - } catch (Exception e) { - throw new IllegalArgumentException("Cannot coerce or set "+v+" to "+key, e); - // if can't coerce, we could just log as below and *throw* the error when we retrieve the config - // but for now, fail fast (above), because we haven't encountered strong use cases - // where we want to do coercion on retrieval, except for the exceptions above -// Exceptions.propagateIfFatal(e); -// LOG.warn("Cannot coerce or set "+v+" to "+key+" (ignoring): "+e, e); -// val = v; - } - } - return val; - } - - - @Override - public Map<String,Object> asMapWithStringKeys() { - return mapViewWithStringKeys; - } - - @Override - public int size() { - return ownConfig.size(); - } - - @Override - public boolean isEmpty() { - return ownConfig.isEmpty(); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractStructuredConfigKey.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractStructuredConfigKey.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractStructuredConfigKey.java deleted file mode 100644 index 8c7c610..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractStructuredConfigKey.java +++ /dev/null @@ -1,139 +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.config.internal; - -import java.util.Map; -import java.util.concurrent.ExecutionException; - -import org.apache.brooklyn.api.mgmt.ExecutionContext; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.BasicConfigKey; -import org.apache.brooklyn.core.config.StructuredConfigKey; -import org.apache.brooklyn.core.config.SubElementConfigKey; -import org.apache.brooklyn.util.exceptions.Exceptions; - -import com.google.common.collect.Maps; - -public abstract class AbstractStructuredConfigKey<T,RawT,V> extends BasicConfigKey<T> implements StructuredConfigKey { - - private static final long serialVersionUID = 7806267541029428561L; - - public final Class<V> subType; - - public AbstractStructuredConfigKey(Class<T> type, Class<V> subType, String name, String description, T defaultValue) { - super(type, name, description, defaultValue); - this.subType = subType; - } - - protected ConfigKey<V> subKey(String subName) { - return subKey(subName, "sub-element of " + getName() + ", named " + subName); - } - // it is not possible to supply default values - protected ConfigKey<V> subKey(String subName, String description) { - return new SubElementConfigKey<V>(this, subType, getName() + "." + subName, description, null); - } - - protected static String getKeyName(Object contender) { - if (contender==null) return null; - if (contender instanceof ConfigKey) return ((ConfigKey<?>)contender).getName(); - return contender.toString(); - } - - public boolean acceptsKeyMatch(Object contender) { - return (getName().equalsIgnoreCase(getKeyName(contender))); - } - - public boolean acceptsSubkey(Object contender) { - return contender!=null && getKeyName(contender).startsWith(getName()+"."); - } - - public String extractSubKeyName(Object o) { - String name = getKeyName(o); - assert name.startsWith(getName()+"."); - return name.substring(getName().length() + 1); - } - - @Override - public boolean acceptsSubkeyStronglyTyped(Object contender) { - return (contender instanceof SubElementConfigKey) && - acceptsKeyMatch( ((SubElementConfigKey<?>) contender).parent ); - } - - @Override - public boolean isSet(Map<?, ?> vals) { - if (vals.containsKey(this)) - return true; - for (Object contender : vals.keySet()) { - if (acceptsKeyMatch(contender) || acceptsSubkey(contender)) { - return true; - } - } - return false; - } - - protected RawT extractValue(Map<?,?> vals, ExecutionContext exec, boolean coerce, boolean unmodifiable) { - RawT base = null; - Map<String,Object> subkeys = Maps.newLinkedHashMap(); - for (Map.Entry<?,?> entry : vals.entrySet()) { - Object k = entry.getKey(); - // we don't resolve the key above because this map is the root map; - // deferred values as keys must be at an explicit config key entry - - if (acceptsKeyMatch(k)) { - try { - base = extractValueMatchingThisKey(entry.getValue(), exec, coerce); - } catch (Exception e) { throw Exceptions.propagate(e); } - } - - if (acceptsSubkey(k)) { - String subKeyName = extractSubKeyName(k); - Object value; - if (coerce) { - @SuppressWarnings("unchecked") - SubElementConfigKey<V> kk = k instanceof SubElementConfigKey<?> ? - (SubElementConfigKey<V>) k : (SubElementConfigKey<V>) subKey(subKeyName); - value = kk.extractValue(vals, exec); - } else { - value = vals.get(k); - } - subkeys.put(subKeyName, value); - } - } - return merge(base, subkeys, unmodifiable); - } - - @SuppressWarnings("unchecked") - @Override - public T extractValue(Map<?,?> vals, ExecutionContext exec) { - return (T) extractValue(vals, exec, true, true); - } - - /** returns the entries in the map against this config key and any sub-config-keys, without resolving - * (like {@link #extractValue(Map, ExecutionContext)} but without resolving/coercing; - * useful because values in this "map" are actually stored against {@link SubElementConfigKey}s */ - public RawT rawValue(Map<?,?> vals) { - return extractValue(vals, null, false, false); - } - - /** returns value against *this* key, if it is of an acceptable type (ignoring subkeys which are added on top) */ - protected abstract RawT extractValueMatchingThisKey(Object potentialBase, ExecutionContext exec, boolean coerce) throws InterruptedException, ExecutionException; - - protected abstract RawT merge(RawT base, Map<String, Object> subkeys, boolean unmodifiable); - -}
