You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2016/04/14 18:34:14 UTC

[2/3] zest-java git commit: A Create Rest Application code generator.

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/HardCodedSecurityRepositoryMixinWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/HardCodedSecurityRepositoryMixinWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/HardCodedSecurityRepositoryMixinWriter.java
new file mode 100644
index 0000000..cd4fb34
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/HardCodedSecurityRepositoryMixinWriter.java
@@ -0,0 +1,67 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class HardCodedSecurityRepositoryMixinWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".model.security;" );
+            pw.println();
+            pw.println(
+                "import java.util.Collections;\n" +
+                "import java.util.List;\n" +
+                "import org.apache.zest.api.unitofwork.concern.UnitOfWorkPropagation;\n" +
+                "\n" +
+                "public class HardcodedSecurityRepositoryMixin\n" +
+                "    implements SecurityRepository\n" +
+                "{\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public boolean verifyPassword( String userName, String password )\n" +
+                "    {\n" +
+                "        if( userName.equals(\"admin\") && password.equals(\"secret\") )" +
+                "        {\n" +
+                "            return true;\n" +
+                "        }\n" +
+                "        if( userName.equals(\"user\") && password.equals(\"123\") )" +
+                "        {\n" +
+                "            return true;\n" +
+                "        }\n" +
+                "        return false;\n" +
+                "    }\n" +
+                "\n" +
+                "    @UnitOfWorkPropagation\n" +
+                "    public List<String> findRoleNamesOfUser( String name )\n" +
+                "    {\n" +
+                "        if( \"admin\".equals( name ) )\n" +
+                "        {\n" +
+                "            return Collections.singletonList(\"admin\");\n" +
+                "        }\n" +
+                "        return Collections.singletonList(\"user\");\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/model/security/";
+        String classname = "HardcodedSecurityRepositoryMixin";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "model/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexHtmlWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexHtmlWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexHtmlWriter.java
new file mode 100644
index 0000000..01a3be3
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexHtmlWriter.java
@@ -0,0 +1,37 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class IndexHtmlWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.println(
+                String.format(
+                    "<!DOCTYPE html>\n" +
+                    "<html><body>\n" +
+                    "<h1>Welcome to %s</h1>" +
+                    "</body></html>\n" +
+                    "<>\n", projectName )
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "app/src/main/webapp/index.html" ) ) );
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexingModuleWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexingModuleWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexingModuleWriter.java
new file mode 100644
index 0000000..e4f534d
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/IndexingModuleWriter.java
@@ -0,0 +1,66 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class IndexingModuleWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".bootstrap.infrastructure;" );
+            pw.println();
+            pw.println(
+                "import org.apache.zest.api.common.Visibility;\n" +
+                "import org.apache.zest.bootstrap.AssemblyException;\n" +
+                "import org.apache.zest.bootstrap.LayerAssembly;\n" +
+                "import org.apache.zest.bootstrap.ModuleAssembly;\n" +
+                "import org.apache.zest.bootstrap.layered.ModuleAssembler;\n" +
+                "import org.apache.zest.index.rdf.assembly.RdfNativeSesameStoreAssembler;\n" +
+                "import org.apache.zest.library.rdf.repository.NativeConfiguration;\n" +
+                "\n" +
+                "public class IndexingModule\n" +
+                "    implements ModuleAssembler\n" +
+                "{\n" +
+                "    public static final String NAME = \"Indexing Module\";\n" +
+                "    private final ModuleAssembly configModule;\n" +
+                "\n" +
+                "    public IndexingModule( ModuleAssembly configModule )\n" +
+                "    {\n" +
+                "        this.configModule = configModule;\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )\n" +
+                "        throws AssemblyException\n" +
+                "    {\n" +
+                "        module.withDefaultUnitOfWorkFactory();\n" +
+                "\n" +
+                "        configModule.entities( NativeConfiguration.class ).visibleIn( Visibility.application );\n" +
+                "        new RdfNativeSesameStoreAssembler(Visibility.application, Visibility.module).assemble( module );\n" +
+                "        return module;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/bootstrap/infrastructure/";
+        String classname = "IndexingModule";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "bootstrap/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/InfrastructureLayerWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/InfrastructureLayerWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/InfrastructureLayerWriter.java
new file mode 100644
index 0000000..d67abd9
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/InfrastructureLayerWriter.java
@@ -0,0 +1,71 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class InfrastructureLayerWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".bootstrap.infrastructure;" );
+            pw.println();
+            pw.println(
+                "import java.util.function.Function;\n" +
+                "import org.apache.zest.api.structure.Application;\n" +
+                "import org.apache.zest.api.structure.Module;\n" +
+                "import org.apache.zest.bootstrap.AssemblyException;\n" +
+                "import org.apache.zest.bootstrap.LayerAssembly;\n" +
+                "import org.apache.zest.bootstrap.ModuleAssembly;\n" +
+                "import org.apache.zest.bootstrap.layered.LayerAssembler;\n" +
+                "import org.apache.zest.bootstrap.layered.LayeredLayerAssembler;\n" +
+                "\n" +
+                "public class InfrastructureLayer extends LayeredLayerAssembler\n" +
+                "    implements LayerAssembler\n" +
+                "{\n" +
+                "    public static final String NAME = \"Infrastructure Layer\";\n" +
+                "    private final ModuleAssembly configModule;\n" +
+                "    private final Function<Application, Module> typeFinder;\n" +
+                "\n" +
+                "    public InfrastructureLayer( ModuleAssembly configModule, Function<Application, Module> typeFinder )\n" +
+                "    {\n" +
+                "        this.configModule = configModule;\n" +
+                "        this.typeFinder = typeFinder;\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public LayerAssembly assemble( LayerAssembly layer )\n" +
+                "        throws AssemblyException\n" +
+                "    {\n" +
+                "        createModule( layer, FileConfigurationModule.class );\n" +
+                "\n" +
+                "        new StorageModule( configModule ).assemble( layer, layer.module( StorageModule.NAME ) );\n" +
+                "        new IndexingModule( configModule ).assemble( layer, layer.module( IndexingModule.NAME ) );\n" +
+                "        new SerializationModule( typeFinder ).assemble( layer, layer.module( SerializationModule.NAME ) );\n" +
+                "\n" +
+                "        return layer;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/bootstrap/infrastructure/";
+        String classname = "InfrastructureLayer";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "bootstrap/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderItemWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderItemWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderItemWriter.java
new file mode 100644
index 0000000..94732bd
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderItemWriter.java
@@ -0,0 +1,46 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class OrderItemWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".model.orders;" );
+            pw.println();
+            pw.println("import java.math.BigDecimal;");
+            pw.println("import org.apache.zest.api.entity.Identity;");
+            pw.println("import org.apache.zest.api.property.Property;");
+            pw.println();
+            pw.println(
+                "public interface OrderItem extends Identity\n" +
+                "{\n" +
+                "    Property<String> partNumber();\n\n" +
+                "    Property<BigDecimal> unitPrice();\n\n" +
+                "    Property<Integer> units();\n\n" +
+                "    Property<BigDecimal> discount();\n\n" +
+                "}\n");
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/model/orders/";
+        String classname = "OrderItem";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "model/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderModuleWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderModuleWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderModuleWriter.java
new file mode 100644
index 0000000..c5eed46
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderModuleWriter.java
@@ -0,0 +1,65 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import static java.lang.String.format;
+
+public class OrderModuleWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".bootstrap.domain;" );
+            pw.println();
+            pw.println(
+                "import org.apache.zest.api.common.Visibility;\n" +
+                "import org.apache.zest.bootstrap.AssemblyException;\n" +
+                "import org.apache.zest.bootstrap.LayerAssembly;\n" +
+                "import org.apache.zest.bootstrap.ModuleAssembly;\n" +
+                "import org.apache.zest.bootstrap.layered.ModuleAssembler;");
+            pw.println(format("import %s.model.orders.Order;", rootPackage));
+            pw.println(format("import %s.model.orders.OrderItem;", rootPackage));
+            pw.println(format("import %s.model.orders.Customer;", rootPackage));
+            pw.println();
+            pw.println(
+                "public class OrderModule\n" +
+                "    implements ModuleAssembler\n" +
+                "{\n" +
+                "    public static String NAME;\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )\n" +
+                "        throws AssemblyException\n" +
+                "    {\n" +
+                "        module.values( /* add value types */    );\n" +
+                "        module.entities( Customer.class, Order.class, OrderItem.class );\n" +
+                "        module.services( /* add services */    )\n" +
+                "            .visibleIn( Visibility.layer )\n" +
+                "            .instantiateOnStartup();\n" +
+                "        return module;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/bootstrap/domain/";
+        String classname = "OrderModule";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "bootstrap/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderWriter.java
new file mode 100644
index 0000000..8a07d52
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/OrderWriter.java
@@ -0,0 +1,51 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class OrderWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".model.orders;" );
+            pw.println();
+            pw.println("import java.time.ZonedDateTime;");
+            pw.println("import org.apache.zest.api.association.Association;");
+            pw.println("import org.apache.zest.api.association.ManyAssociation;");
+            pw.println("import org.apache.zest.api.common.Optional;");
+            pw.println("import org.apache.zest.api.entity.Identity;");
+            pw.println("import org.apache.zest.api.property.Property;");
+            pw.println();
+            pw.println(
+                "public interface Order extends Identity\n" +
+                "{\n" +
+                "    Property<String> orderNumber();\n\n" +
+                "    Property<ZonedDateTime> registered();\n\n" +
+                "    @Optional\n" +
+                "    Property<ZonedDateTime> shipped();\n\n" +
+                "    Association<Customer> customer();\n\n" +
+                "    ManyAssociation<OrderItem> items();\n\n" +
+                "}\n");
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/model/orders/";
+        String classname = "Order";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "model/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/RestModuleWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/RestModuleWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/RestModuleWriter.java
new file mode 100644
index 0000000..4a80205
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/RestModuleWriter.java
@@ -0,0 +1,66 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import static java.lang.String.format;
+
+public class RestModuleWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".bootstrap.connectivity;" );
+            pw.println();
+            pw.println(format("import %s.rest.security.SimpleEnroler;", rootPackage));
+            pw.println(format("import %s.rest.security.SimpleVerifier;", rootPackage));
+            pw.println(
+                "import org.apache.zest.bootstrap.AssemblyException;\n" +
+                "import org.apache.zest.bootstrap.LayerAssembly;\n" +
+                "import org.apache.zest.bootstrap.ModuleAssembly;\n" +
+                "import org.apache.zest.bootstrap.layered.ModuleAssembler;\n" +
+                "import org.apache.zest.library.restlet.assembly.RestletCrudConnectivityAssembler;\n" +
+                "import org.apache.zest.library.restlet.resource.EntryPoint;\n" +
+                "\n" +
+                "public class RestModule\n" +
+                "    implements ModuleAssembler\n" +
+                "{\n" +
+                "    public static String NAME;\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )\n" +
+                "        throws AssemblyException\n" +
+                "    {\n" +
+                "        module.withDefaultUnitOfWorkFactory();\n" +
+                "\n" +
+                "        module.objects( SimpleVerifier.class, SimpleEnroler.class);\n" +
+                "\n" +
+                "        new RestletCrudConnectivityAssembler().assemble( module );\n" +
+                "        module.values( /* add value types */   );\n" +
+                "        module.services(  /* add services */  );\n" +
+                "        return module;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/bootstrap/connectivity/";
+        String classname = "RestModule";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "bootstrap/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityModuleWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityModuleWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityModuleWriter.java
new file mode 100644
index 0000000..7150df8
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityModuleWriter.java
@@ -0,0 +1,67 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import static java.lang.String.format;
+
+public class SecurityModuleWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".bootstrap.domain;" );
+            pw.println();
+            pw.println(
+                "import org.apache.zest.api.common.Visibility;\n" +
+                "import org.apache.zest.bootstrap.AssemblyException;\n" +
+                "import org.apache.zest.bootstrap.LayerAssembly;\n" +
+                "import org.apache.zest.bootstrap.ModuleAssembly;\n" +
+                "import org.apache.zest.bootstrap.layered.ModuleAssembler;");
+            pw.println(format("import %s.model.orders.Order;", rootPackage));
+            pw.println(format("import %s.model.orders.OrderItem;", rootPackage));
+            pw.println(format("import %s.model.orders.Customer;", rootPackage));
+            pw.println(format("import %s.model.security.SecurityRepository;", rootPackage));
+            pw.println(format("import %s.model.security.HardcodedSecurityRepositoryMixin;", rootPackage));
+            pw.println();
+            pw.println(
+                "public class SecurityModule\n" +
+                "    implements ModuleAssembler\n" +
+                "{\n" +
+                "    public static String NAME;\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )\n" +
+                "        throws AssemblyException\n" +
+                "    {\n" +
+                "        module.services( SecurityRepository.class )\n" +
+                "            .withMixins( HardcodedSecurityRepositoryMixin.class )\n" +
+                "            .visibleIn( Visibility.application )\n" +
+                "            .instantiateOnStartup();\n" +
+                "\n" +
+                "        return module;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/bootstrap/domain/";
+        String classname = "SecurityModule";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "bootstrap/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityRepositoryWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityRepositoryWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityRepositoryWriter.java
new file mode 100644
index 0000000..d0ece25
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SecurityRepositoryWriter.java
@@ -0,0 +1,51 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import static java.lang.String.format;
+
+public class SecurityRepositoryWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".model.security;" );
+            pw.println();
+            pw.println(
+                "import java.util.List;\n" +
+                "import org.apache.zest.api.concern.Concerns;\n" +
+                "import org.apache.zest.api.unitofwork.concern.UnitOfWorkConcern;\n" +
+                "import org.apache.zest.api.unitofwork.concern.UnitOfWorkPropagation;\n" +
+                "\n" +
+                "@Concerns( UnitOfWorkConcern.class )\n" +
+                "public interface SecurityRepository\n" +
+                "{\n" +
+                "    @UnitOfWorkPropagation\n" +
+                "    boolean verifyPassword( String user, String password );\n" +
+                "\n" +
+                "    @UnitOfWorkPropagation\n" +
+                "    List<String> findRoleNamesOfUser( String name );\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/model/security/";
+        String classname = "SecurityRepository";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "model/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SerializationModuleWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SerializationModuleWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SerializationModuleWriter.java
new file mode 100644
index 0000000..322f920
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SerializationModuleWriter.java
@@ -0,0 +1,70 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class SerializationModuleWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".bootstrap.infrastructure;" );
+            pw.println();
+            pw.println(
+                "import java.util.function.Function;\n" +
+                "import org.apache.zest.api.common.Visibility;\n" +
+                "import org.apache.zest.api.structure.Application;\n" +
+                "import org.apache.zest.api.structure.Module;\n" +
+                "import org.apache.zest.bootstrap.AssemblyException;\n" +
+                "import org.apache.zest.bootstrap.LayerAssembly;\n" +
+                "import org.apache.zest.bootstrap.ModuleAssembly;\n" +
+                "import org.apache.zest.bootstrap.layered.ModuleAssembler;\n" +
+                "import org.apache.zest.spi.uuid.UuidIdentityGeneratorService;\n" +
+                "import org.apache.zest.valueserialization.jackson.JacksonValueSerializationAssembler;\n" +
+                "\n" +
+                "public class SerializationModule\n" +
+                "    implements ModuleAssembler\n" +
+                "{\n" +
+                "    public static final String NAME = \"Serialization Module\";\n" +
+                "    private final Function<Application, Module> typeFinder;\n" +
+                "\n" +
+                "    public SerializationModule( Function<Application, Module> typeFinder )\n" +
+                "    {\n" +
+                "        this.typeFinder = typeFinder;\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )\n" +
+                "        throws AssemblyException\n" +
+                "    {\n" +
+                "        new JacksonValueSerializationAssembler()\n" +
+                "            .visibleIn( Visibility.application )\n" +
+                "            .withValuesModuleFinder( typeFinder )\n" +
+                "            .assemble( module );\n" +
+                "        module.services( UuidIdentityGeneratorService.class ).visibleIn( Visibility.layer );\n" +
+                "        return module;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/bootstrap/infrastructure/";
+        String classname = "SerializationModule";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "bootstrap/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SettingsWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SettingsWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SettingsWriter.java
new file mode 100644
index 0000000..080f5e2
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SettingsWriter.java
@@ -0,0 +1,55 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class SettingsWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.println(
+                String.format(
+                "\n" +
+                "include 'app',\n" +
+                "        'bootstrap',\n" +
+                "        'model',\n" +
+                "        'rest'\n" +
+                "\n" +
+                "rootProject.name = \"%s\"\n" +
+                "\n" +
+                "validateProject(rootProject, \"\")\n" +
+                "\n" +
+                "def validateProject(project, parentName)\n" +
+                "{\n" +
+                "  assert project.projectDir.isDirectory()\n" +
+                "  if( new File(\"$project.projectDir/src/main/java\").exists() )\n" +
+                "  {\n" +
+                "    assert project.buildFile.isFile()\n" +
+                "  }\n" +
+                "  if( parentName.length() > 0 )\n" +
+                "  println \"Project: \" + project.name\n" +
+                "  project.children.each { child ->\n" +
+                "    validateProject(child, project.name)\n" +
+                "  }\n" +
+                "}\n" +
+                "\n", projectName
+                ));
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "settings.gradle" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleEnrolerWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleEnrolerWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleEnrolerWriter.java
new file mode 100644
index 0000000..58e9ebd
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleEnrolerWriter.java
@@ -0,0 +1,68 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import static java.lang.String.format;
+
+public class SimpleEnrolerWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".rest.security;" );
+            pw.println();
+            pw.println(
+                "import java.util.ArrayList;\n" +
+                "import java.util.List;\n" +
+                "import org.apache.zest.api.injection.scope.Service;\n" +
+                "import org.apache.zest.api.injection.scope.Uses;\n" +
+                "import org.restlet.Application;\n" +
+                "import org.restlet.data.ClientInfo;\n" +
+                "import org.restlet.security.Enroler;\n" +
+                "import org.restlet.security.Role;" );
+            pw.println( format( "import %s.model.security.SecurityRepository;\n", rootPackage ));
+            pw.println();
+            pw.println(
+                "public class SimpleEnroler\n" +
+                "    implements Enroler\n" +
+                "{\n" +
+                "    @Service\n" +
+                "    private SecurityRepository repository;\n" +
+                "\n" +
+                "    @Uses\n" +
+                "    private Application application;\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public void enrole( ClientInfo clientInfo )\n" +
+                "    {\n" +
+                "        org.restlet.security.User user = clientInfo.getUser();\n" +
+                "        String name = user.getName();\n" +
+                "        List<String> roleList = repository.findRoleNamesOfUser( name );\n" +
+                "        List<Role> restletRoles = new ArrayList<>();\n" +
+                "        roleList.stream().map( roleName -> Role.get( application, roleName ) );\n" +
+                "        clientInfo.setRoles( restletRoles );\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/rest/security/";
+        String classname = "SimpleEnroler";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "rest/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleVerifierWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleVerifierWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleVerifierWriter.java
new file mode 100644
index 0000000..106a67b
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/SimpleVerifierWriter.java
@@ -0,0 +1,62 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import static java.lang.String.format;
+
+public class SimpleVerifierWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".rest.security;" );
+            pw.println();
+            pw.println(
+                "import org.apache.zest.api.injection.scope.Service;\n" +
+                "import org.restlet.security.SecretVerifier;\n" +
+                "import org.restlet.security.Verifier;\n" +
+                format( "import %s.model.security.SecurityRepository;\n", rootPackage ) +
+                "\n" +
+                "public class SimpleVerifier extends SecretVerifier\n" +
+                "    implements Verifier\n" +
+                "{\n" +
+                "    @Service\n" +
+                "    private SecurityRepository repository;\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public int verify( String user, char[] secret )\n" +
+                "    {\n" +
+                "        if( user == null || secret == null )\n" +
+                "        {\n" +
+                "            return RESULT_UNKNOWN;\n" +
+                "        }\n" +
+                "        if( repository.verifyPassword( user, String.valueOf( secret ) ) )\n" +
+                "        {\n" +
+                "            return RESULT_VALID;\n" +
+                "        }\n" +
+                "        return RESULT_INVALID;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/rest/security/";
+        String classname = "SimpleVerifier";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "rest/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/StorageModuleWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/StorageModuleWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/StorageModuleWriter.java
new file mode 100644
index 0000000..3b673f9
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/StorageModuleWriter.java
@@ -0,0 +1,67 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class StorageModuleWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.print( "package " );
+            pw.print( properties.get( "root.package" ) );
+            pw.println( ".bootstrap.infrastructure;" );
+            pw.println();
+            pw.println(
+                "import org.apache.zest.api.common.Visibility;\n" +
+                "import org.apache.zest.bootstrap.AssemblyException;\n" +
+                "import org.apache.zest.bootstrap.LayerAssembly;\n" +
+                "import org.apache.zest.bootstrap.ModuleAssembly;\n" +
+                "import org.apache.zest.bootstrap.layered.ModuleAssembler;\n" +
+                "import org.apache.zest.entitystore.file.assembly.FileEntityStoreAssembler;\n" +
+                "\n" +
+                "public class StorageModule\n" +
+                "    implements ModuleAssembler\n" +
+                "{\n" +
+                "    public static final String NAME = \"Storage Module\";\n" +
+                "    private final ModuleAssembly configModule;\n" +
+                "\n" +
+                "    public StorageModule( ModuleAssembly configModule )\n" +
+                "    {\n" +
+                "        this.configModule = configModule;\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )\n" +
+                "        throws AssemblyException\n" +
+                "    {\n" +
+                "\n" +
+                "        new FileEntityStoreAssembler()\n" +
+                "            .visibleIn( Visibility.application  )\n" +
+                "            .withConfig( configModule, Visibility.application )\n" +
+                "            .identifiedBy( \"filestore\" )\n" +
+                "            .assemble( module );\n" +
+                "        return module;\n" +
+                "    }\n" +
+                "}\n"
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        String packagename = properties.get( "root.package" ).replaceAll( "\\.", "/" ) + "/bootstrap/infrastructure/";
+        String classname = "StorageModule";
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "bootstrap/src/main/java/" + packagename + classname + ".java" ) ) );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/WebXmlWriter.java
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/WebXmlWriter.java b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/WebXmlWriter.java
new file mode 100644
index 0000000..4040526
--- /dev/null
+++ b/tools/shell/src/main/java/org/apache/zest/tools/shell/create/project/restapp/WebXmlWriter.java
@@ -0,0 +1,65 @@
+package org.apache.zest.tools.shell.create.project.restapp;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+public class WebXmlWriter
+{
+
+    public void writeClass( Map<String, String> properties )
+        throws IOException
+    {
+        String rootPackage = properties.get( "root.package" );
+        String projectName = properties.get( "project.name" );
+        try (PrintWriter pw = createPrinter( properties ))
+        {
+            pw.println(
+                String.format(
+                    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                    "\n" +
+                    "<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\"\n" +
+                    "         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+                    "         xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\n" +
+                    "         version=\"3.0\">\n" +
+                    "\n" +
+                    "  <servlet>\n" +
+                    "    <servlet-name>zestrest</servlet-name>\n" +
+                    "    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>\n" +
+                    "    <init-param>\n" +
+                    "      <param-name>org.sensorsink.kooda.mode</param-name>\n" +
+                    "      <param-value>production</param-value>\n" +
+                    "    </init-param>\n" +
+                    "    <init-param>\n" +
+                    "      <!-- Application class name -->\n" +
+                    "      <param-name>org.restlet.application</param-name>\n" +
+                    "      <param-value>%s</param-value>\n" +
+                    "    </init-param>\n" +
+                    "    <init-param>\n" +
+                    "      <!-- Protocols to be bound to-->\n" +
+                    "      <param-name>org.restlet.clients</param-name>\n" +
+                    "      <param-value>HTTP HTTPS</param-value>\n" +
+                    "    </init-param>\n" +
+                    "    <load-on-startup>1</load-on-startup>\n" +
+                    "  </servlet>\n" +
+                    "\n" +
+                    "  <servlet-mapping>\n" +
+                    "    <servlet-name>zestrest</servlet-name>\n" +
+                    "    <url-pattern>/api/*</url-pattern>\n" +
+                    "  </servlet-mapping>\n" +
+                    "\n" +
+                    "</web-app>\n", rootPackage + ".app." + projectName )
+            );
+        }
+    }
+
+    private PrintWriter createPrinter( Map<String, String> properties )
+        throws IOException
+    {
+        File projectDir = new File( properties.get( "project.dir" ) );
+        return new PrintWriter( new FileWriter( new File( projectDir, "app/src/main/webapp/WEB-INF/web.xml" ) ) );
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/resources/templates/default/project.properties
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/resources/templates/default/project.properties b/tools/shell/src/main/resources/templates/default/project.properties
new file mode 100644
index 0000000..a779d4f
--- /dev/null
+++ b/tools/shell/src/main/resources/templates/default/project.properties
@@ -0,0 +1,15 @@
+# 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.
+

http://git-wip-us.apache.org/repos/asf/zest-java/blob/45624ba4/tools/shell/src/main/resources/templates/restapp/project.properties
----------------------------------------------------------------------
diff --git a/tools/shell/src/main/resources/templates/restapp/project.properties b/tools/shell/src/main/resources/templates/restapp/project.properties
new file mode 100644
index 0000000..7ca2d3a
--- /dev/null
+++ b/tools/shell/src/main/resources/templates/restapp/project.properties
@@ -0,0 +1,18 @@
+# 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.
+
+creator.class=org.apache.zest.tools.shell.create.project.RestProjectCreator
+
+template.dir=etc/templates/restproject/files
\ No newline at end of file