You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/08/18 15:25:53 UTC

[5/9] incubator-brooklyn git commit: BROOKLYN-162 convert camp-base and camp-server to org.apache prefix

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/PlanInterpreter.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/PlanInterpreter.java b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/PlanInterpreter.java
new file mode 100644
index 0000000..dbf20cc
--- /dev/null
+++ b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/PlanInterpreter.java
@@ -0,0 +1,113 @@
+/*
+ * 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.camp.spi.resolve;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.brooklyn.camp.spi.resolve.interpret.PlanInterpretationNode;
+
+/** Interpreters modify the deployment plan, in a depth-first evaluation,
+ * typically by looking for items which begin with "$namespace:"
+ * <p>
+ * Most common usages simple need to supply {@link #applyYamlPrimitive(PlanInterpretationNode)} which can invoke
+ * {@link PlanInterpretationNode#setNewValue(Object)} to change.
+ * The {@link PlanInterpreterAdapter} makes this easy by supplying all methods but that.
+ * <p>
+ * For more sophisticated usages, to act on entire maps or lists,
+ * there are a number of other hook functions, described below.
+ *  */
+public interface PlanInterpreter {
+
+    /** guard to prevent any apply calls when an Interpreter is not interested in a node */
+    boolean isInterestedIn(PlanInterpretationNode node);
+    
+    /** provides an opportunity for an interpreter to change the value at a node,
+     * using {@link PlanInterpretationNode#get()} and {@link PlanInterpretationNode#setNewValue(Object)} */
+    void applyYamlPrimitive(PlanInterpretationNode node);
+
+    /** invoked at a Map node in a YAML tree, before any conversion to mapOut.
+     * mapIn is initially a copy of {@link PlanInterpretationNode#get()}, but it is mutable,
+     * and any mutations are passed to subsequent interpreters and used for recursion.
+     * <p>
+     * the return value indicates whether to recurse into the item.
+     * if any interpreters return false, the node is not recursed. 
+     * (callers may use {@link PlanInterpretationNode#setNewValue(Object)} to set a custom return value.) */
+    boolean applyMapBefore(PlanInterpretationNode node, Map<Object, Object> mapIn);
+
+    /** invoked at a Map node in a YAML tree, after {@link #applyMapBefore(PlanInterpretationNode, Map)},
+     * and after recursing into the value and then key arguments supplied here,
+     * but before inserting it into the mapOut for this node. 
+     * <p>
+     * the return value indicates whether to add this key-value to the mapOut.
+     * if any interpreters return false, the entry is not added. 
+     * (callers may modify mapOut to add/change values, or may modify key/value directly.) */
+    boolean applyMapEntry(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut,
+                            PlanInterpretationNode key, PlanInterpretationNode value);
+
+    /** invoked at a Map node in a YAML tree, after all entries have been passed to all interpreters' 
+     * {@link #applyMapEntry(PlanInterpretationNode, Map, Map, PlanInterpretationNode, PlanInterpretationNode)}.
+     * mapOut can be modified yet further. */
+    void applyMapAfter(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut);
+
+    /** as {@link #applyMapBefore(PlanInterpretationNode, Map)} but for lists */
+    boolean applyListBefore(PlanInterpretationNode node, List<Object> listIn);
+
+    /** as {@link #applyMapEntry(PlanInterpretationNode, Map, Map, PlanInterpretationNode, PlanInterpretationNode) but for lists */
+    boolean applyListEntry(PlanInterpretationNode node, List<Object> listIn, List<Object> listOut,
+                            PlanInterpretationNode value);
+
+    /** as {@link #applyMapAfter(PlanInterpretationNode, Map, Map)} but for lists  */
+    void applyListAfter(PlanInterpretationNode node, List<Object> listIn, List<Object> listOut);
+
+    
+    public abstract static class PlanInterpreterAdapter implements PlanInterpreter {
+
+        @Override
+        public boolean applyMapBefore(PlanInterpretationNode node, Map<Object, Object> mapIn) {
+            return true;
+        }
+
+        @Override
+        public boolean applyMapEntry(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut,
+                                PlanInterpretationNode key, PlanInterpretationNode value) {
+            return true;
+        }
+
+        @Override
+        public void applyMapAfter(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut) {
+        }
+
+        @Override
+        public boolean applyListBefore(PlanInterpretationNode node, List<Object> listIn) {
+            return true;
+        }
+
+        @Override
+        public boolean applyListEntry(PlanInterpretationNode node, List<Object> listIn, List<Object> listOut,
+                                PlanInterpretationNode value) {
+            return true;
+        }
+
+        @Override
+        public void applyListAfter(PlanInterpretationNode node, List<Object> listIn, List<Object> listOut) {
+        }
+        
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationContext.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationContext.java b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationContext.java
new file mode 100644
index 0000000..08053cb
--- /dev/null
+++ b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationContext.java
@@ -0,0 +1,152 @@
+/*
+ * 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.camp.spi.resolve.interpret;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.brooklyn.camp.spi.resolve.PlanInterpreter;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public class PlanInterpretationContext {
+
+    private final Map<String,Object> originalDeploymentPlan;
+    private final List<PlanInterpreter> interpreters;
+    private final PlanInterpreter allInterpreter;
+
+    public PlanInterpretationContext(Map<String,Object> originalDeploymentPlan, List<PlanInterpreter> interpreters) {
+        super();
+        this.originalDeploymentPlan = ImmutableMap.copyOf(originalDeploymentPlan);
+        this.interpreters = ImmutableList.copyOf(interpreters);
+        this.allInterpreter = new PlanInterpreter() {
+            @Override
+            public boolean isInterestedIn(PlanInterpretationNode node) {
+                return true;
+            }
+            
+            @Override
+            public void applyYamlPrimitive(PlanInterpretationNode node) {
+                for (PlanInterpreter i: PlanInterpretationContext.this.interpreters) {
+                    if (node.isExcluded())
+                        break;
+                    if (i.isInterestedIn(node)) {
+                        i.applyYamlPrimitive(node);
+                    }
+                }
+            }
+
+            @Override
+            public boolean applyMapBefore(PlanInterpretationNode node, Map<Object, Object> mapIn) {
+                boolean result = true;
+                for (PlanInterpreter i: PlanInterpretationContext.this.interpreters) {
+                    if (node.isExcluded())
+                        break;
+                    if (i.isInterestedIn(node)) {
+                        boolean ri= i.applyMapBefore(node, mapIn);
+                        result &= ri;
+                    }
+                }
+                return result;
+            }
+
+            @Override
+            public boolean applyMapEntry(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut, 
+                                    PlanInterpretationNode key, PlanInterpretationNode value) {
+                boolean result = true;
+                for (PlanInterpreter i: PlanInterpretationContext.this.interpreters) { 
+                    if (node.isExcluded())
+                        break;
+                    if (i.isInterestedIn(key)) {
+                        boolean ri = i.applyMapEntry(node, mapIn, mapOut, key, value);
+                        result &= ri;
+                    }
+                }
+                return result;
+            }
+
+            @Override
+            public void applyMapAfter(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut) {
+                for (PlanInterpreter i: PlanInterpretationContext.this.interpreters) { 
+                    if (node.isExcluded())
+                        break;
+                    if (i.isInterestedIn(node)) {
+                        i.applyMapAfter(node, mapIn, mapOut);
+                    }
+                }
+            }
+
+            @Override
+            public boolean applyListBefore(PlanInterpretationNode node, List<Object> listIn) {
+                boolean result = true;
+                for (PlanInterpreter i: PlanInterpretationContext.this.interpreters) { 
+                    if (node.isExcluded())
+                        break;
+                    if (i.isInterestedIn(node)) {
+                        boolean ri = i.applyListBefore(node, listIn);
+                        result &= ri;
+                    }
+                }
+                return result;
+            }
+
+            @Override
+            public boolean applyListEntry(PlanInterpretationNode node, List<Object> listIn, List<Object> listOut, 
+                                    PlanInterpretationNode value) {
+                boolean result = true;
+                for (PlanInterpreter i: PlanInterpretationContext.this.interpreters) { 
+                    if (node.isExcluded())
+                        break;
+                    if (i.isInterestedIn(value)) {
+                        boolean ri = i.applyListEntry(node, listIn, listOut, value);
+                        result &= ri;
+                    }
+                }
+                return result;
+            }
+
+            @Override
+            public void applyListAfter(PlanInterpretationNode node, List<Object> listIn, List<Object> listOut) {
+                for (PlanInterpreter i: PlanInterpretationContext.this.interpreters) { 
+                    if (node.isExcluded())
+                        break;
+                    if (i.isInterestedIn(node)) {
+                        i.applyListAfter(node, listIn, listOut);
+                    }
+                }
+            }
+
+        };
+    }
+
+    /** returns an interpreter which recurses through all interpreters */
+    PlanInterpreter getAllInterpreter() {
+        return allInterpreter;
+    }
+
+    public Map<String,Object> getOriginalDeploymentPlan() {
+        return originalDeploymentPlan;
+    }
+
+    public List<PlanInterpreter> getInterpreters() {
+        return interpreters;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationNode.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationNode.java b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationNode.java
new file mode 100644
index 0000000..43428ed
--- /dev/null
+++ b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/spi/resolve/interpret/PlanInterpretationNode.java
@@ -0,0 +1,262 @@
+/*
+ * 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.camp.spi.resolve.interpret;
+
+import java.util.Map;
+
+import org.apache.brooklyn.camp.spi.resolve.PlanInterpreter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.util.collections.MutableList;
+import brooklyn.util.collections.MutableMap;
+import brooklyn.util.text.StringPredicates;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+
+/** Helper class for {@link PlanInterpreter} instances, doing the recursive work */
+public class PlanInterpretationNode {
+
+    private static final Logger log = LoggerFactory.getLogger(PlanInterpretationNode.class);
+    
+    public enum Role { MAP_KEY, MAP_VALUE, LIST_ENTRY, YAML_PRIMITIVE }
+
+    protected final PlanInterpretationNode parent;
+    protected final Role roleInParent;
+    protected final Object originalValue;
+    protected final PlanInterpretationContext context;
+    protected Object newValue = null;
+    protected Boolean changed = null;
+    protected boolean excluded = false;
+    protected boolean immutable = false;
+
+    /** creates a root node with {@link #apply()} called */
+    public PlanInterpretationNode(PlanInterpretationContext context) {
+        this.parent = null;
+        this.roleInParent = null;
+        this.originalValue = context.getOriginalDeploymentPlan();
+        this.context = context;
+        apply();
+    }
+
+    /** internal use: creates an internal node on which {@link #apply()} has *not* been called */
+    protected PlanInterpretationNode(PlanInterpretationNode parent, Role roleInParent, Object originalItem) {
+        this.parent = parent;
+        this.roleInParent = roleInParent;
+        this.originalValue = originalItem;
+        this.context = parent.getContext();
+    }
+
+    public PlanInterpretationContext getContext() {
+        return context;
+    }
+
+    public PlanInterpretationNode getParent() {
+        return parent;
+    }
+    
+    public Role getRoleInParent() {
+        return roleInParent;
+    }
+    
+    protected void apply() {
+        if (changed!=null) throw new IllegalStateException("can only be applied once");
+
+        if (!excluded) {
+            if (originalValue instanceof Map) {
+                applyToMap();
+                immutable();
+            } else if (originalValue instanceof Iterable) {
+                applyToIterable();
+                immutable();
+            } else {
+                applyToYamlPrimitive();
+            }
+        }
+        
+        if (changed==null) changed = false;
+    }
+
+    /** convenience for interpreters, tests if nodes are not excluded, and if not:
+     * for string nodes, true iff the current value equals the given target;
+     * for nodes which are currently maps or lists,
+     * true iff not excluded and the value contains such an entry (key, in the case of map)
+     **/
+    public boolean matchesLiteral(String target) {
+        if (isExcluded()) return false; 
+        if (getNewValue() instanceof CharSequence)
+            return getNewValue().toString().equals(target);
+        if (getNewValue() instanceof Map)
+            return ((Map<?,?>)getOriginalValue()).containsKey(target);
+        if (getNewValue() instanceof Iterable)
+            return Iterables.contains((Iterable<?>)getOriginalValue(), target);
+        return false;
+    }
+
+    /** convenience for interpreters, tests if nodes are not excluded, and if not:
+     * for string nodes, true iff the current value starts with the given prefix;
+     * for nodes which are currently maps or lists,
+     * true iff not excluded and the value contains such an entry (key, in the case of map) */
+    public boolean matchesPrefix(String prefix) {
+        if (isExcluded()) return false; 
+        if (getNewValue() instanceof CharSequence)
+            return getNewValue().toString().startsWith(prefix);
+        if (getNewValue() instanceof Map)
+            return Iterables.tryFind(((Map<?,?>)getNewValue()).keySet(), StringPredicates.isStringStartingWith(prefix)).isPresent();
+        if (getNewValue() instanceof Iterable)
+            return Iterables.tryFind((Iterable<?>)getNewValue(), StringPredicates.isStringStartingWith(prefix)).isPresent();
+        return false;
+    }
+    
+    // TODO matchesRegex ?
+
+    public Object getOriginalValue() {
+        return originalValue;
+    }
+
+    public Object getNewValue() {
+        if (changed==null || !isChanged()) return originalValue;
+        return newValue;
+    }
+
+    public boolean isChanged() {
+        if (changed==null) throw new IllegalStateException("not yet applied");
+        return changed;
+    }
+
+    public boolean isExcluded() {
+        return excluded;
+    }
+    
+    /** indicates that a node should no longer be translated */
+    public PlanInterpretationNode exclude() {
+        this.excluded = true;
+        return this;
+    }
+    
+    public PlanInterpretationNode setNewValue(Object newItem) {
+        if (immutable)
+            throw new IllegalStateException("Node "+this+" has been set immutable");
+        this.newValue = newItem;
+        this.changed = true;
+        return this;
+    }
+
+    protected PlanInterpretationNode newPlanInterpretation(PlanInterpretationNode parent, Role roleInParent, Object item) {
+        return new PlanInterpretationNode(parent, roleInParent, item);
+    }
+
+    protected void applyToMap() {
+        Map<Object, Object> input = MutableMap.<Object,Object>copyOf((Map<?,?>)originalValue);
+        Map<Object, Object> result = MutableMap.<Object,Object>of();
+        newValue = result;
+
+        // first do a "whole-node" application
+        if (getContext().getAllInterpreter().applyMapBefore(this, input)) {
+
+            for (Map.Entry<Object,Object> entry: input.entrySet()) {
+                // then recurse in to this node and do various in-the-node applications
+                PlanInterpretationNode value = newPlanInterpretation(this, Role.MAP_VALUE, entry.getValue());
+                value.apply();
+
+                PlanInterpretationNode key = newPlanInterpretation(this, Role.MAP_KEY, entry.getKey());
+                key.apply();
+
+                if (key.isChanged() || value.isChanged()) 
+                    changed = true;
+
+                if (getContext().getAllInterpreter().applyMapEntry(this, input, result, key, value))
+                    result.put(key.getNewValue(), value.getNewValue());
+                else
+                    changed = true;
+            }
+
+            // finally try applying to this node again
+            getContext().getAllInterpreter().applyMapAfter(this, input, result);
+        }
+
+        if (changed==null) changed = false;
+    }
+
+    protected void applyToIterable() {
+        MutableList<Object> input = MutableList.copyOf((Iterable<?>)originalValue);
+        MutableList<Object> result = new MutableList<Object>();
+        newValue = result;
+
+        // first do a "whole-node" application
+        if (getContext().getAllInterpreter().applyListBefore(this, input)) {
+
+            for (Object entry: input) {
+                // then recurse in to this node and do various in-the-node applications
+                PlanInterpretationNode value = newPlanInterpretation(this, Role.LIST_ENTRY, entry);
+                value.apply();
+
+                if (value.isChanged()) 
+                    changed = true;
+
+                if (getContext().getAllInterpreter().applyListEntry(this, input, result, value))
+                    result.add(value.getNewValue());
+            }
+
+            // finally try applying to this node again
+            getContext().getAllInterpreter().applyListAfter(this, input, result);
+        }
+
+        if (changed==null) changed = false;
+    }
+
+    protected void applyToYamlPrimitive() {
+        getContext().getAllInterpreter().applyYamlPrimitive(this);
+    }
+
+    public void immutable() {
+        if (!isChanged()) {
+            if (!testCollectionImmutable(getNewValue())) {
+                // results of Yaml parse are not typically immutable,
+                // so force them to be changed so result of interpretation is immutable
+                changed = true;
+                setNewValue(immutable(getNewValue()));
+            }
+        } else {
+            setNewValue(immutable(getNewValue()));
+        }
+        checkImmutable(getNewValue());
+        immutable = true;
+    }
+    
+    private void checkImmutable(Object in) {
+        if (!testCollectionImmutable(in))
+            log.warn("Node original value "+in+" at "+this+" should be immutable");
+    }
+    
+    private static boolean testCollectionImmutable(Object in) {
+        if (in instanceof Map) return (in instanceof ImmutableMap);
+        if (in instanceof Iterable) return (in instanceof ImmutableList);
+        return true;
+    }
+
+    private static Object immutable(Object in) {
+        if (in instanceof Map) return ImmutableMap.copyOf((Map<?,?>)in);
+        if (in instanceof Iterable) return ImmutableList.copyOf((Iterable<?>)in);
+        return in;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/main/java/org/apache/brooklyn/camp/util/yaml/Yamls.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/main/java/org/apache/brooklyn/camp/util/yaml/Yamls.java b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/util/yaml/Yamls.java
new file mode 100644
index 0000000..1c2c379
--- /dev/null
+++ b/camp/camp-base/src/main/java/org/apache/brooklyn/camp/util/yaml/Yamls.java
@@ -0,0 +1,24 @@
+/*
+ * 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.camp.util.yaml;
+
+/** @deprecated since 0.7.0 use {@link brooklyn.util.yaml.Yamls} */
+@Deprecated
+public class Yamls extends brooklyn.util.yaml.Yamls {
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java b/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java
deleted file mode 100644
index 29f8abf..0000000
--- a/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java
+++ /dev/null
@@ -1,114 +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.spi.pdp;
-
-import io.brooklyn.camp.BasicCampPlatform;
-import io.brooklyn.camp.spi.resolve.PlanInterpreter.PlanInterpreterAdapter;
-import io.brooklyn.camp.spi.resolve.interpret.PlanInterpretationNode;
-
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import brooklyn.util.stream.Streams;
-import brooklyn.util.text.Strings;
-import brooklyn.util.yaml.Yamls;
-
-@Test
-public class DeploymentPlanToyInterpreterTest {
-
-    private static final Logger log = LoggerFactory.getLogger(DeploymentPlanToyInterpreterTest.class);
-    
-    /**
-     * Allows testing:
-     * 
-     * $sample:foo becomes "bar"
-     * $sample:caps:x capitalises the argument x
-     * $sample:ignore as key causes key-value to be dropped (and value 0 for good measure)
-     * $sample:reset causes containing map or list to be cleared at that point
-     * $sample:remove as key causes argument as map to be dropped
-     */
-    public static class ToyInterpreter extends PlanInterpreterAdapter {
-        
-        @Override
-        public boolean isInterestedIn(PlanInterpretationNode node) {
-            return node.matchesPrefix("$sample:");
-        }
-        
-        @Override
-        public void applyYamlPrimitive(PlanInterpretationNode node) {
-            if (node.matchesLiteral("$sample:foo")) node.setNewValue("bar").exclude();
-            if (node.matchesPrefix("$sample:caps:")) {
-                node.setNewValue(Strings.removeFromStart(node.getNewValue().toString(), "$sample:caps:").toUpperCase()).exclude();
-            }
-        }
-
-        @Override
-        public boolean applyMapBefore(PlanInterpretationNode node, Map<Object, Object> mapIn) {
-            if (node.matchesLiteral("$sample:ignore"))
-                // replace
-                mapIn.put("$sample:ignore", 0);
-            return super.applyMapBefore(node, mapIn);
-        }
-        
-        @Override
-        public boolean applyMapEntry(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut,
-                                PlanInterpretationNode key, PlanInterpretationNode value) {
-            if (key.matchesLiteral("$sample:ignore")) {
-                Assert.assertEquals(value.getNewValue(), 0);
-                return false;
-            }
-            if (key.matchesLiteral("$sample:reset")) {
-                mapOut.clear();
-                return false;
-            }
-            
-            return super.applyMapEntry(node, mapIn, mapOut, key, value);
-        }
-
-        @SuppressWarnings("rawtypes")
-        @Override
-        public void applyMapAfter(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut) {
-            if (mapOut.containsKey("$sample:remove")) {
-                Map toRemove = (Map) mapOut.get("$sample:remove");
-                for (Object vv: toRemove.keySet()) mapOut.remove(vv);
-                mapOut.remove("$sample:remove");
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    public void testToyInterpreter() {
-        @SuppressWarnings("rawtypes")
-        Map y1 = Yamls.getAs( Yamls.parseAll( Streams.reader(getClass().getResourceAsStream("yaml-sample-toy-interpreter.yaml"))), Map.class );
-        log.info("pre-interpreter have: "+y1);
-        
-        BasicCampPlatform p = new BasicCampPlatform();
-        p.pdp().addInterpreter(new ToyInterpreter());
-        Map<String, Object> y2 = p.pdp().applyInterpreters(y1);
-        log.info("interpreter gives: "+y2);
-        
-        Map<String, Object> y3 = Yamls.getAs( Yamls.parseAll( Streams.reader(getClass().getResourceAsStream("yaml-sample-toy-interpreter-result.yaml"))), Map.class );
-        Assert.assertEquals(y2, y3);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/PdpYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/PdpYamlTest.java b/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/PdpYamlTest.java
deleted file mode 100644
index 70170d7..0000000
--- a/camp/camp-base/src/test/java/io/brooklyn/camp/spi/pdp/PdpYamlTest.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.spi.pdp;
-
-import io.brooklyn.camp.BasicCampPlatform;
-import io.brooklyn.camp.spi.AssemblyTemplate;
-import io.brooklyn.camp.test.mock.web.MockWebPlatform;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import brooklyn.util.stream.Streams;
-
-public class PdpYamlTest {
-
-    private static final Logger log = LoggerFactory.getLogger(PdpYamlTest.class);
-    
-    @Test
-    public void testSimpleYamlArtifactParse() throws IOException {
-        BasicCampPlatform platform = MockWebPlatform.populate(new BasicCampPlatform());
-        Reader input = Streams.reader(getClass().getResourceAsStream("pdp-single-artifact.yaml"));
-        DeploymentPlan plan = platform.pdp().parseDeploymentPlan(input);
-        log.info("DP is:\n"+plan.toString());
-        Assert.assertEquals(plan.getName(), "sample");
-        Assert.assertEquals(plan.getArtifacts().size(), 1);
-        Assert.assertEquals(plan.getServices().size(), 0);
-        
-        Artifact artifact1 = plan.getArtifacts().iterator().next();
-        Assert.assertEquals(artifact1.getName(), "sample WAR");
-    }
-    
-    @Test
-    public void testSimpleYamlServiceParse() throws IOException {
-        BasicCampPlatform platform = MockWebPlatform.populate(new BasicCampPlatform());
-        Reader input = Streams.reader(getClass().getResourceAsStream("pdp-single-service.yaml"));
-        DeploymentPlan plan = platform.pdp().parseDeploymentPlan(input);
-        log.info("DP is:\n"+plan.toString());
-        Assert.assertEquals(plan.getName(), "sample");
-        Assert.assertEquals(plan.getArtifacts().size(), 0);
-        Assert.assertEquals(plan.getServices().size(), 1);
-        
-        Service service1 = plan.getServices().iterator().next();
-        Assert.assertEquals(service1.getName(), "Hello WAR");
-    }
-    
-    @Test
-    public void testSimpleYamlMatch() throws IOException {
-        BasicCampPlatform platform = MockWebPlatform.populate(new BasicCampPlatform());
-        Reader input = new InputStreamReader(getClass().getResourceAsStream("pdp-single-artifact.yaml"));
-        AssemblyTemplate at = platform.pdp().registerDeploymentPlan(input);
-        log.info("AT is:\n"+at.toString());
-        Assert.assertEquals(at.getApplicationComponentTemplates().links().size(), 1);
-        Assert.assertEquals(at.getName(), "sample");
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java b/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java
deleted file mode 100644
index 1d2628d..0000000
--- a/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java
+++ /dev/null
@@ -1,38 +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.test.mock.web;
-
-import io.brooklyn.camp.CampPlatform;
-import io.brooklyn.camp.spi.Assembly;
-import io.brooklyn.camp.spi.AssemblyTemplate;
-import io.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MockAssemblyTemplateInstantiator implements AssemblyTemplateInstantiator {
-
-    private static final Logger log = LoggerFactory.getLogger(MockAssemblyTemplateInstantiator.class);
-    
-    public Assembly instantiate(AssemblyTemplate template, CampPlatform platform) {
-        log.debug("Ignoring request to instantiate "+template);
-        return null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockWebPlatform.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockWebPlatform.java b/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockWebPlatform.java
deleted file mode 100644
index 1e76380..0000000
--- a/camp/camp-base/src/test/java/io/brooklyn/camp/test/mock/web/MockWebPlatform.java
+++ /dev/null
@@ -1,131 +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.test.mock.web;
-
-import javax.annotation.Nullable;
-
-import brooklyn.util.guava.Maybe;
-import io.brooklyn.camp.BasicCampPlatform;
-import io.brooklyn.camp.spi.ApplicationComponentTemplate;
-import io.brooklyn.camp.spi.AssemblyTemplate;
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-import io.brooklyn.camp.spi.collection.BasicResourceLookup;
-import io.brooklyn.camp.spi.collection.ResolvableLink;
-import io.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
-import io.brooklyn.camp.spi.pdp.Artifact;
-import io.brooklyn.camp.spi.pdp.AssemblyTemplateConstructor;
-import io.brooklyn.camp.spi.pdp.Service;
-import io.brooklyn.camp.spi.resolve.PdpMatcher;
-
-public class MockWebPlatform {
-
-    public static final ApplicationComponentTemplate WAR = 
-            ApplicationComponentTemplate.builder()
-                .name("io.camp.mock:WAR")
-                .description("Mock WAR")
-                .build();
-
-    public static final PlatformComponentTemplate APPSERVER = 
-            PlatformComponentTemplate.builder()
-                .name("io.camp.mock:AppServer")
-                .description("Mock Application Server")
-                .build();
-
-    public static final PlatformComponentTemplate DATABASE = 
-            PlatformComponentTemplate.builder()
-                .name("io.camp.mock:Database")
-                .description("Mock Database")
-                .build();
-
-    public static final AssemblyTemplate ASSEMBLY1 =
-            AssemblyTemplate.builder()
-                .name("WebAppAssembly1")
-                .description("Mock Web App Assembly Template")
-                .applicationComponentTemplates(BasicResourceLookup.of(WAR))
-                .instantiator(MockAssemblyTemplateInstantiator.class)
-                .build();
-
-    public static final PdpMatcher WAR_GETS_WAR_MATCHER = new PdpMatcher.ArtifactMatcher("com.java:WAR") {
-        public boolean apply(Object art, AssemblyTemplateConstructor atc) {
-            ApplicationComponentTemplate act = ApplicationComponentTemplate.builder()
-                    .name( ((Artifact)art).getName() )
-                    .description( ((Artifact)art).getDescription() )
-                    .customAttribute("implementation", WAR.getName())
-                    .customAttribute("artifactType", ((Artifact)art).getArtifactType())
-                    .build();
-
-            // TODO requirements, etc
-            
-            atc.add(act);
-            
-            return true;
-        }
-    };
-
-    public static final PdpMatcher newLiteralServiceTypeToPlatformComponentTemplateMatcher(final BasicCampPlatform platform, @Nullable final Class<? extends AssemblyTemplateInstantiator> instantiator) {
-        return new PdpMatcher() {
-            public boolean apply(Object item, AssemblyTemplateConstructor atc) {
-                if (!(item instanceof Service)) return false;
-                Service svc = (Service)item;
-                String type = svc.getServiceType();
-                
-                for (ResolvableLink<PlatformComponentTemplate> t: platform.platformComponentTemplates().links()) {
-                    if (type.equals(t.getName())) {
-                        PlatformComponentTemplate pct = PlatformComponentTemplate.builder()
-                            .name(svc.getName())
-                            .customAttribute("serviceType", type)
-                            .description(Maybe.fromNullable(svc.getDescription()).or(t.resolve().getDescription()))
-                            .build();
-                        if (atc!=null) {
-                            atc.add(pct);
-                            if (instantiator!=null)
-                                atc.instantiator(instantiator);
-                        }
-                        return true;
-                    }
-                }
-                return false;
-            }
-
-            @Override
-            public boolean accepts(Object deploymentPlanItem) {
-                return apply(deploymentPlanItem, null);
-            }
-        };
-    }
-    
-    public static <T extends BasicCampPlatform> T populate(T platform) {
-        return populate(platform, null);
-    }
-    public static <T extends BasicCampPlatform> T populate(T platform, @Nullable Class<? extends AssemblyTemplateInstantiator> instantiator) {
-        platform.platformComponentTemplates().addAll(APPSERVER, DATABASE);
-        platform.applicationComponentTemplates().add(WAR);
-        platform.assemblyTemplates().add(ASSEMBLY1);
-        
-        platform.pdp().addMatcher(WAR_GETS_WAR_MATCHER);
-        platform.pdp().addMatcher(newLiteralServiceTypeToPlatformComponentTemplateMatcher(platform, instantiator));
-        
-        return platform;
-    }
-
-    public static BasicCampPlatform newPlatform() {
-        return MockWebPlatform.populate(new BasicCampPlatform());
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/io/brooklyn/camp/test/platform/BasicCampPlatformTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/io/brooklyn/camp/test/platform/BasicCampPlatformTest.java b/camp/camp-base/src/test/java/io/brooklyn/camp/test/platform/BasicCampPlatformTest.java
deleted file mode 100644
index d92bece..0000000
--- a/camp/camp-base/src/test/java/io/brooklyn/camp/test/platform/BasicCampPlatformTest.java
+++ /dev/null
@@ -1,87 +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.test.platform;
-
-import io.brooklyn.camp.BasicCampPlatform;
-import io.brooklyn.camp.spi.AbstractResource;
-import io.brooklyn.camp.spi.ApplicationComponentTemplate;
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-import io.brooklyn.camp.spi.collection.ResolvableLink;
-import io.brooklyn.camp.test.mock.web.MockWebPlatform;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-public class BasicCampPlatformTest {
-
-    @Test
-    public void testEmptyPlatform() {
-        BasicCampPlatform p = new BasicCampPlatform();
-        assertResourceFieldsNotNull(p.root());
-        Assert.assertEquals(p.platformComponentTemplates().links().size(), 0);
-    }        
-
-    @Test
-    public void testWebPctSetup() {
-        BasicCampPlatform p = new BasicCampPlatform();
-        p.platformComponentTemplates().add(MockWebPlatform.APPSERVER);
-        
-        assertResourceFieldsNotNull(p.root());
-        
-        Assert.assertEquals(p.platformComponentTemplates().links().size(), 1);
-        ResolvableLink<PlatformComponentTemplate> l = p.platformComponentTemplates().links().get(0);
-        assertLinkFieldsNotNull(l);
-        Assert.assertEquals(l.getName(), "io.camp.mock:AppServer");
-        
-        PlatformComponentTemplate pct = l.resolve();
-        assertResourceFieldsNotNull(pct);
-    }        
-
-    @Test
-    public void testWarActSetup() {
-        BasicCampPlatform p = new BasicCampPlatform();
-        p.applicationComponentTemplates().add(MockWebPlatform.WAR);
-        
-        assertResourceFieldsNotNull(p.root());
-        
-        Assert.assertEquals(p.platformComponentTemplates().links().size(), 0);
-        Assert.assertEquals(p.applicationComponentTemplates().links().size(), 1);
-        ResolvableLink<ApplicationComponentTemplate> l = p.applicationComponentTemplates().links().get(0);
-        assertLinkFieldsNotNull(l);
-        Assert.assertEquals(l.getName(), "io.camp.mock:WAR");
-        
-        ApplicationComponentTemplate act = l.resolve();
-        assertResourceFieldsNotNull(act);
-    }        
-
-
-    public static void assertLinkFieldsNotNull(ResolvableLink<?> x) {
-        Assert.assertNotNull(x.getId());
-        Assert.assertNotNull(x.getName());
-    }
-
-    public static void assertResourceFieldsNotNull(AbstractResource x) {
-        Assert.assertNotNull(x.getId());
-        Assert.assertNotNull(x.getType());
-        Assert.assertNotNull(x.getCreated());
-        Assert.assertNotNull(x.getName());
-        Assert.assertNotNull(x.getTags());
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java
new file mode 100644
index 0000000..c87641f
--- /dev/null
+++ b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/DeploymentPlanToyInterpreterTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.camp.spi.pdp;
+
+import java.util.Map;
+
+import org.apache.brooklyn.camp.BasicCampPlatform;
+import org.apache.brooklyn.camp.spi.resolve.PlanInterpreter.PlanInterpreterAdapter;
+import org.apache.brooklyn.camp.spi.resolve.interpret.PlanInterpretationNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import brooklyn.util.stream.Streams;
+import brooklyn.util.text.Strings;
+import brooklyn.util.yaml.Yamls;
+
+@Test
+public class DeploymentPlanToyInterpreterTest {
+
+    private static final Logger log = LoggerFactory.getLogger(DeploymentPlanToyInterpreterTest.class);
+    
+    /**
+     * Allows testing:
+     * 
+     * $sample:foo becomes "bar"
+     * $sample:caps:x capitalises the argument x
+     * $sample:ignore as key causes key-value to be dropped (and value 0 for good measure)
+     * $sample:reset causes containing map or list to be cleared at that point
+     * $sample:remove as key causes argument as map to be dropped
+     */
+    public static class ToyInterpreter extends PlanInterpreterAdapter {
+        
+        @Override
+        public boolean isInterestedIn(PlanInterpretationNode node) {
+            return node.matchesPrefix("$sample:");
+        }
+        
+        @Override
+        public void applyYamlPrimitive(PlanInterpretationNode node) {
+            if (node.matchesLiteral("$sample:foo")) node.setNewValue("bar").exclude();
+            if (node.matchesPrefix("$sample:caps:")) {
+                node.setNewValue(Strings.removeFromStart(node.getNewValue().toString(), "$sample:caps:").toUpperCase()).exclude();
+            }
+        }
+
+        @Override
+        public boolean applyMapBefore(PlanInterpretationNode node, Map<Object, Object> mapIn) {
+            if (node.matchesLiteral("$sample:ignore"))
+                // replace
+                mapIn.put("$sample:ignore", 0);
+            return super.applyMapBefore(node, mapIn);
+        }
+        
+        @Override
+        public boolean applyMapEntry(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut,
+                                PlanInterpretationNode key, PlanInterpretationNode value) {
+            if (key.matchesLiteral("$sample:ignore")) {
+                Assert.assertEquals(value.getNewValue(), 0);
+                return false;
+            }
+            if (key.matchesLiteral("$sample:reset")) {
+                mapOut.clear();
+                return false;
+            }
+            
+            return super.applyMapEntry(node, mapIn, mapOut, key, value);
+        }
+
+        @SuppressWarnings("rawtypes")
+        @Override
+        public void applyMapAfter(PlanInterpretationNode node, Map<Object, Object> mapIn, Map<Object, Object> mapOut) {
+            if (mapOut.containsKey("$sample:remove")) {
+                Map toRemove = (Map) mapOut.get("$sample:remove");
+                for (Object vv: toRemove.keySet()) mapOut.remove(vv);
+                mapOut.remove("$sample:remove");
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testToyInterpreter() {
+        @SuppressWarnings("rawtypes")
+        Map y1 = Yamls.getAs( Yamls.parseAll( Streams.reader(getClass().getResourceAsStream("yaml-sample-toy-interpreter.yaml"))), Map.class );
+        log.info("pre-interpreter have: "+y1);
+        
+        BasicCampPlatform p = new BasicCampPlatform();
+        p.pdp().addInterpreter(new ToyInterpreter());
+        Map<String, Object> y2 = p.pdp().applyInterpreters(y1);
+        log.info("interpreter gives: "+y2);
+        
+        Map<String, Object> y3 = Yamls.getAs( Yamls.parseAll( Streams.reader(getClass().getResourceAsStream("yaml-sample-toy-interpreter-result.yaml"))), Map.class );
+        Assert.assertEquals(y2, y3);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/PdpYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/PdpYamlTest.java b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/PdpYamlTest.java
new file mode 100644
index 0000000..8cb88e0
--- /dev/null
+++ b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/spi/pdp/PdpYamlTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.camp.spi.pdp;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import org.apache.brooklyn.camp.BasicCampPlatform;
+import org.apache.brooklyn.camp.spi.AssemblyTemplate;
+import org.apache.brooklyn.camp.spi.pdp.Artifact;
+import org.apache.brooklyn.camp.spi.pdp.DeploymentPlan;
+import org.apache.brooklyn.camp.spi.pdp.Service;
+import org.apache.brooklyn.camp.test.mock.web.MockWebPlatform;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import brooklyn.util.stream.Streams;
+
+public class PdpYamlTest {
+
+    private static final Logger log = LoggerFactory.getLogger(PdpYamlTest.class);
+    
+    @Test
+    public void testSimpleYamlArtifactParse() throws IOException {
+        BasicCampPlatform platform = MockWebPlatform.populate(new BasicCampPlatform());
+        Reader input = Streams.reader(getClass().getResourceAsStream("pdp-single-artifact.yaml"));
+        DeploymentPlan plan = platform.pdp().parseDeploymentPlan(input);
+        log.info("DP is:\n"+plan.toString());
+        Assert.assertEquals(plan.getName(), "sample");
+        Assert.assertEquals(plan.getArtifacts().size(), 1);
+        Assert.assertEquals(plan.getServices().size(), 0);
+        
+        Artifact artifact1 = plan.getArtifacts().iterator().next();
+        Assert.assertEquals(artifact1.getName(), "sample WAR");
+    }
+    
+    @Test
+    public void testSimpleYamlServiceParse() throws IOException {
+        BasicCampPlatform platform = MockWebPlatform.populate(new BasicCampPlatform());
+        Reader input = Streams.reader(getClass().getResourceAsStream("pdp-single-service.yaml"));
+        DeploymentPlan plan = platform.pdp().parseDeploymentPlan(input);
+        log.info("DP is:\n"+plan.toString());
+        Assert.assertEquals(plan.getName(), "sample");
+        Assert.assertEquals(plan.getArtifacts().size(), 0);
+        Assert.assertEquals(plan.getServices().size(), 1);
+        
+        Service service1 = plan.getServices().iterator().next();
+        Assert.assertEquals(service1.getName(), "Hello WAR");
+    }
+    
+    @Test
+    public void testSimpleYamlMatch() throws IOException {
+        BasicCampPlatform platform = MockWebPlatform.populate(new BasicCampPlatform());
+        Reader input = new InputStreamReader(getClass().getResourceAsStream("pdp-single-artifact.yaml"));
+        AssemblyTemplate at = platform.pdp().registerDeploymentPlan(input);
+        log.info("AT is:\n"+at.toString());
+        Assert.assertEquals(at.getApplicationComponentTemplates().links().size(), 1);
+        Assert.assertEquals(at.getName(), "sample");
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java
new file mode 100644
index 0000000..a358eed
--- /dev/null
+++ b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockAssemblyTemplateInstantiator.java
@@ -0,0 +1,37 @@
+/*
+ * 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.camp.test.mock.web;
+
+import org.apache.brooklyn.camp.CampPlatform;
+import org.apache.brooklyn.camp.spi.Assembly;
+import org.apache.brooklyn.camp.spi.AssemblyTemplate;
+import org.apache.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MockAssemblyTemplateInstantiator implements AssemblyTemplateInstantiator {
+
+    private static final Logger log = LoggerFactory.getLogger(MockAssemblyTemplateInstantiator.class);
+    
+    public Assembly instantiate(AssemblyTemplate template, CampPlatform platform) {
+        log.debug("Ignoring request to instantiate "+template);
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockWebPlatform.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockWebPlatform.java b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockWebPlatform.java
new file mode 100644
index 0000000..29aabd3
--- /dev/null
+++ b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/mock/web/MockWebPlatform.java
@@ -0,0 +1,132 @@
+/*
+ * 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.camp.test.mock.web;
+
+import javax.annotation.Nullable;
+
+import org.apache.brooklyn.camp.BasicCampPlatform;
+import org.apache.brooklyn.camp.spi.ApplicationComponentTemplate;
+import org.apache.brooklyn.camp.spi.AssemblyTemplate;
+import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
+import org.apache.brooklyn.camp.spi.collection.BasicResourceLookup;
+import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
+import org.apache.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
+import org.apache.brooklyn.camp.spi.pdp.Artifact;
+import org.apache.brooklyn.camp.spi.pdp.AssemblyTemplateConstructor;
+import org.apache.brooklyn.camp.spi.pdp.Service;
+import org.apache.brooklyn.camp.spi.resolve.PdpMatcher;
+
+import brooklyn.util.guava.Maybe;
+
+public class MockWebPlatform {
+
+    public static final ApplicationComponentTemplate WAR = 
+            ApplicationComponentTemplate.builder()
+                .name("io.camp.mock:WAR")
+                .description("Mock WAR")
+                .build();
+
+    public static final PlatformComponentTemplate APPSERVER = 
+            PlatformComponentTemplate.builder()
+                .name("io.camp.mock:AppServer")
+                .description("Mock Application Server")
+                .build();
+
+    public static final PlatformComponentTemplate DATABASE = 
+            PlatformComponentTemplate.builder()
+                .name("io.camp.mock:Database")
+                .description("Mock Database")
+                .build();
+
+    public static final AssemblyTemplate ASSEMBLY1 =
+            AssemblyTemplate.builder()
+                .name("WebAppAssembly1")
+                .description("Mock Web App Assembly Template")
+                .applicationComponentTemplates(BasicResourceLookup.of(WAR))
+                .instantiator(MockAssemblyTemplateInstantiator.class)
+                .build();
+
+    public static final PdpMatcher WAR_GETS_WAR_MATCHER = new PdpMatcher.ArtifactMatcher("com.java:WAR") {
+        public boolean apply(Object art, AssemblyTemplateConstructor atc) {
+            ApplicationComponentTemplate act = ApplicationComponentTemplate.builder()
+                    .name( ((Artifact)art).getName() )
+                    .description( ((Artifact)art).getDescription() )
+                    .customAttribute("implementation", WAR.getName())
+                    .customAttribute("artifactType", ((Artifact)art).getArtifactType())
+                    .build();
+
+            // TODO requirements, etc
+            
+            atc.add(act);
+            
+            return true;
+        }
+    };
+
+    public static final PdpMatcher newLiteralServiceTypeToPlatformComponentTemplateMatcher(final BasicCampPlatform platform, @Nullable final Class<? extends AssemblyTemplateInstantiator> instantiator) {
+        return new PdpMatcher() {
+            public boolean apply(Object item, AssemblyTemplateConstructor atc) {
+                if (!(item instanceof Service)) return false;
+                Service svc = (Service)item;
+                String type = svc.getServiceType();
+                
+                for (ResolvableLink<PlatformComponentTemplate> t: platform.platformComponentTemplates().links()) {
+                    if (type.equals(t.getName())) {
+                        PlatformComponentTemplate pct = PlatformComponentTemplate.builder()
+                            .name(svc.getName())
+                            .customAttribute("serviceType", type)
+                            .description(Maybe.fromNullable(svc.getDescription()).or(t.resolve().getDescription()))
+                            .build();
+                        if (atc!=null) {
+                            atc.add(pct);
+                            if (instantiator!=null)
+                                atc.instantiator(instantiator);
+                        }
+                        return true;
+                    }
+                }
+                return false;
+            }
+
+            @Override
+            public boolean accepts(Object deploymentPlanItem) {
+                return apply(deploymentPlanItem, null);
+            }
+        };
+    }
+    
+    public static <T extends BasicCampPlatform> T populate(T platform) {
+        return populate(platform, null);
+    }
+    public static <T extends BasicCampPlatform> T populate(T platform, @Nullable Class<? extends AssemblyTemplateInstantiator> instantiator) {
+        platform.platformComponentTemplates().addAll(APPSERVER, DATABASE);
+        platform.applicationComponentTemplates().add(WAR);
+        platform.assemblyTemplates().add(ASSEMBLY1);
+        
+        platform.pdp().addMatcher(WAR_GETS_WAR_MATCHER);
+        platform.pdp().addMatcher(newLiteralServiceTypeToPlatformComponentTemplateMatcher(platform, instantiator));
+        
+        return platform;
+    }
+
+    public static BasicCampPlatform newPlatform() {
+        return MockWebPlatform.populate(new BasicCampPlatform());
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/platform/BasicCampPlatformTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/platform/BasicCampPlatformTest.java b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/platform/BasicCampPlatformTest.java
new file mode 100644
index 0000000..ccebaa6
--- /dev/null
+++ b/camp/camp-base/src/test/java/org/apache/brooklyn/camp/test/platform/BasicCampPlatformTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.camp.test.platform;
+
+import org.apache.brooklyn.camp.BasicCampPlatform;
+import org.apache.brooklyn.camp.spi.AbstractResource;
+import org.apache.brooklyn.camp.spi.ApplicationComponentTemplate;
+import org.apache.brooklyn.camp.spi.PlatformComponentTemplate;
+import org.apache.brooklyn.camp.spi.collection.ResolvableLink;
+import org.apache.brooklyn.camp.test.mock.web.MockWebPlatform;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class BasicCampPlatformTest {
+
+    @Test
+    public void testEmptyPlatform() {
+        BasicCampPlatform p = new BasicCampPlatform();
+        assertResourceFieldsNotNull(p.root());
+        Assert.assertEquals(p.platformComponentTemplates().links().size(), 0);
+    }        
+
+    @Test
+    public void testWebPctSetup() {
+        BasicCampPlatform p = new BasicCampPlatform();
+        p.platformComponentTemplates().add(MockWebPlatform.APPSERVER);
+        
+        assertResourceFieldsNotNull(p.root());
+        
+        Assert.assertEquals(p.platformComponentTemplates().links().size(), 1);
+        ResolvableLink<PlatformComponentTemplate> l = p.platformComponentTemplates().links().get(0);
+        assertLinkFieldsNotNull(l);
+        Assert.assertEquals(l.getName(), "io.camp.mock:AppServer");
+        
+        PlatformComponentTemplate pct = l.resolve();
+        assertResourceFieldsNotNull(pct);
+    }        
+
+    @Test
+    public void testWarActSetup() {
+        BasicCampPlatform p = new BasicCampPlatform();
+        p.applicationComponentTemplates().add(MockWebPlatform.WAR);
+        
+        assertResourceFieldsNotNull(p.root());
+        
+        Assert.assertEquals(p.platformComponentTemplates().links().size(), 0);
+        Assert.assertEquals(p.applicationComponentTemplates().links().size(), 1);
+        ResolvableLink<ApplicationComponentTemplate> l = p.applicationComponentTemplates().links().get(0);
+        assertLinkFieldsNotNull(l);
+        Assert.assertEquals(l.getName(), "io.camp.mock:WAR");
+        
+        ApplicationComponentTemplate act = l.resolve();
+        assertResourceFieldsNotNull(act);
+    }        
+
+
+    public static void assertLinkFieldsNotNull(ResolvableLink<?> x) {
+        Assert.assertNotNull(x.getId());
+        Assert.assertNotNull(x.getName());
+    }
+
+    public static void assertResourceFieldsNotNull(AbstractResource x) {
+        Assert.assertNotNull(x.getId());
+        Assert.assertNotNull(x.getType());
+        Assert.assertNotNull(x.getCreated());
+        Assert.assertNotNull(x.getName());
+        Assert.assertNotNull(x.getTags());
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml b/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml
deleted file mode 100644
index 0b4518b..0000000
--- a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml
+++ /dev/null
@@ -1,27 +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.
-#
-name: sample
-description: Tomcat sample JSP and servlet application.
-origin: http://www.oracle.com/nCAMP/Hand
-artifacts:
-  -
-    type: com.java:WAR
-    content: { href: sample.war }
-    name: sample WAR
-    description: Tomcat sample WAR file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-service.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-service.yaml b/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-service.yaml
deleted file mode 100644
index fe052d6..0000000
--- a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/pdp-single-service.yaml
+++ /dev/null
@@ -1,29 +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.
-#
-name: sample
-description: Tomcat sample JSP and servlet application.
-origin: http://www.oracle.com/nCAMP/Hand
-services:
-  -
-    type: brooklyn:WebAppCluster
-    name: Hello WAR
-    wars:
-        /: hello.war
-    controller.spec:
-        port: 80

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml b/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml
deleted file mode 100644
index 71b0ba8..0000000
--- a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml
+++ /dev/null
@@ -1,22 +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.
-#
-keep: 1
-mess:
-  a: bar
-  b: [ c, D ]

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml b/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml
deleted file mode 100644
index 8aa01d2..0000000
--- a/camp/camp-base/src/test/resources/io/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#  http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$sample:ignore: 1
-keep: 1
-mess:
-  2: z
-  $sample:reset: 
-  $sample:ignore: z
-  a: $sample:foo
-  b: [ c, "$sample:caps:d" ]
-  3: $sample:caps:x
-  $sample:remove: {3: X}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml
new file mode 100644
index 0000000..0b4518b
--- /dev/null
+++ b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-artifact.yaml
@@ -0,0 +1,27 @@
+#
+# 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.
+#
+name: sample
+description: Tomcat sample JSP and servlet application.
+origin: http://www.oracle.com/nCAMP/Hand
+artifacts:
+  -
+    type: com.java:WAR
+    content: { href: sample.war }
+    name: sample WAR
+    description: Tomcat sample WAR file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-service.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-service.yaml b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-service.yaml
new file mode 100644
index 0000000..fe052d6
--- /dev/null
+++ b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/pdp-single-service.yaml
@@ -0,0 +1,29 @@
+#
+# 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.
+#
+name: sample
+description: Tomcat sample JSP and servlet application.
+origin: http://www.oracle.com/nCAMP/Hand
+services:
+  -
+    type: brooklyn:WebAppCluster
+    name: Hello WAR
+    wars:
+        /: hello.war
+    controller.spec:
+        port: 80

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml
new file mode 100644
index 0000000..71b0ba8
--- /dev/null
+++ b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter-result.yaml
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+keep: 1
+mess:
+  a: bar
+  b: [ c, D ]

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml
new file mode 100644
index 0000000..8aa01d2
--- /dev/null
+++ b/camp/camp-base/src/test/resources/org/apache/brooklyn/camp/spi/pdp/yaml-sample-toy-interpreter.yaml
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+$sample:ignore: 1
+keep: 1
+mess:
+  2: z
+  $sample:reset: 
+  $sample:ignore: z
+  a: $sample:foo
+  b: [ c, "$sample:caps:d" ]
+  3: $sample:caps:x
+  $sample:remove: {3: X}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/7d782f34/camp/camp-server/src/main/java/io/brooklyn/camp/CampRestResources.java
----------------------------------------------------------------------
diff --git a/camp/camp-server/src/main/java/io/brooklyn/camp/CampRestResources.java b/camp/camp-server/src/main/java/io/brooklyn/camp/CampRestResources.java
deleted file mode 100644
index 830f646..0000000
--- a/camp/camp-server/src/main/java/io/brooklyn/camp/CampRestResources.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp;
-
-import io.brooklyn.camp.rest.resource.AbstractCampRestResource;
-import io.brooklyn.camp.rest.resource.ApidocRestResource;
-import io.brooklyn.camp.rest.resource.ApplicationComponentRestResource;
-import io.brooklyn.camp.rest.resource.ApplicationComponentTemplateRestResource;
-import io.brooklyn.camp.rest.resource.AssemblyRestResource;
-import io.brooklyn.camp.rest.resource.AssemblyTemplateRestResource;
-import io.brooklyn.camp.rest.resource.PlatformComponentRestResource;
-import io.brooklyn.camp.rest.resource.PlatformComponentTemplateRestResource;
-import io.brooklyn.camp.rest.resource.PlatformRestResource;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.brooklyn.rest.apidoc.ApidocHelpMessageBodyWriter;
-
-import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
-import com.google.common.collect.Iterables;
-
-public class CampRestResources {
-
-    public static Iterable<AbstractCampRestResource> getCampRestResources() {
-        List<AbstractCampRestResource> resources = new ArrayList<AbstractCampRestResource>();
-        resources.add(new PlatformRestResource());
-        resources.add(new AssemblyTemplateRestResource());
-        resources.add(new PlatformComponentTemplateRestResource());
-        resources.add(new ApplicationComponentTemplateRestResource());
-        resources.add(new AssemblyRestResource());
-        resources.add(new PlatformComponentRestResource());
-        resources.add(new ApplicationComponentRestResource());
-        return resources;
-    }
-
-    public static Iterable<Object> getApidocResources() {
-        List<Object> resources = new ArrayList<Object>();
-        resources.add(new ApidocHelpMessageBodyWriter());
-        resources.add(new ApidocRestResource());
-        return resources;
-    }
-
-    public static Iterable<Object> getMiscResources() {
-        List<Object> resources = new ArrayList<Object>();
-        resources.add(new JacksonJsonProvider());
-        return resources;
-    }
-
-    public static Iterable<Object> getAllResources() {
-        return Iterables.concat(getCampRestResources(), getApidocResources(), getMiscResources());
-    }
-
-}