///////////////////////////////////////////////////////////////
 * 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.
///////////////////////////////////////////////////////////////

[[tools-shell,Command Line Shell]]
= Zest Shell =
If you have installed the Zest SDK, there is a +bin/zest+ command line script,
which has sub-functions in it. This list of commands will slowly grow
for various purposes of doing software development with Apache Zest.

The current list of commands are;

    * <<tools-shell-create-project>>

[[tools-shell-create-project,Create Project Script]]
== Create Project ==

This command creates a brand new project, in current directory, with a name
provided. There are more than one template of the type of project that one
might want to create. Full list of types to follow below. The command
takes at least 3 additional arguments;

---------------------------
zest create-project type name package
---------------------------

A directory called _name_ will be created in the current directory, and all
the necessary structure for a Zest project using Gradle will be created.

The exact layout of the project depends on the _type_ argument and currently the
following types exists;

    * <<tools-shell-create-project-null>> - Creates the build system and directory structure.
    * <<tools-shell-create-project-singleton>> - Creates a small application around the +SingletonAssembler+
    * <<tools-shell-create-project-default>> - Creates a 4 layer, Configuration, Infrastructure, Domain and Connectivity, command line application.
    * <<tools-shell-create-project-restapp>> - Creates the same 4 layer application as _default_, but also sets it up as a Restful application, ready to deploy on a web application container.

The _package_ defines the root package name to be used, e.g. +org.apache.zest.coolapp+. The +create-project+ program
will create additional packages under this, according to its template.

[[tools-shell-create-project-null,Create Null Project]]
=== Create Null Project Template ===
This templates only creates the build system for a single module application. Neither Java files nor other resources
are created, and the developer has to set everything up from scratch.

[[tools-shell-create-project-singleton,Create Singleton Project]]
=== Create Singleton Project Template ===
This template creates a so called Singleton application. That is an application with a single Layer and a single
Module in that layer. In Zest, all applications must have at least one Layer and one Module.

This is useful for really small applications or demos, not expected to become large in the future. It is
also currently required that the infrastructure is configuration free, otherwise it is not possible to set up.

The template will configure the File EntityStore and RDF Indexing subsystems, hardcoded to the +zest/store+ and
+zest/index+ respectively in the current directory where the application is started. This may not be suitable, in
which case you should look at the <<tools-shell-create-project-default>> template.

[[tools-shell-create-project-default,Create Default Project]]
=== Create Default Project Template ===
This template sets up a 4 layer, Configuration, Infrastructure, Domain, Connectivity, command line application.

The template includes a small sample domain model, +Order+, +OrderItem+, +Customer+, but there is no functionality
added to it.

A +SecurityRepository+ is also created, with a simple hardcoded implementation (+HardCodedSecurityRepositoryMixin+).

[[tools-shell-create-project-restapp,Create Rest Application Project]]
=== Create Rest Application Project Template ===
This template sets up a 4 layer, Configuration, Infrastructure, Domain, Connectivity, restful application. This
application will use the <<library-restlet>> to create a full web application, ready to deploy on a servlet
container, such as Tomcat or Jetty.

The template includes a small sample domain model, +Order+, +OrderItem+, +Customer+, and have the CRUD operations
for these already wired up to the restful +EndPoint+. Full HATEOAS is provided, so clients don't need to construct
URLs, but simply follow links and use forms.

The template also creates a simple SecurityRepository and attaches the mechanisms in the underlying Restlet
implementation to do Authentication and Authorization (see SimpleEnroler and SimpleVerifier). There are two
hardcoded users with two hardcoded roles.

-----------
# name     password     roles
  user       123        user
  admin     secret      admin
-----------

