You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by ha...@apache.org on 2015/08/05 22:56:21 UTC

[17/20] incubator-brooklyn git commit: Package rename to org.apache.brooklyn: usage/camp/

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java
deleted file mode 100644
index 43a4d04..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/DslParser.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.dsl.parse;
-
-import java.util.Collection;
-import java.util.List;
-
-import brooklyn.util.collections.MutableList;
-
-public class DslParser {
-    private final String expression;
-    int index = -1;
-    
-    public DslParser(String expression) {
-        this.expression = expression;
-    }
-    
-    public synchronized Object parse() {
-        if (index>=0)
-            throw new IllegalStateException("Parser can only be used once");
-        
-        index++;
-        Object result = next();
-        
-        if (index < expression.length())
-            throw new IllegalStateException("Unexpected character at position "+index+" in "+expression);
-        
-        return result;
-    }
-    
-    @SuppressWarnings("unchecked")
-    public Object next() {
-        int start = index;
-        
-        skipWhitespace();
-        if (index >= expression.length())
-            throw new IllegalStateException("Unexpected end of expression to parse, looking for content since position "+start);
-        
-        if (expression.charAt(index)=='"') {
-            // assume a string
-            int stringStart = index;
-            index++;
-            do {
-                if (index >= expression.length())
-                    throw new IllegalStateException("Unexpected end of expression to parse, looking for close quote since position "+stringStart);
-                char c = expression.charAt(index);
-                if (c=='"') break;
-                if (c=='\\') index++;
-                index++;
-            } while (true);
-            index++;
-            return new QuotedString(expression.substring(stringStart, index));
-        }
-
-        // not a string, must be a function (or chain thereof)
-        List<FunctionWithArgs> result = new MutableList<FunctionWithArgs>();
-
-        int fnStart = index;
-        do {
-            if (index >= expression.length())
-                break;
-            char c = expression.charAt(index);
-            if (Character.isJavaIdentifierPart(c)) ;
-            // these chars also permitted
-            else if (".:".indexOf(c)>=0) ;
-            // other things e.g. whitespace, parentheses, etc, skip
-            else break;
-            index++;
-        } while (true);
-        String fn = expression.substring(fnStart, index);
-        if (fn.length()==0)
-            throw new IllegalStateException("Expected a function name at position "+start);
-        skipWhitespace();
-        
-        if (index < expression.length() && expression.charAt(index)=='(') {
-            // collect arguments
-            int parenStart = index;
-            List<Object> args = new MutableList<Object>();
-            index ++;
-            do {
-                skipWhitespace();
-                if (index >= expression.length())
-                    throw new IllegalStateException("Unexpected end of arguments to function '"+fn+"', no close parenthesis matching character at position "+parenStart);
-                char c = expression.charAt(index);
-                if (c==')') break;
-                if (c==',') {
-                    if (args.isEmpty())
-                        throw new IllegalStateException("Invalid character at position"+index);
-                    index++;
-                } else {
-                    if (!args.isEmpty())
-                        throw new IllegalStateException("Expected , before position"+index);
-                }
-                args.add(next());
-            } while (true);
-            result.add(new FunctionWithArgs(fn, args));
-            index++;
-            skipWhitespace();
-            if (index >= expression.length())
-                return result;
-            char c = expression.charAt(index);
-            if (c=='.') {
-                // chained expression
-                int chainStart = index;
-                index++;
-                Object next = next();
-                if (next instanceof List) {
-                    result.addAll((Collection<? extends FunctionWithArgs>) next);
-                    return result;
-                } else {
-                    throw new IllegalStateException("Expected functions following position"+chainStart);
-                }
-            } else {
-                // following word not something handled at this level; assume parent will handle (or throw) - e.g. a , or extra )
-                return result;
-            }
-        } else {
-            // it is just a word; return it with args as null
-            return new FunctionWithArgs(fn, null);
-        }
-    }
-
-    private void skipWhitespace() {
-        while (index<expression.length() && Character.isWhitespace(expression.charAt(index)))
-            index++;
-    }
-    
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/FunctionWithArgs.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/FunctionWithArgs.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/FunctionWithArgs.java
deleted file mode 100644
index 973b7ba..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/FunctionWithArgs.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.dsl.parse;
-
-import java.util.List;
-
-import com.google.common.collect.ImmutableList;
-
-public class FunctionWithArgs {
-    private final String function;
-    private final List<Object> args;
-    
-    public FunctionWithArgs(String function, List<Object> args) {
-        this.function = function;
-        this.args = args==null ? null : ImmutableList.copyOf(args);
-    }
-    
-    public String getFunction() {
-        return function;
-    }
-    
-    /**
-     * arguments (typically {@link QuotedString} or more {@link FunctionWithArgs}).
-     * 
-     * null means it is a function in a map key which expects map value to be the arguments -- specified without parentheses;
-     * empty means parentheses already applied, with 0 args.
-     */
-    public List<Object> getArgs() {
-        return args;
-    }
-    
-    @Override
-    public String toString() {
-        return function+(args==null ? "" : args);
-    }
-
-    public Object arg(int i) {
-        return args.get(i);
-    }
-    
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/QuotedString.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/QuotedString.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/QuotedString.java
deleted file mode 100644
index 485d00a..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/parse/QuotedString.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.dsl.parse;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import brooklyn.util.text.StringEscapes.JavaStringEscapes;
-
-import com.google.common.base.Objects;
-
-public class QuotedString {
-    private final String s;
-    
-    public QuotedString(String s) {
-        this.s = checkNotNull(s, "string");
-    }
-    @Override
-    public String toString() {
-        return s;
-    }
-    public String unwrapped() {
-        return JavaStringEscapes.unwrapJavaString(s);
-    }
-    
-    @Override
-    public boolean equals(Object obj) {
-        return (obj instanceof QuotedString) && ((QuotedString)obj).toString().equals(toString());
-    }
-    
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(s);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractBrooklynResourceLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractBrooklynResourceLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractBrooklynResourceLookup.java
deleted file mode 100644
index 5e0e3f0..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractBrooklynResourceLookup.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.lookup;
-
-import io.brooklyn.camp.spi.AbstractResource;
-import io.brooklyn.camp.spi.PlatformRootSummary;
-import io.brooklyn.camp.spi.collection.AbstractResourceLookup;
-import brooklyn.management.ManagementContext;
-
-public abstract class AbstractBrooklynResourceLookup<T extends AbstractResource>  extends AbstractResourceLookup<T> {
-
-    protected final PlatformRootSummary root;
-    protected final ManagementContext bmc;
-
-    public AbstractBrooklynResourceLookup(PlatformRootSummary root, ManagementContext bmc) {
-        this.root = root;
-        this.bmc = bmc;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
deleted file mode 100644
index a15b178..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AbstractTemplateBrooklynLookup.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.lookup;
-
-import io.brooklyn.camp.spi.AbstractResource;
-import io.brooklyn.camp.spi.PlatformRootSummary;
-import io.brooklyn.camp.spi.collection.ResolvableLink;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.brooklyn.catalog.CatalogItem;
-import brooklyn.catalog.internal.CatalogUtils;
-import brooklyn.entity.Entity;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.management.ManagementContext;
-
-public abstract class AbstractTemplateBrooklynLookup<T extends AbstractResource>  extends AbstractBrooklynResourceLookup<T> {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractTemplateBrooklynLookup.class);
-    
-    public AbstractTemplateBrooklynLookup(PlatformRootSummary root, ManagementContext bmc) {
-        super(root, bmc);
-    }
-
-    @Override
-    public T get(String id) {
-        CatalogItem<?,?> item = getCatalogItem(id);
-        if (item==null) {
-            log.warn("Could not find item '"+id+"' in Brooklyn catalog; returning null");
-            return null;
-        }
-        return adapt(item);
-    }
-
-    private CatalogItem<?, ?> getCatalogItem(String versionedId) {
-        return CatalogUtils.getCatalogItemOptionalVersion(bmc, versionedId);
-    }
-
-    public abstract T adapt(CatalogItem<?,?> item);
-
-    protected ResolvableLink<T> newLink(CatalogItem<? extends Entity,EntitySpec<?>> li) {
-        return newLink(li.getId(), li.getDisplayName());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyBrooklynLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyBrooklynLookup.java
deleted file mode 100644
index 2f0380f..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyBrooklynLookup.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.lookup;
-
-import io.brooklyn.camp.spi.Assembly;
-import io.brooklyn.camp.spi.PlatformRootSummary;
-import io.brooklyn.camp.spi.collection.ResolvableLink;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import brooklyn.entity.Application;
-import brooklyn.entity.Entity;
-import brooklyn.management.ManagementContext;
-
-
-public class AssemblyBrooklynLookup extends AbstractBrooklynResourceLookup<Assembly> {
-
-    private PlatformComponentBrooklynLookup pcs;
-
-    public AssemblyBrooklynLookup(PlatformRootSummary root, ManagementContext bmc, PlatformComponentBrooklynLookup pcs) {
-        super(root, bmc);
-        this.pcs = pcs;
-    }
-
-    @Override
-    public Assembly get(String id) {
-        Entity entity = bmc.getEntityManager().getEntity(id);
-        if (!(entity instanceof Application))
-            throw new IllegalArgumentException("Element for "+id+" is not an Application ("+entity+")");
-        Assembly.Builder<? extends Assembly> builder = Assembly.builder()
-                .created(new Date(entity.getCreationTime()))
-                .id(entity.getId())
-                .name(entity.getDisplayName());
-        
-        builder.customAttribute("externalManagementUri", BrooklynUrlLookup.getUrl(bmc, entity));
-        
-        for (Entity child: entity.getChildren())
-            // FIXME this walks the whole damn tree!
-            builder.add( pcs.get(child.getId() ));
-        return builder.build();
-    }
-
-    @Override
-    public List<ResolvableLink<Assembly>> links() {
-        List<ResolvableLink<Assembly>> result = new ArrayList<ResolvableLink<Assembly>>();
-        for (Application app: bmc.getApplications())
-            result.add(newLink(app.getId(), app.getDisplayName()));
-        return result;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.java
deleted file mode 100644
index 24c40bc..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/AssemblyTemplateBrooklynLookup.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.brooklyn.spi.lookup;
-
-import io.brooklyn.camp.brooklyn.spi.creation.BrooklynAssemblyTemplateInstantiator;
-import io.brooklyn.camp.spi.AssemblyTemplate;
-import io.brooklyn.camp.spi.PlatformRootSummary;
-import io.brooklyn.camp.spi.collection.ResolvableLink;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.brooklyn.catalog.CatalogItem;
-import brooklyn.catalog.CatalogPredicates;
-import brooklyn.entity.Application;
-import brooklyn.entity.Entity;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.management.ManagementContext;
-
-public class AssemblyTemplateBrooklynLookup extends AbstractTemplateBrooklynLookup<AssemblyTemplate> {
-
-    public AssemblyTemplateBrooklynLookup(PlatformRootSummary root, ManagementContext bmc) {
-        super(root, bmc);
-    }
-
-    @Override
-    public AssemblyTemplate adapt(CatalogItem<?,?> item) {
-        return AssemblyTemplate.builder().
-                name(item.getDisplayName()).
-                id(item.getId()).
-                description(item.getDescription()).
-                created(root.getCreated()).
-                instantiator(BrooklynAssemblyTemplateInstantiator.class).
-                build();
-    }
-
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    // why can I not pass an EntitySpec<? extends Application> to    newLink(EntitySpec<?> spec)  ?
-    // feels to me (alexheneveld) that `? extends Application` should be both covariant and contravariant to `?` ..
-    // but it's not, so we introduce this conversion method
-    protected ResolvableLink<AssemblyTemplate> newApplicationLink(CatalogItem<? extends Entity, EntitySpec<? extends Application>> li) {
-        return super.newLink((CatalogItem)li);
-    }
-    
-    @Override
-    public List<ResolvableLink<AssemblyTemplate>> links() {
-        Iterable<CatalogItem<Application,EntitySpec<? extends Application>>> l = bmc.getCatalog().getCatalogItems(CatalogPredicates.IS_TEMPLATE);
-        List<ResolvableLink<AssemblyTemplate>> result = new ArrayList<ResolvableLink<AssemblyTemplate>>();
-        for (CatalogItem<Application,EntitySpec<? extends Application>> li: l)
-            result.add(newApplicationLink(li));
-        return result;
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/BrooklynUrlLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/BrooklynUrlLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/BrooklynUrlLookup.java
deleted file mode 100644
index a27be03..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/BrooklynUrlLookup.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.brooklyn.spi.lookup;
-
-import brooklyn.config.ConfigKey;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.ConfigKeys;
-import brooklyn.management.ManagementContext;
-import brooklyn.util.net.Urls;
-
-public class BrooklynUrlLookup {
-
-    public static ConfigKey<String> BROOKLYN_ROOT_URL = ConfigKeys.newStringConfigKey("brooklyn.root.url");
-    
-    public static String getUrl(ManagementContext bmc, Entity entity) {
-        String root = bmc.getConfig().getConfig(BROOKLYN_ROOT_URL);
-        if (root==null) return null;
-        return Urls.mergePaths(root, "#/", 
-                "/v1/applications/"+entity.getApplicationId()+"/entities/"+entity.getId());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentBrooklynLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentBrooklynLookup.java
deleted file mode 100644
index 90e5113..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentBrooklynLookup.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.lookup;
-
-import io.brooklyn.camp.spi.PlatformComponent;
-import io.brooklyn.camp.spi.PlatformComponent.Builder;
-import io.brooklyn.camp.spi.PlatformRootSummary;
-import io.brooklyn.camp.spi.collection.ResolvableLink;
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-
-import brooklyn.entity.Entity;
-import brooklyn.management.ManagementContext;
-
-
-public class PlatformComponentBrooklynLookup extends AbstractBrooklynResourceLookup<PlatformComponent> {
-
-    public PlatformComponentBrooklynLookup(PlatformRootSummary root, ManagementContext bmc) {
-        super(root, bmc);
-    }
-
-    @Override
-    public PlatformComponent get(String id) {
-        Entity entity = bmc.getEntityManager().getEntity(id);
-        Builder<? extends PlatformComponent> builder = PlatformComponent.builder()
-            .created(new Date(entity.getCreationTime()))
-            .id(entity.getId())
-            .name(entity.getDisplayName())
-            .externalManagementUri(BrooklynUrlLookup.getUrl(bmc, entity));
-        
-        for (Entity child: entity.getChildren())
-            // FIXME this walks the whole damn tree!
-            builder.add( get(child.getId() ));
-        return builder.build();
-    }
-
-    // platform components are not listed at the top level -- you have to walk the assemblies
-    @Override
-    public List<ResolvableLink<PlatformComponent>> links() {
-        return Collections.emptyList();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
deleted file mode 100644
index 7abb8ad..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/lookup/PlatformComponentTemplateBrooklynLookup.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.lookup;
-
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-import io.brooklyn.camp.spi.PlatformRootSummary;
-import io.brooklyn.camp.spi.collection.ResolvableLink;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.brooklyn.catalog.CatalogItem;
-import brooklyn.catalog.CatalogPredicates;
-import brooklyn.entity.Entity;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.management.ManagementContext;
-
-public class PlatformComponentTemplateBrooklynLookup extends AbstractTemplateBrooklynLookup<PlatformComponentTemplate> {
-
-    public PlatformComponentTemplateBrooklynLookup(PlatformRootSummary root, ManagementContext bmc) {
-        super(root, bmc);
-    }
-
-    @Override
-    public PlatformComponentTemplate adapt(CatalogItem<?,?> item) {
-        return PlatformComponentTemplate.builder().
-                name(item.getDisplayName()).
-                id(item.getId()).
-                description(item.getDescription()).
-                created(root.getCreated()).
-                build();
-    }
-
-    @Override
-    public List<ResolvableLink<PlatformComponentTemplate>> links() {
-        Iterable<CatalogItem<Entity,EntitySpec<?>>> l = bmc.getCatalog().getCatalogItems(CatalogPredicates.IS_ENTITY);
-        List<ResolvableLink<PlatformComponentTemplate>> result = new ArrayList<ResolvableLink<PlatformComponentTemplate>>();
-        for (CatalogItem<Entity,EntitySpec<?>> li: l)
-            result.add(newLink(li));
-        return result;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/platform/BrooklynImmutableCampPlatform.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/platform/BrooklynImmutableCampPlatform.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/platform/BrooklynImmutableCampPlatform.java
deleted file mode 100644
index e5369cd..0000000
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/platform/BrooklynImmutableCampPlatform.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package io.brooklyn.camp.brooklyn.spi.platform;
-
-import io.brooklyn.camp.CampPlatform;
-import io.brooklyn.camp.brooklyn.spi.lookup.AssemblyBrooklynLookup;
-import io.brooklyn.camp.brooklyn.spi.lookup.AssemblyTemplateBrooklynLookup;
-import io.brooklyn.camp.brooklyn.spi.lookup.PlatformComponentBrooklynLookup;
-import io.brooklyn.camp.brooklyn.spi.lookup.PlatformComponentTemplateBrooklynLookup;
-import io.brooklyn.camp.spi.ApplicationComponent;
-import io.brooklyn.camp.spi.ApplicationComponentTemplate;
-import io.brooklyn.camp.spi.Assembly;
-import io.brooklyn.camp.spi.AssemblyTemplate;
-import io.brooklyn.camp.spi.PlatformComponent;
-import io.brooklyn.camp.spi.PlatformComponentTemplate;
-import io.brooklyn.camp.spi.PlatformRootSummary;
-import io.brooklyn.camp.spi.PlatformTransaction;
-import io.brooklyn.camp.spi.collection.BasicResourceLookup;
-import io.brooklyn.camp.spi.collection.ResourceLookup;
-import io.brooklyn.camp.spi.collection.ResourceLookup.EmptyResourceLookup;
-import brooklyn.camp.brooklyn.api.HasBrooklynManagementContext;
-import brooklyn.management.ManagementContext;
-
-/** Immutable CAMP platform which reflects things in the underlying Brooklyn system */
-public class BrooklynImmutableCampPlatform extends CampPlatform implements HasBrooklynManagementContext {
-
-    private final ManagementContext bmc;
-    private final AssemblyTemplateBrooklynLookup ats;
-    private final PlatformComponentTemplateBrooklynLookup pcts;
-    private final BasicResourceLookup<ApplicationComponentTemplate> acts;
-    private final PlatformComponentBrooklynLookup pcs;
-    private final AssemblyBrooklynLookup assemblies;
-
-    public BrooklynImmutableCampPlatform(PlatformRootSummary root, ManagementContext managementContext) {
-        super(root);
-        this.bmc = managementContext;
-        
-        // these come from brooklyn
-        pcts = new PlatformComponentTemplateBrooklynLookup(root(), getBrooklynManagementContext());
-        ats = new AssemblyTemplateBrooklynLookup(root(), getBrooklynManagementContext());
-        pcs = new PlatformComponentBrooklynLookup(root(), getBrooklynManagementContext());
-        assemblies = new AssemblyBrooklynLookup(root(), getBrooklynManagementContext(), pcs);
-        
-        // ACT's are not known in brooklyn (everything comes in as config) -- to be extended to support!
-        acts = new BasicResourceLookup<ApplicationComponentTemplate>();
-    }
-
-    // --- brooklyn setup
-    
-    public ManagementContext getBrooklynManagementContext() {
-        return bmc;
-    }
-    
-    // --- camp comatibility setup
-    
-    @Override
-    public ResourceLookup<PlatformComponentTemplate> platformComponentTemplates() {
-        return pcts;
-    }
-
-    @Override
-    public ResourceLookup<ApplicationComponentTemplate> applicationComponentTemplates() {
-        return acts;
-    }
-
-    @Override
-    public ResourceLookup<AssemblyTemplate> assemblyTemplates() {
-        return ats;
-    }
-    
-    @Override
-    public ResourceLookup<PlatformComponent> platformComponents() {
-        return pcs;
-    }
-
-    @Override
-    public ResourceLookup<ApplicationComponent> applicationComponents() {
-        return new EmptyResourceLookup<ApplicationComponent>();
-    }
-
-    @Override
-    public ResourceLookup<Assembly> assemblies() {
-        return assemblies;
-    }
-    
-    @Override
-    public PlatformTransaction transaction() {
-        throw new IllegalStateException(this+" does not support adding new items");
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampConstants.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampConstants.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampConstants.java
new file mode 100644
index 0000000..4a2078b
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampConstants.java
@@ -0,0 +1,50 @@
+/*
+ * 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.brooklyn;
+
+import io.brooklyn.camp.CampPlatform;
+
+import java.util.Set;
+
+import brooklyn.config.BrooklynServerConfig;
+import brooklyn.config.ConfigInheritance;
+import brooklyn.config.ConfigKey;
+import brooklyn.entity.basic.ConfigKeys;
+
+import com.google.common.collect.ImmutableSet;
+
+public class BrooklynCampConstants {
+
+    public static final String PLAN_ID_FLAG = "planId";
+
+    public static final ConfigKey<String> PLAN_ID = ConfigKeys.builder(String.class, "camp.plan.id")
+            .description("Identifier supplied in the deployment plan for component to which this entity corresponds "
+                        + "(human-readable, for correlating across plan, template, and instance)")
+            .inheritance(ConfigInheritance.NONE)
+            .build();
+
+    public static final ConfigKey<String> TEMPLATE_ID = ConfigKeys.builder(String.class, "camp.template.id")
+            .description("UID of the component in the CAMP template from which this entity was created")
+            .inheritance(ConfigInheritance.NONE)
+            .build();
+
+    public static final ConfigKey<CampPlatform> CAMP_PLATFORM = BrooklynServerConfig.CAMP_PLATFORM;
+
+    public static final Set<String> YAML_URL_PROTOCOL_WHITELIST = ImmutableSet.of("classpath", "http");
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatform.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatform.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatform.java
new file mode 100644
index 0000000..6f941aa
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatform.java
@@ -0,0 +1,78 @@
+/*
+ * 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.brooklyn;
+
+import io.brooklyn.camp.AggregatingCampPlatform;
+import io.brooklyn.camp.CampPlatform;
+import io.brooklyn.camp.spi.PlatformRootSummary;
+
+import org.apache.brooklyn.camp.brooklyn.spi.creation.BrooklynEntityMatcher;
+import org.apache.brooklyn.camp.brooklyn.spi.dsl.BrooklynDslInterpreter;
+import org.apache.brooklyn.camp.brooklyn.spi.platform.BrooklynImmutableCampPlatform;
+
+import brooklyn.camp.brooklyn.api.HasBrooklynManagementContext;
+import brooklyn.config.BrooklynProperties;
+import brooklyn.management.ManagementContext;
+import brooklyn.management.ManagementContext.PropertiesReloadListener;
+
+/** {@link CampPlatform} implementation which includes Brooklyn entities 
+ * (via {@link BrooklynImmutableCampPlatform})
+ * and allows customisation / additions */
+public class BrooklynCampPlatform extends AggregatingCampPlatform implements HasBrooklynManagementContext {
+
+    private final ManagementContext bmc;
+
+    public BrooklynCampPlatform(PlatformRootSummary root, ManagementContext managementContext) {
+        super(root);
+        addPlatform(new BrooklynImmutableCampPlatform(root, managementContext));
+        
+        this.bmc = managementContext;
+        
+        addMatchers();
+        addInterpreters();
+        
+        managementContext.addPropertiesReloadListener(new PropertiesReloadListener() {
+            private static final long serialVersionUID = -3739276553334749184L;
+            @Override public void reloaded() {
+                setConfigKeyAtManagmentContext();
+            }
+        });
+    }
+
+    // --- brooklyn setup
+    
+    public ManagementContext getBrooklynManagementContext() {
+        return bmc;
+    }
+    
+    protected void addMatchers() {
+        // TODO artifacts
+        pdp().addMatcher(new BrooklynEntityMatcher(bmc));
+    }
+    
+    protected void addInterpreters() {
+        pdp().addInterpreter(new BrooklynDslInterpreter());
+    }
+
+    public BrooklynCampPlatform setConfigKeyAtManagmentContext() {
+        ((BrooklynProperties)bmc.getConfig()).put(BrooklynCampConstants.CAMP_PLATFORM, this);
+        return this;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherAbstract.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherAbstract.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherAbstract.java
new file mode 100644
index 0000000..d1c3cf2
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherAbstract.java
@@ -0,0 +1,73 @@
+/*
+ * 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.brooklyn;
+
+import io.brooklyn.camp.spi.PlatformRootSummary;
+import brooklyn.management.ManagementContext;
+import brooklyn.management.internal.LocalManagementContext;
+
+import com.google.common.annotations.Beta;
+
+/** launcher for {@link BrooklynCampPlatform}, which may or may not start a (web) server depending on children */
+@Beta
+public abstract class BrooklynCampPlatformLauncherAbstract {
+
+    protected BrooklynCampPlatform platform;
+    protected ManagementContext mgmt;
+    
+    public BrooklynCampPlatformLauncherAbstract useManagementContext(ManagementContext mgmt) {
+        if (this.mgmt!=null && mgmt!=this.mgmt)
+            throw new IllegalStateException("Attempt to change mgmt context; not supported.");
+        
+        this.mgmt = mgmt;
+        
+        return this;
+    }
+    
+    public BrooklynCampPlatformLauncherAbstract launch() {
+        if (platform!=null)
+            throw new IllegalStateException("platform already created");
+
+        if (getBrooklynMgmt()==null)
+            useManagementContext(newMgmtContext());
+        
+        platform = new BrooklynCampPlatform(
+                PlatformRootSummary.builder().name("Brooklyn CAMP Platform").build(),
+                getBrooklynMgmt())
+            .setConfigKeyAtManagmentContext();
+        
+        return this;
+    }
+
+    protected LocalManagementContext newMgmtContext() {
+        return new LocalManagementContext();
+    }
+
+    public ManagementContext getBrooklynMgmt() {
+        return mgmt;
+    }
+    
+    public BrooklynCampPlatform getCampPlatform() {
+        return platform;
+    }
+
+    /** stops any servers (camp and brooklyn) launched by this launcher */
+    public abstract void stopServers() throws Exception;
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherNoServer.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherNoServer.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherNoServer.java
new file mode 100644
index 0000000..bbfe2ab
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampPlatformLauncherNoServer.java
@@ -0,0 +1,36 @@
+/*
+ * 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.brooklyn;
+
+import com.google.common.annotations.Beta;
+
+
+/** launcher for {@link BrooklynCampPlatform}, which does not start a server (and can live in this project) */
+@Beta
+public class BrooklynCampPlatformLauncherNoServer extends BrooklynCampPlatformLauncherAbstract {
+
+    public void stopServers() {
+        // nothing to do
+    }
+    
+    public static void main(String[] args) {
+        new BrooklynCampPlatformLauncherNoServer().launch();
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java
new file mode 100644
index 0000000..7fe6030
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java
@@ -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.
+ */
+package org.apache.brooklyn.camp.brooklyn;
+
+public interface BrooklynCampReservedKeys {
+    public static final String BROOKLYN_CONFIG = "brooklyn.config";
+    public static final String BROOKLYN_FLAGS = "brooklyn.flags";
+    public static final String BROOKLYN_POLICIES = "brooklyn.policies";
+    public static final String BROOKLYN_ENRICHERS = "brooklyn.enrichers";
+    public static final String BROOKLYN_CHILDREN = "brooklyn.children";
+    public static final String BROOKLYN_INITIALIZERS = "brooklyn.initializers";
+    public static final String BROOKLYN_CATALOG = "brooklyn.catalog";
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherAbstract.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherAbstract.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherAbstract.java
new file mode 100644
index 0000000..9e54c49
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherAbstract.java
@@ -0,0 +1,133 @@
+/*
+ * 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.brooklyn;
+
+import io.brooklyn.camp.spi.Assembly;
+import io.brooklyn.camp.spi.AssemblyTemplate;
+
+import java.io.Reader;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.Application;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BrooklynShutdownHooks;
+import brooklyn.entity.basic.BrooklynTaskTags;
+import brooklyn.entity.basic.Entities;
+import brooklyn.management.ManagementContext;
+import brooklyn.management.Task;
+import brooklyn.util.ResourceUtils;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.stream.Streams;
+
+import com.google.common.annotations.Beta;
+
+/** convenience for launching YAML files directly */
+@Beta
+public abstract class YamlLauncherAbstract {
+
+    private static final Logger log = LoggerFactory.getLogger(YamlLauncherAbstract.class);
+       
+    protected final BrooklynCampPlatformLauncherAbstract platformLauncher;
+
+    protected final BrooklynCampPlatform platform;
+    protected final ManagementContext brooklynMgmt;
+    protected boolean shutdownAppsOnExit = false;
+
+    public YamlLauncherAbstract() {
+        this.platformLauncher = newPlatformLauncher();
+        platformLauncher.launch();
+        this.platform = platformLauncher.getCampPlatform();
+        this.brooklynMgmt = platformLauncher.getBrooklynMgmt();
+    }
+
+    public ManagementContext getManagementContext() {
+        return brooklynMgmt;
+    }
+
+    public boolean getShutdownAppsOnExit() {
+        return shutdownAppsOnExit;
+    }
+    
+    public void setShutdownAppsOnExit(boolean shutdownAppsOnExit) {
+        this.shutdownAppsOnExit = shutdownAppsOnExit;
+    }
+    
+    protected abstract BrooklynCampPlatformLauncherAbstract newPlatformLauncher();
+
+    public Application launchAppYaml(String url) {
+        return launchAppYaml(url, true);
+    }
+
+    public Application launchAppYaml(String url, boolean waitForTasksToComplete) {
+        try {
+            Reader input = Streams.reader(new ResourceUtils(this).getResourceFromUrl(url));
+            Application app = launchAppYaml(input, waitForTasksToComplete);
+            log.info("Application started from YAML file "+url+": "+app);
+            return app;
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
+    public Application launchAppYaml(Reader input) {
+        return launchAppYaml(input, true);
+    }
+
+    public Application launchAppYaml(Reader input, boolean waitForTasksToComplete) {
+        try {
+            AssemblyTemplate at = platform.pdp().registerDeploymentPlan(input);
+
+            Assembly assembly = at.getInstantiator().newInstance().instantiate(at, platform);
+            Entity app = brooklynMgmt.getEntityManager().getEntity(assembly.getId());
+            log.info("Launching "+app);
+
+            if (getShutdownAppsOnExit()) BrooklynShutdownHooks.invokeStopOnShutdown(app);
+
+            if (waitForTasksToComplete) {
+                Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(brooklynMgmt.getExecutionManager(), app);
+                log.info("Waiting on "+tasks.size()+" task(s)");
+                for (Task<?> t: tasks) {
+                    t.blockUntilEnded();
+                }
+            }
+
+            log.info("Application started from YAML: "+app);
+            Entities.dumpInfo(app);
+            return (Application)app;
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
+    /** kills all apps, web servers, and mgmt context
+     * <p>
+     * this launcher does not support being used again subsequently */
+    public void destroyAll() {
+        Entities.destroyAll(getManagementContext());
+        try {
+            platformLauncher.stopServers();
+        } catch (Exception e) {
+            log.warn("Unable to stop servers (ignoring): "+e);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherNoServer.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherNoServer.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherNoServer.java
new file mode 100644
index 0000000..1ec3c8d
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/YamlLauncherNoServer.java
@@ -0,0 +1,39 @@
+/*
+ * 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.brooklyn;
+
+import com.google.common.annotations.Beta;
+
+/** convenience for launching YAML files directly */
+@Beta
+public class YamlLauncherNoServer extends YamlLauncherAbstract {
+
+    @Override
+    protected BrooklynCampPlatformLauncherAbstract newPlatformLauncher() {
+        return new BrooklynCampPlatformLauncherNoServer();
+    }
+
+    public static void main(String[] args) {
+        YamlLauncherNoServer l = new YamlLauncherNoServer();
+        l.setShutdownAppsOnExit(true);
+        
+        l.launchAppYaml("java-web-app-and-db-with-function.yaml");
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/e406d1ad/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
new file mode 100644
index 0000000..3254e20
--- /dev/null
+++ b/usage/camp/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@ -0,0 +1,283 @@
+/*
+ * 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.brooklyn.spi.creation;
+
+import io.brooklyn.camp.CampPlatform;
+import io.brooklyn.camp.spi.Assembly;
+import io.brooklyn.camp.spi.AssemblyTemplate;
+import io.brooklyn.camp.spi.AssemblyTemplate.Builder;
+import io.brooklyn.camp.spi.PlatformComponentTemplate;
+import io.brooklyn.camp.spi.collection.ResolvableLink;
+import io.brooklyn.camp.spi.instantiate.AssemblyTemplateInstantiator;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.camp.brooklyn.api.AssemblyTemplateSpecInstantiator;
+import brooklyn.camp.brooklyn.api.HasBrooklynManagementContext;
+
+import org.apache.brooklyn.camp.brooklyn.BrooklynCampConstants;
+import org.apache.brooklyn.catalog.CatalogItem;
+import brooklyn.catalog.internal.BasicBrooklynCatalog.BrooklynLoaderTracker;
+import brooklyn.catalog.internal.CatalogUtils;
+import brooklyn.config.BrooklynServerConfig;
+import brooklyn.entity.Application;
+import brooklyn.entity.Entity;
+import brooklyn.entity.basic.BasicApplicationImpl;
+import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.management.ManagementContext;
+import brooklyn.management.classloading.BrooklynClassLoadingContext;
+import brooklyn.management.internal.EntityManagementUtils;
+import brooklyn.management.internal.EntityManagementUtils.CreationResult;
+import brooklyn.util.ResourceUtils;
+import brooklyn.util.exceptions.Exceptions;
+import brooklyn.util.flags.TypeCoercions;
+import brooklyn.util.net.Urls;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+
+public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateSpecInstantiator {
+
+    private static final Logger log = LoggerFactory.getLogger(BrooklynAssemblyTemplateInstantiator.class);
+
+    public static final String NEVER_UNWRAP_APPS_PROPERTY = "wrappedApp";
+
+    @Override
+    public Assembly instantiate(AssemblyTemplate template, CampPlatform platform) {
+        Application app = create(template, platform);
+        CreationResult<Application, Void> start = EntityManagementUtils.start(app);
+        log.debug("CAMP created "+app+"; starting in "+start.task());
+        return platform.assemblies().get(app.getApplicationId());
+    }
+
+    public Application create(AssemblyTemplate template, CampPlatform platform) {
+        Application instance = EntityManagementUtils.createUnstarted(getBrooklynManagementContext(platform), template);
+        log.debug("CAMP created {}", instance);
+        return instance;
+    }
+
+    private ManagementContext getBrooklynManagementContext(CampPlatform platform) {
+        return ((HasBrooklynManagementContext)platform).getBrooklynManagementContext();
+    }
+
+    @SuppressWarnings("unchecked")
+    public EntitySpec<? extends Application> createSpec(AssemblyTemplate template, CampPlatform platform, BrooklynClassLoadingContext loader, boolean autoUnwrapIfPossible) {
+        log.debug("CAMP creating application instance for {} ({})", template.getId(), template);
+
+        // AssemblyTemplates created via PDP, _specifying_ then entities to put in
+
+        BrooklynComponentTemplateResolver resolver = BrooklynComponentTemplateResolver.Factory.newInstance(
+            loader, buildWrapperAppTemplate(template));
+        EntitySpec<? extends Application> app = resolver.resolveSpec(null);
+
+        // first build the children into an empty shell app
+        List<EntitySpec<?>> childSpecs = buildTemplateServicesAsSpecs(loader, template, platform);
+        for (EntitySpec<?> childSpec : childSpecs) {
+            app.child(childSpec);
+        }
+
+        if (autoUnwrapIfPossible && shouldUnwrap(template, app)) {
+            EntitySpec<? extends Application> oldApp = app;
+            app = (EntitySpec<? extends Application>) Iterables.getOnlyElement( app.getChildren() );
+
+            // if promoted, apply the transformations done to the app
+            // (transformations will be done by the resolveSpec call above, but we are collapsing oldApp so transfer to app=newApp)
+            EntityManagementUtils.collapseSpec(oldApp, app);
+        } else {
+            app.configure(EntityManagementUtils.WRAPPER_APP_MARKER, Boolean.TRUE);
+        }
+
+        return app;
+    }
+
+    private AssemblyTemplate buildWrapperAppTemplate(AssemblyTemplate template) {
+        Builder<? extends AssemblyTemplate> builder = AssemblyTemplate.builder();
+        builder.type("brooklyn:" + BasicApplicationImpl.class.getName());
+        builder.id(template.getId());
+        builder.name(template.getName());
+        builder.sourceCode(template.getSourceCode());
+        for (Entry<String, Object> entry : template.getCustomAttributes().entrySet()) {
+            builder.customAttribute(entry.getKey(), entry.getValue());
+        }
+        builder.instantiator(template.getInstantiator());
+        AssemblyTemplate wrapTemplate = builder.build();
+        return wrapTemplate;
+    }
+
+    protected boolean shouldUnwrap(AssemblyTemplate template, EntitySpec<? extends Application> app) {
+        Object leaveWrapped = template.getCustomAttributes().get(NEVER_UNWRAP_APPS_PROPERTY);
+        if (leaveWrapped!=null) {
+            if (TypeCoercions.coerce(leaveWrapped, Boolean.class))
+                return false;
+        }
+
+        if (app.getChildren().size()!=1)
+            return false;
+
+        EntitySpec<?> childSpec = Iterables.getOnlyElement(app.getChildren());
+        if (childSpec.getType()==null || !Application.class.isAssignableFrom(childSpec.getType()))
+            return false;
+
+        return EntityManagementUtils.hasNoNameOrCustomKeysOrRoot(template, app);
+    }
+
+    private List<EntitySpec<?>> buildTemplateServicesAsSpecs(BrooklynClassLoadingContext loader, AssemblyTemplate template, CampPlatform platform) {
+        return buildTemplateServicesAsSpecsImpl(loader, template, platform, Sets.<String>newLinkedHashSet());
+    }
+
+    private List<EntitySpec<?>> buildTemplateServicesAsSpecsImpl(BrooklynClassLoadingContext loader, AssemblyTemplate template, CampPlatform platform, Set<String> encounteredCatalogTypes) {
+        List<EntitySpec<?>> result = Lists.newArrayList();
+
+        for (ResolvableLink<PlatformComponentTemplate> ctl: template.getPlatformComponentTemplates().links()) {
+            PlatformComponentTemplate appChildComponentTemplate = ctl.resolve();
+            BrooklynComponentTemplateResolver entityResolver = BrooklynComponentTemplateResolver.Factory.newInstance(loader, appChildComponentTemplate);
+            EntitySpec<?> spec = resolveSpec(ResourceUtils.create(this), entityResolver, encounteredCatalogTypes);
+
+            result.add(spec);
+        }
+        return result;
+    }
+
+    static EntitySpec<?> resolveSpec(ResourceUtils ru,
+            BrooklynComponentTemplateResolver entityResolver,
+            Set<String> encounteredCatalogTypes) {
+        String brooklynType = entityResolver.getServiceTypeResolver().getBrooklynType(entityResolver.getDeclaredType());
+        CatalogItem<Entity, EntitySpec<?>> item = entityResolver.getServiceTypeResolver().getCatalogItem(entityResolver, entityResolver.getDeclaredType());
+
+        if (log.isTraceEnabled()) log.trace("Building CAMP template services: type="+brooklynType+"; item="+item+"; loader="+entityResolver.getLoader()+"; encounteredCatalogTypes="+encounteredCatalogTypes);
+
+        EntitySpec<?> spec = null;
+        String protocol = Urls.getProtocol(brooklynType);
+        if (protocol != null) {
+            if (BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST.contains(protocol)) {
+                spec = tryResolveYamlUrlReferenceSpec(ru, brooklynType, entityResolver.getLoader(), encounteredCatalogTypes);
+                if (spec != null) {
+                    entityResolver.populateSpec(spec);
+                }
+            } else {
+                // TODO support https above
+                // TODO this will probably be logged if we refer to  chef:cookbook  or other service types which BCTR accepts;
+                // better would be to have BCTR supporting the calls above
+                log.debug("The reference " + brooklynType + " looks like a URL (running the CAMP Brooklyn assembly-template instantiator) but the protocol " +
+                        protocol + " isn't white listed (" + BrooklynCampConstants.YAML_URL_PROTOCOL_WHITELIST + "). " +
+                        "Will try to load it as catalog item or java type.");
+            }
+        }
+
+        if (spec == null) {
+            // load from java or yaml
+            spec = entityResolver.resolveSpec(encounteredCatalogTypes);
+        }
+
+        return spec;
+    }
+
+    private static EntitySpec<?> tryResolveYamlUrlReferenceSpec(
+            ResourceUtils ru,
+            String brooklynType, BrooklynClassLoadingContext itemLoader,
+            Set<String> encounteredCatalogTypes) {
+        ManagementContext mgmt = itemLoader.getManagementContext();
+        Reader yaml;
+        try {
+            yaml = new InputStreamReader(ru.getResourceFromUrl(brooklynType), "UTF-8");
+        } catch (Exception e) {
+            log.warn("AssemblyTemplate type " + brooklynType + " which looks like a URL can't be fetched.", e);
+            return null;
+        }
+        try {
+            return createNestedSpec(mgmt, encounteredCatalogTypes, yaml, itemLoader);
+        } finally {
+            try {
+                yaml.close();
+            } catch (IOException e) {
+                throw Exceptions.propagate(e);
+            }
+        }
+    }
+
+    static EntitySpec<?> resolveCatalogYamlReferenceSpec(
+            ManagementContext mgmt,
+            CatalogItem<Entity, EntitySpec<?>> item,
+            Set<String> encounteredCatalogTypes) {
+
+        String yaml = item.getPlanYaml();
+        Reader input = new StringReader(yaml);
+        BrooklynClassLoadingContext itemLoader = CatalogUtils.newClassLoadingContext(mgmt, item);
+
+        return createNestedSpec(mgmt, encounteredCatalogTypes, input, itemLoader);
+    }
+
+    private static EntitySpec<?> createNestedSpec(ManagementContext mgmt,
+            Set<String> encounteredCatalogTypes, Reader input,
+            BrooklynClassLoadingContext itemLoader) {
+        CampPlatform platform = BrooklynServerConfig.getCampPlatform(mgmt).get();
+
+        AssemblyTemplate at;
+        BrooklynLoaderTracker.setLoader(itemLoader);
+        try {
+            at = platform.pdp().registerDeploymentPlan(input);
+        } finally {
+            BrooklynLoaderTracker.unsetLoader(itemLoader);
+        }
+        return createNestedSpecStatic(at, platform, itemLoader, encounteredCatalogTypes);
+    }
+
+    @Override
+    public EntitySpec<?> createNestedSpec(
+            AssemblyTemplate template,
+            CampPlatform platform,
+            BrooklynClassLoadingContext itemLoader,
+            Set<String> encounteredCatalogTypes) {
+        return createNestedSpecStatic(template, platform, itemLoader, encounteredCatalogTypes);
+    }
+    
+    private static EntitySpec<?> createNestedSpecStatic(
+        AssemblyTemplate template,
+        CampPlatform platform,
+        BrooklynClassLoadingContext itemLoader,
+        Set<String> encounteredCatalogTypes) {
+        // In case we want to allow multiple top-level entities in a catalog we need to think
+        // about what it would mean to subsequently call buildChildrenEntitySpecs on the list of top-level entities!
+        try {
+            AssemblyTemplateInstantiator ati = template.getInstantiator().newInstance();
+            if (ati instanceof BrooklynAssemblyTemplateInstantiator) {
+                List<EntitySpec<?>> specs = ((BrooklynAssemblyTemplateInstantiator)ati).buildTemplateServicesAsSpecsImpl(itemLoader, template, platform, encounteredCatalogTypes);
+                if (specs.size() > 1) {
+                    throw new UnsupportedOperationException("Only supporting single service in catalog item currently: got "+specs);
+                }
+                return specs.get(0);
+            } else {
+                throw new IllegalStateException("Cannot create application with instantiator: " + ati);
+            }
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
+    }
+
+}