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