Updates to make out of box experience a little more pleasant. LoginUser action does not seem to work

git-svn-id: https://svn.apache.org/repos/asf/turbine/maven/archetypes@1766437 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/META-INF/maven/archetype-metadata.xml b/trunk/turbine-webapp-4.0/src/main/resources/META-INF/maven/archetype-metadata.xml
index e5a8d71..9e97865 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ b/trunk/turbine-webapp-4.0/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -39,8 +39,19 @@
     <requiredProperty key="turbine_database_jndipath">
       <defaultValue>java:comp/env/jdbc/Turbine</defaultValue>
     </requiredProperty>
+    <requiredProperty key="turbine_database_driver">
+      <defaultValue>com.mysql.jdbc.Driver</defaultValue>
+    </requiredProperty>
+    <requiredProperty key="turbine_database_url">
+      <defaultValue>jdbc:mysql://localhost:3306/</defaultValue>
+    </requiredProperty>
+    <requiredProperty key="turbine_database_user">
+      <defaultValue>db_user</defaultValue>
+    </requiredProperty>
+    <requiredProperty key="turbine_database_password">
+      <defaultValue>db_password</defaultValue>
+    </requiredProperty>
   </requiredProperties>
-
   <fileSets>
     <fileSet filtered="true" packaged="true" encoding="UTF-8">
       <directory>src/main/java</directory>
@@ -49,6 +60,13 @@
         <include>**/*.properties</include>
       </includes>
     </fileSet>
+    <fileSet filtered="false" packaged="false" encoding="UTF-8">
+      <directory>docs</directory>
+      <includes>
+        <include>**/*.txt</include>
+        <include>**/*.sql</include>
+      </includes>
+    </fileSet>
     <fileSet filtered="true" packaged="false" encoding="UTF-8">
       <directory>src/main/torque-schema</directory>
       <includes>
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/README.txt b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/README.txt
new file mode 100644
index 0000000..1f4a91c
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/README.txt
@@ -0,0 +1,86 @@
+#*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+*#
+
+
+Quick Guide to using the new Turbine 4.0-M2 maven archetype 
+for skeleton application generation
+
+You should have a local database installed and configured prior to 
+beginning the application setup below.
+
+ 
+You can invoke the Maven archetype for turbine-webapp-4.0 from 
+the command line as shown below - please update values starting 
+with 'groupId' as appropriate.
+
+mvn archetype:generate \
+    -DarchetypeGroupId=org.apache.turbine \
+    -DarchetypeArtifactId=turbine-webapp-4.0 \
+    -DarchetypeVersion=1.0.1-SNAPSHOT \
+    -DgroupId=com.mycompany.webapp \
+    -DartifactId=helloWorld \
+    -Dversion=1.0 \
+    -Dturbine_app_name=HelloWorld \
+    -Dturbine_database_adapter=mysql \
+    -Dturbine_database_user=db_username \
+    -Dturbine_database_password=db_password \
+    -Dturbine_database_name=helloWorld
+
+
+Note that the database URL will be appended with your database name
+in the final pom.xml, so you do not need to specify that in 
+the configuration.
+
+Next, you need to create the database in MySQL
+
+ mysql -u <user> -p
+ mysql> create database helloWorld;
+ mysql> \q
+
+
+cd helloWorld
+
+mvn generate-sources  ## This will generate the OM layer and SQL 
+					  ## code for creating the corresponding
+					  ## database tables
+					  
+mvn sql:execute       ## This executes the SQL code to create 
+					  ## the application schema defined 
+					  ## in src/main/torque-schema
+
+You should now insert the sample data file provided as Torque 4.0 
+has disabled the datasql task.
+
+mvn jetty:run         ## Now you can launch your new Turbine application
+
+Open a web browser to http://localhost:8081/app
+
+To enable application development in Eclipse, run the following command 
+and then import the project into Eclipse.
+
+mvn eclipse:eclipse
+
+Once imported, update your project to be managed by Maven 
+  -> Right click on the proejct name
+  -> Configure 
+  -> Convert to Maven project
+
+To test the application can be deployed by Eclipse, select the run
+configuration "Run On Server" if you have a container configured with
+your eclipse environment.
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/sample-mysql-data/application-data.sql b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/sample-mysql-data/application-data.sql
new file mode 100644
index 0000000..f605246
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/sample-mysql-data/application-data.sql
@@ -0,0 +1,15 @@
+
+##
+## application-data.sql
+##
+## Torque will not autogenerate these files anymore - please run
+## this SQL code maually to get your application up and running
+##
+
+INSERT INTO AUTHOR (AUTH_ID, FIRST_NAME, LAST_NAME) values (1, 'Donald', 'Knuth');
+INSERT INTO AUTHOR (AUTH_ID, FIRST_NAME, LAST_NAME) values (2, 'Mickey', 'Mouse' );
+INSERT INTO AUTHOR (AUTH_ID, FIRST_NAME, LAST_NAME) values (3, 'Bill', 'Bryson' );
+
+INSERT INTO BOOK ( BOOK_ID, AUTH_ID, TITLE, SUBJECT ) values ( 1, 1, 'The Art of Computer Programming', 'Computer Science');
+INSERT INTO BOOK ( BOOK_ID, AUTH_ID, TITLE, SUBJECT ) values ( 2, 2, 'Disney: Behind the Scenes', 'Fiction' );
+INSERT INTO BOOK ( BOOK_ID, AUTH_ID, TITLE, SUBJECT ) values ( 3, 3, 'A Walk in the Woods', 'Fiction');
\ No newline at end of file
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/sample-mysql-data/turbine-security-data.sql b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/sample-mysql-data/turbine-security-data.sql
new file mode 100644
index 0000000..42deafe
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/docs/sample-mysql-data/turbine-security-data.sql
@@ -0,0 +1,43 @@
+##
+## turbine-security-data.sql
+##
+## Torque will not autogenerate these files anymore - please run
+## this SQL code maually to get your application up and running
+##
+
+INSERT INTO TURBINE_USER (USER_ID,LOGIN_NAME,PASSWORD_VALUE,FIRST_NAME,LAST_NAME)
+    VALUES (1,'admin','password','','Admin');
+
+INSERT INTO TURBINE_USER (USER_ID,LOGIN_NAME,PASSWORD_VALUE,FIRST_NAME,LAST_NAME)
+    VALUES (2,'user','password','','User');
+
+INSERT INTO TURBINE_PERMISSION (PERMISSION_ID,PERMISSION_NAME)
+    VALUES (1,'TurbineAdmin');
+
+INSERT INTO TURBINE_PERMISSION (PERMISSION_ID,PERMISSION_NAME)
+    VALUES (2,'Turbine');
+
+INSERT INTO TURBINE_ROLE (ROLE_ID,ROLE_NAME)
+    VALUES (1,'TurbineAdmin');
+
+INSERT INTO TURBINE_ROLE (ROLE_ID,ROLE_NAME)
+    VALUES (2,'TurbineUser');
+
+INSERT INTO TURBINE_GROUP (GROUP_ID,GROUP_NAME)
+    VALUES (1,'global');
+
+INSERT INTO TURBINE_GROUP (GROUP_ID,GROUP_NAME)
+    VALUES (2,'Turbine');
+
+INSERT INTO TURBINE_ROLE_PERMISSION (ROLE_ID,PERMISSION_ID)
+    VALUES (1,1);
+
+INSERT INTO TURBINE_ROLE_PERMISSION (ROLE_ID,PERMISSION_ID)
+    VALUES (2,2);
+
+INSERT INTO TURBINE_USER_GROUP_ROLE (USER_ID,GROUP_ID,ROLE_ID)
+    VALUES (1,2,1);
+
+INSERT INTO TURBINE_USER_GROUP_ROLE (USER_ID,GROUP_ID,ROLE_ID)
+    VALUES (2,2,2);
+
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/pom.xml b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/pom.xml
index 0bb18d2..e8499b0 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/pom.xml
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/pom.xml
@@ -69,53 +69,53 @@
                     <targetDatabase>mysql</targetDatabase>
                 </configuration>
                 <executions>
-                 <execution>
-                    <id>torque-om</id>
-                    <phase>generate-sources</phase>
-                    <goals>
-                      <goal>generate</goal>
-                    </goals>
-                    <configuration>
-                      <packaging>classpath</packaging>
-                      <configPackage>org.apache.torque.templates.om</configPackage>
-                      <sourceDir>#var("basedir")/src/main/torque-schema</sourceDir>
-                      <loglevel>error</loglevel>
-                      <options>
-                        <torque.database>mysql</torque.database>
-                        <torque.om.package>${package}.om</torque.om.package>
-                        <torque.om.addGetByNameMethods>false</torque.om.addGetByNameMethods>
-                        <torque.om.save.saveException>TorqueException</torque.om.save.saveException>
-                        <torque.om.useIsForBooleanGetters>true</torque.om.useIsForBooleanGetters>
-                        <torque.om.useManagers>false</torque.om.useManagers>
-                        <torque.om.addTimeStamp>true</torque.om.addTimeStamp>
-                        <torque.om.objectIsCaching>true</torque.om.objectIsCaching>
-                        <torque.om.save.addSaveMethods>true</torque.om.save.addSaveMethods>
-                        <torque.om.addGetByNameMethods>true</torque.om.addGetByNameMethods>
-                        <torque.om.complexObjectModel>true</torque.om.complexObjectModel>                        
-                      </options>
-                      <outputDirMap>
-                        <modifiable>#var("project.build.sourceDirectory")</modifiable>
-                      </outputDirMap>
-                    </configuration>
-                  </execution>
-                  <execution>
-                    <id>torque-sql-${turbine_database_adapter}</id>
-                    <phase>package</phase>
-                    <goals>
-                      <goal>generate</goal>
-                    </goals>
-                    <configuration>
-                      <packaging>classpath</packaging>
-                      <configPackage>org.apache.torque.templates.sql</configPackage>
-                      <sourceDir>#var("basedir")/src/main/torque-schema</sourceDir>
-                      <defaultOutputDir>#var("project.build.directory")/generated-sql/torque/${turbine_database_adapter}</defaultOutputDir>
-                      <defaultOutputDirUsage>none</defaultOutputDirUsage>
-                      <loglevel>error</loglevel>
-                      <options>
-                        <torque.database>${turbine_database_adapter}</torque.database>
-                      </options>
-                    </configuration>
-                  </execution>
+					<execution>
+						<id>torque-om</id>
+						<phase>generate-sources</phase>
+						<goals>
+							<goal>generate</goal>
+						</goals>
+						<configuration>
+							<packaging>classpath</packaging>
+							<configPackage>org.apache.torque.templates.om</configPackage>
+							<sourceDir>#var("basedir")/src/main/torque-schema</sourceDir>
+							<loglevel>error</loglevel>
+							<options>
+								<torque.database>${turbine_database_adapter}</torque.database>
+								<torque.om.package>${package}.om</torque.om.package>
+								<torque.om.addGetByNameMethods>false</torque.om.addGetByNameMethods>
+								<torque.om.save.saveException>TorqueException</torque.om.save.saveException>
+								<torque.om.useIsForBooleanGetters>true</torque.om.useIsForBooleanGetters>
+								<torque.om.useManagers>false</torque.om.useManagers>
+								<torque.om.addTimeStamp>true</torque.om.addTimeStamp>
+								<torque.om.objectIsCaching>true</torque.om.objectIsCaching>
+								<torque.om.save.addSaveMethods>true</torque.om.save.addSaveMethods>
+								<torque.om.addGetByNameMethods>true</torque.om.addGetByNameMethods>
+								<torque.om.complexObjectModel>true</torque.om.complexObjectModel>
+							</options>
+							<outputDirMap>
+								<modifiable>#var("project.build.sourceDirectory")</modifiable>
+							</outputDirMap>
+						</configuration>
+					</execution>
+					<execution>
+						<id>torque-sql-${turbine_database_adapter}</id>
+						<phase>generate-sources</phase>
+						<goals>
+							<goal>generate</goal>
+						</goals>
+						<configuration>
+							<packaging>classpath</packaging>
+							<configPackage>org.apache.torque.templates.sql</configPackage>
+							<sourceDir>#var("basedir")/src/main/torque-schema</sourceDir>
+							<defaultOutputDir>#var("project.build.directory")/generated-sql/torque/${turbine_database_adapter}</defaultOutputDir>
+							<defaultOutputDirUsage>none</defaultOutputDirUsage>
+							<loglevel>error</loglevel>
+							<options>
+								<torque.database>${turbine_database_adapter}</torque.database>
+							</options>
+						</configuration>
+					</execution>
                 </executions>
                 <dependencies>
                   <dependency>
@@ -139,6 +139,41 @@
                     <!-- containerConfigXML>WEB-INF/build/context.xml</containerConfigXML -->
                 </configuration>
             </plugin>
+
+
+			<!-- Required to execute torque database build -->
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>sql-maven-plugin</artifactId>
+				<version>1.5</version>
+				<configuration>
+
+					<!-- Please update with your database configuration -->
+					<driver>${turbine_database_driver}</driver>
+					<url>${turbine_database_url}${turbine_database_name}</url>
+					<username>${turbine_database_user}</username>
+					<password>${turbine_database_password}</password>
+					<onError>continue</onError>
+					<autocommit>true</autocommit>
+					<fileset>
+						<basedir>${project.build.directory}/generated-sql/torque/${turbine_database_adapter}</basedir>
+						<!-- basedir>${basedir}/target/generated-sql</basedir -->
+						<includes>
+							<include>*.sql</include>
+						</includes>
+					</fileset>
+				</configuration>
+				
+				<!-- update with your database driver dependency -->
+				<dependencies>
+					<dependency>
+						<artifactId>mysql-connector-java</artifactId>
+						<groupId>mysql</groupId>
+						<version>5.1.40</version>
+					</dependency>
+				</dependencies>
+			</plugin>
+				
             
             <!-- jetty:run checks deployed war http://localhost:8081/app/ 
             
@@ -165,6 +200,13 @@
     </build>
 
     <dependencies>
+    
+		<!-- update with the database driver of your choice -->
+		<dependency>
+			<artifactId>mysql-connector-java</artifactId>
+			<groupId>mysql</groupId>
+			<version>5.1.40</version>
+		</dependency>    
         <dependency>
             <groupId>javax.activation</groupId>
             <artifactId>activation</artifactId>
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/actions/SecureAction.java b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/actions/SecureAction.java
new file mode 100644
index 0000000..51ccf15
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/actions/SecureAction.java
@@ -0,0 +1,84 @@
+package ${package}.modules.actions;
+
+#*
+* 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.
+*#
+
+import org.apache.fulcrum.security.SecurityService;
+import org.apache.fulcrum.security.model.turbine.TurbineAccessControlListImpl;
+import org.apache.turbine.modules.actions.VelocitySecureAction;
+import org.apache.turbine.om.security.User;
+import org.apache.turbine.pipeline.PipelineData;
+import org.apache.velocity.context.Context;
+
+/**
+ * Velocity Secure action.
+ *
+ * Always performs a Security Check that you've defined before executing the
+ * doBuildtemplate().
+ */
+public class SecureAction extends VelocitySecureAction {
+
+	protected SecurityService securityService;
+
+	/**
+	 * This currently only checks to make sure that user is allowed to view the
+	 * storage area. If you create an action that requires more security then
+	 * override this method.
+	 *
+	 * @param data
+	 *            Turbine information.
+	 * @return True if the user is authorized to access the screen.
+	 * @exception Exception,
+	 *                a generic exception.
+	 */
+	@Override
+	protected boolean isAuthorized(PipelineData data) throws Exception {
+
+		boolean isAuthorized = false;
+
+		// Who is our current user?
+		User user = getRunData(data).getUser();
+
+		// Get the Turbine ACL implementation
+		TurbineAccessControlListImpl acl = (TurbineAccessControlListImpl) getRunData(data).getACL();
+
+		if (acl == null || !acl.hasRole("TurbineAdmin")) {
+			getRunData(data).setMessage("You do not have permission to access this action");
+			isAuthorized = false;
+		} else if (acl.hasRole("admin")) {
+			isAuthorized = true;
+		}
+
+		return isAuthorized;
+	}
+
+	/**
+	 * Implement this to add information to the context.
+	 *
+	 * @param data
+	 *            Turbine information.
+	 * @param context
+	 *            Context for web pages.
+	 * @exception Exception,
+	 *                a generic exception.
+	 */
+	public void doPerform(PipelineData data, Context context) throws Exception {
+
+	}
+}
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/Index.java b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/Index.java
index 0a4ac84..4990038 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/Index.java
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/Index.java
@@ -20,7 +20,6 @@
 

 import org.apache.turbine.pipeline.PipelineData;

 import org.apache.velocity.context.Context;

-

 import org.apache.turbine.modules.screens.VelocitySecureScreen;

 

 /**

diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/SecureScreen.java b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/SecureScreen.java
new file mode 100644
index 0000000..f30896d
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/SecureScreen.java
@@ -0,0 +1,76 @@
+package ${package}.modules.screens;
+#*
+* 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.
+*#
+
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.turbine.Turbine;
+import org.apache.turbine.modules.screens.VelocitySecureScreen;
+import org.apache.turbine.om.security.User;
+import org.apache.turbine.pipeline.PipelineData;
+import org.apache.turbine.services.TurbineServices;
+import org.apache.turbine.services.security.SecurityService;
+import org.apache.turbine.services.security.TurbineSecurity;
+import org.apache.fulcrum.security.acl.AccessControlList;
+import org.apache.fulcrum.security.model.turbine.TurbineAccessControlListImpl;
+import org.apache.velocity.context.Context;
+
+/**
+ * This class provides a sample implementation for creating a secured screen
+ */
+public class SecureScreen extends VelocitySecureScreen {
+	// create an instance of the logging facility
+	private static Log log = LogFactory.getLog(SecureScreen.class);
+
+	protected SecurityService securityService;
+
+	@Override
+	protected boolean isAuthorized(PipelineData data) throws Exception {
+		boolean isAuthorized = false;
+
+		// Load the security service
+		securityService = (SecurityService) TurbineServices.getInstance().getService(SecurityService.SERVICE_NAME);
+
+		// Who is our current user?
+		User user = getRunData(data).getUser();
+
+		// Get the Turbine ACL implementation
+		TurbineAccessControlListImpl acl = (TurbineAccessControlListImpl) getRunData(data).getACL();
+
+		if (acl == null) {
+			getRunData(data).setScreenTemplate(Turbine.getConfiguration().getString("template.login"));
+			isAuthorized = false;
+		} else if (acl.hasRole("TurbineAdmin")) {
+			isAuthorized = true;
+		} else {
+			getRunData(data).setScreenTemplate(Turbine.getConfiguration().getString("template.home"));
+			getRunData(data).setMessage("You do not have access to this part of the site.");
+			isAuthorized = false;
+		}
+		return isAuthorized;
+	}
+
+	@Override
+	protected void doBuildTemplate(PipelineData data, Context context) throws Exception {
+		// TODO Auto-generated method stub
+
+	}
+
+}
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/TestSecure.java b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/TestSecure.java
new file mode 100644
index 0000000..d82f6ba
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/java/modules/screens/TestSecure.java
@@ -0,0 +1,48 @@
+package ${package}.modules.screens;
+#*
+* 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.
+*#
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.torque.criteria.Criteria;
+import org.apache.turbine.pipeline.PipelineData;
+import org.apache.velocity.context.Context;
+
+/**
+ * This class provides the data required for displaying content in the
+ * Velocity page. 
+ */
+public class TestSecure extends SecureScreen
+{
+	/**
+	 * This method is called by the Turbine framework when the
+	 * associated Velocity template, Index.vm is requested
+	 * 
+	 * @param data the Turbine request data
+	 * @param context the Velocity context
+	 * @throws Exception a generic Exception
+	 */
+	@Override
+	protected void doBuildTemplate(PipelineData data, Context context)
+			throws Exception
+	{
+		context.put("success", "Congratulations, it worked!");
+	}
+
+}
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/application-schema.xml b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/application-schema.xml
index cba8f3f..8e867d5 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/application-schema.xml
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/application-schema.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>

-#*

+<!--

  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

@@ -16,21 +16,38 @@
  KIND, either express or implied.  See the License for the

  specific language governing permissions and limitations

  under the License.

-*#

-<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database_3_3.dtd">

+-->

 

 <!-- ============================================================================== -->

 <!--                                                                                -->

 <!--  Database Definition for the Application                                       -->

 <!--                                                                                -->

-<!--  @version $Id: application-schema.xml 615328 2008-01-25 20:25:05Z tv $  -->

+<!--  @version $Id: application-schema.xml                                          -->

 <!--                                                                                -->

 <!-- ============================================================================== -->

 

-<database name="${turbine_database_name}">

-    <table name="table1" idMethod="idbroker">

-        <column name="test_col1" type="INTEGER" />

-        <column name="test_col2" type="VARCHAR" size="10" />

-        <!-- Add your database schema here -->

-    </table>

+<database xmlns="http://db.apache.org/torque/4.0/templates/database"

+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+  xsi:schemaLocation="http://db.apache.org/torque/4.0/templates/database

+        http://db.apache.org/torque/4.0/templates/database-strict.xsd"

+  name="${turbine_database_name}"

+  defaultIdMethod="native">

+

+

+	<!--  Simple author/book database example -->

+	<table name="AUTHOR" idMethod="idbroker">

+		<column name="AUTH_ID"     required="true" primaryKey="true" type="INTEGER" />

+		<column name="FIRST_NAME"  required="true" size="64" type="VARCHAR" />

+		<column name="LAST_NAME"   required="true" size="64" type="VARCHAR" />

+	</table>

+

+    <table name="BOOK" idMethod="idbroker">

+		<column name="BOOK_ID"     required="true" primaryKey="true" type="INTEGER" />

+		<column name="AUTH_ID"     required="true" type="INTEGER" />

+		<column name="TITLE"       required="true" size="64" type="VARCHAR" />

+		<column name="SUBJECT"     required="true" size="64" type="VARCHAR" />

+		<foreign-key foreignTable="AUTHOR">

+			<reference local="AUTH_ID" foreign="AUTH_ID"></reference>

+		</foreign-key>		

+	</table>

 </database>

diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/id-table-schema.xml b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/id-table-schema.xml
index 3d845de..5002f21 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/id-table-schema.xml
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/id-table-schema.xml
@@ -17,7 +17,6 @@
  specific language governing permissions and limitations

  under the License.

 -->

-<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database_3_3.dtd">

 

 <!-- ========================================================================= -->

 <!--                                                                           -->

@@ -27,11 +26,13 @@
 <!--                                                                           -->

 <!-- ========================================================================= -->

 

-<database name="@DATABASE_DEFAULT@"

-  defaultIdMethod="idbroker"

-  defaultJavaType="primitive"

-  defaultJavaNamingMethod="underscore"

-  package="@DATABASE_PACKAGE@">

+<database xmlns="http://db.apache.org/torque/4.0/templates/database"

+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+  xsi:schemaLocation="http://db.apache.org/torque/4.0/templates/database

+        http://db.apache.org/torque/4.0/templates/database-strict.xsd"

+  name="${turbine_database_name}"

+  defaultIdMethod="native">

+

   <table name="ID_TABLE" idMethod="idbroker">

     <column name="ID_TABLE_ID" required="true" primaryKey="true" type="INTEGER" javaName="IdTableId"/>

     <column name="TABLE_NAME" required="true" size="255" type="VARCHAR" javaName="TableName"/>

diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/torque-security-schema.xml b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/torque-security-schema.xml
index 35daf91..de2d86f 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/torque-security-schema.xml
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/torque-schema/torque-security-schema.xml
@@ -17,7 +17,7 @@
  specific language governing permissions and limitations

  under the License.

 -->

-<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database_3_3.dtd">

+

 

 <!-- ======================================================================== -->

 <!--                                                                          -->

@@ -27,7 +27,13 @@
 <!--                                                                          -->

 <!-- ======================================================================== -->

 

-<database name="${turbine_database_name}">

+<database xmlns="http://db.apache.org/torque/4.0/templates/database"

+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+  xsi:schemaLocation="http://db.apache.org/torque/4.0/templates/database

+        http://db.apache.org/torque/4.0/templates/database-strict.xsd"

+  name="${turbine_database_name}"

+  defaultIdMethod="native">

+

 

   <table name="TURBINE_PERMISSION" idMethod="idbroker">

     <column name="PERMISSION_ID" required="true" primaryKey="true" type="INTEGER"/>

@@ -80,7 +86,7 @@
     <column name="LAST_NAME" required="true" size="64" type="VARCHAR"/>

     <column name="EMAIL" size="64" type="VARCHAR"/>

     <column name="CONFIRM_VALUE" size="16" type="VARCHAR" javaName="Confirmed"/>

-    <column name="MODIFIEDDATE" type="TIMESTAMP" javaName="ModifiedDate"/>

+    <column name="MODIFIED_DATE" type="TIMESTAMP" javaName="ModifiedDate"/>

     <column name="CREATED" type="TIMESTAMP" javaName="CreateDate"/>

     <column name="LAST_LOGIN" type="TIMESTAMP"/>

     <column name="OBJECTDATA" type="VARBINARY"/>

diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/Torque.properties b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/Torque.properties
index 4a342b0..132233a 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/Torque.properties
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/Torque.properties
@@ -35,14 +35,40 @@
 # configure these properly.
 # -------------------------------------------------------------------
 
-torque.database.default=${turbine_database_name}
-torque.database.turbine.adapter=${turbine_database_adapter}
-
-# Using JNDI
+#
+# For JNDI configuration please see: https://db.apache.org/torque/torque-4.0/documentation/orm-reference/initialisation-configuration.html
+# 
+#
 torque.dsfactory.${turbine_database_name}.factory=org.apache.torque.dsfactory.JndiDataSourceFactory
 torque.dsfactory.${turbine_database_name}.jndi.path=${turbine_database_jndipath}
 torque.dsfactory.${turbine_database_name}.jndi.ttl=300000
 
+# -------------------------------------------------------------------
+#
+# Shared Pool Data Source Factory
+#
+# -------------------------------------------------------------------
+#torque.database.default=${turbine_database_name}
+#torque.database.${turbine_database_name}.adapter=${turbine_database_adapter}
+#torque.database.${turbine_database_name}.user=${turbine_database_user}
+#torque.database.${turbine_database_name}.password=${turbine_database_password}
+#
+#torque.defaults.pool.maxActive =       	30
+#torque.defaults.pool.testOnBorrow =    	true
+#torque.defaults.pool.validationQuery = 	SELECT 1
+#
+#torque.defaults.connection.driver =    	${turbine_database_driver}
+#torque.defaults.connection.url =       	${turbine_database_url}${turbine_database_name}
+#torque.defaults.connection.user =      	${turbine_database_user}
+#torque.defaults.connection.password =  	${turbine_database_password}
+#
+#torque.dsfactory.${turbine_database_name}.connection.driver =    	${turbine_database_driver}
+#torque.dsfactory.${turbine_database_name}.connection.url =       	${turbine_database_url}${turbine_database_name}
+#torque.dsfactory.${turbine_database_name}.connection.user =      	${turbine_database_user}
+#torque.dsfactory.${turbine_database_name}.connection.password =  	${turbine_database_password}
+#torque.dsfactory.${turbine_database_name}.factory=org.apache.torque.dsfactory.SharedPoolDataSourceFactory
+# -------------------------------------------------------------------
+
 # Determines if the quantity column of the IDBroker's id_table should
 # be increased automatically if requests for ids reaches a high
 # volume.
@@ -51,5 +77,47 @@
 
 # Determines whether the managers cache instances of the business objects.
 # And also whether the MethodResultCache will really cache results.
-
 torque.manager.useCache = true
+
+# Determines if IDBroker should prefetch IDs or not.  If set to false
+# this property has the effect of shutting off the housekeeping thread
+# that attempts to prefetch the id's.  It also sets the # of id's grabbed
+# per request to 1 regardless of the settings in the database.
+# Default: true
+torque.idbroker.prefetch = true
+
+# Controls the starting id of table entries when creating SQL for 
+# the id-table. If you have two projects that use the same id-table 
+# in the same database with different tables, make sure that they have 
+# different initialID settings and the ranges (initialID is incremented 
+# for every new table) don't overlap.
+torque.idbroker.initialId = 101 
+
+# The start value of the ID broker for supplying IDs to Torque. This value 
+# is incremented every time Torque requests ID keys from the broker. If you 
+# pre-load your table straight from SQL, make sure that you don't accidentially 
+# overlap with this setting, because Torque doesn't keep record of what IDs are 
+# already taken in the database. If you overlap, inserting new objects will fail 
+# because the ID assigned by Torque is already taken.
+torque.idBroker.initialIdValue = 100
+
+# For performance reasons, the ID Broker does not request a single ID at a time
+# but fetches a whole range and increments the current next ID Value in the ID
+# Table by this step. If you have to do lots of inserts straight in a row, increment
+# this value to get slightly better performance.
+torque.idbroker.initialIdStep = 500
+
+# IDBroker can grab its own connection from the pool to use when retrieving
+# more id's to minimize the amount of time ID_TABLE will be locked.
+# Some usage of IDBroker or assumptions made by connection pools or jdbc
+# drivers may disallow this optimization in which case the property
+# should be set to false.
+torque.idbroker.usenewconnection = true
+
+# Uncomment if using shared data source factory
+#torque.database.default=${turbine_database_name}
+
+
+
+
+
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/TurbineResources.properties b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/TurbineResources.properties
index bb8d0d2..c9c95b4 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/TurbineResources.properties
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/TurbineResources.properties
@@ -566,7 +566,7 @@
 
 #
 # Class Path Loader, Turbine jar
-services.VelocityService.velocimacro.library = macros/TurbineMacros.vm
+services.VelocityService.velocimacro.library = macros/TurbineMacros.vm,macros/applicationMacros.vm
 
 # Set the following line to true to cause velocity to automatically reload
 # library macro files if they change.  This is useful for debugging.
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/componentConfiguration.xml b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/componentConfiguration.xml
index 20aa128..1fa509d 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/componentConfiguration.xml
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/componentConfiguration.xml
@@ -37,6 +37,7 @@
         <bundle>${package}.L10N</bundle>
       </bundles>
     </localization>
+    <!-- Disable if you experience startup problems with Java8 -->
     <intake>
       <serialDataPath>WEB-INF/appData.ser</serialDataPath>
       <xmlPaths>
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/log4j.properties b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/log4j.properties
index 9879a83..e9fa0a5 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/log4j.properties
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/log4j.properties
@@ -79,7 +79,7 @@
 log4j.appender.app = org.apache.log4j.RollingFileAppender

 log4j.appender.app.MaxFileSize=5MB

 log4j.appender.app.MaxBackupIndex=5

-log4j.appender.app.file = #var("catalina.base")/logs/application.log

+log4j.appender.app.file = ${applicationRoot}/logs/application.log

 log4j.appender.app.layout = org.apache.log4j.PatternLayout

 log4j.appender.app.layout.conversionPattern = %d [%t] %-5p %c - %m%n

 log4j.appender.app.append = false

@@ -90,7 +90,7 @@
 log4j.appender.turbine = org.apache.log4j.RollingFileAppender

 log4j.appender.turbine.MaxFileSize=5MB

 log4j.appender.turbine.MaxBackupIndex=5

-log4j.appender.turbine.file = #var("catalina.base")/logs/turbine.log

+log4j.appender.turbine.file = ${applicationRoot}/logs/turbine.log

 log4j.appender.turbine.layout = org.apache.log4j.PatternLayout

 log4j.appender.turbine.layout.conversionPattern = %d [%t] %-5p %c - %m%n

 log4j.appender.turbine.append = false

@@ -99,7 +99,7 @@
 # sql.log

 #

 log4j.appender.sql = org.apache.log4j.RollingFileAppender

-log4j.appender.sql.file = #var("catalina.base")/logs/sql.log

+log4j.appender.sql.file = ${applicationRoot}/logs/sql.log

 log4j.appender.sql.MaxFileSize=5MB

 log4j.appender.sql.MaxBackupIndex=5

 log4j.appender.sql.layout = org.apache.log4j.PatternLayout

@@ -119,7 +119,7 @@
 log4j.appender.torque = org.apache.log4j.RollingFileAppender

 log4j.appender.torque.MaxFileSize=5MB

 log4j.appender.torque.MaxBackupIndex=5

-log4j.appender.torque.file = #var("catalina.base")/logs/torque.log

+log4j.appender.torque.file = ${applicationRoot}/logs/torque.log

 log4j.appender.torque.layout = org.apache.log4j.PatternLayout

 log4j.appender.torque.layout.conversionPattern = %d [%t] %-5p %c - %m%n

 log4j.appender.torque.append = false

@@ -131,7 +131,7 @@
 log4j.appender.velocity = org.apache.log4j.RollingFileAppender

 log4j.appender.velocity.MaxFileSize=5MB

 log4j.appender.velocity.MaxBackupIndex=5

-log4j.appender.velocity.file = #var("catalina.base")/logs/velocity.log

+log4j.appender.velocity.file = ${applicationRoot}/logs/velocity.log

 log4j.appender.velocity.layout = org.apache.log4j.PatternLayout

 log4j.appender.velocity.layout.conversionPattern = %d [%t] %-5p %c - %m%n

 log4j.appender.velocity.append = false

diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/roleConfiguration.xml b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/roleConfiguration.xml
index e59a24d..ca3faeb 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/roleConfiguration.xml
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/WEB-INF/conf/roleConfiguration.xml
@@ -44,6 +44,7 @@
         shorthand="localization"
         default-class="org.apache.fulcrum.localization.DefaultLocalizationService"/>
 
+	<!-- Disable if you experience startup problems with Java8 -->
     <role
         name="org.apache.fulcrum.intake.IntakeService"
         shorthand="intake"
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/layouts/Default.vm b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/layouts/Default.vm
index 95ab364..c9f94d0 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/layouts/Default.vm
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/layouts/Default.vm
@@ -14,16 +14,44 @@
 ## KIND, either express or implied.  See the License for the

 ## specific language governing permissions and limitations

 ## under the License.

+

+$page.addStyleSheet("http://www.w3schools.com/lib/w3.css")

+$page.addStyleSheet("http://www.w3schools.com/lib/w3-theme-blue-grey.css")

+$page.setTitle("Sample Apache Turbine Application")

+

+

 <html>

+

 #TurbineHtmlHead()

-<body #TurbineHtmlBodyAttributes() >

-  <table bgcolor="$ui.bgcolor" width="100%">

-    <tr>

-      <td>&nbsp;</td>

-       <td align="right"><img src="$ui.image('turbine-project.png')"/></td>

-    </tr>

-  </table>

-$screen_placeholder

-  <img src="$ui.image('powered-by-logo.gif')"/>

+

+<body #TurbineHtmlBodyAttributes() class="w3-theme-l4">

+

+	<div class="w3-wrapper">

+

+		<!-- Header -->

+		<header class="w3-container w3-center w3-padding-32 w3-theme">

+        	<img class="w3-right" src="$ui.image('turbine-project.png')" /> 

+	        #if ( $data.getUser().hasLoggedIn() ) 

+		        #set ( $u = $data.getUser() )

+		        <div class="w3-right">

+					<h5>Hello $!u.FirstName</h5>

+		        </div>

+			#end

+		</header>

+

+        <!-- Default Menu -->

+        $navigation.setTemplate("/Menu.vm")

+

+        <!-- Content -->

+        <div class="w3-left w3-padding" id="content">

+                $screen_placeholder

+        </div>

+

+        <!-- Footer -->

+        <footer class="w3-bottom">

+			<p>Powered by <img src="$ui.image('powered-by-logo.gif')"/></p>

+        </footer>

+	</div>

+

 </body>

 </html>

diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/macros/applicationMacros.vm b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/macros/applicationMacros.vm
new file mode 100644
index 0000000..9acccea
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/macros/applicationMacros.vm
@@ -0,0 +1,151 @@
+## 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.
+
+##
+## $Id: TurbineMacros.vm 222027 2016-10-20 16:11:37Z painter $
+##
+## Put your Application macros in this file.
+##
+
+#* ------------------------------------------------------------------
+#    Global Macros
+*# ------------------------------------------------------------------
+
+#* ------------------------------------------------------------------
+#    Drop down select option for yes/no questions
+*# ------------------------------------------------------------------
+#macro (selectYesNo $label $selection)
+	<select name="$label">
+		#if ( $selection == "true" )
+			<option value="1" selected>Yes</option>
+			<option value="0">No</option>
+		#else
+			<option value="1">Yes</option>
+			<option value="0" selected>No</option>
+		#end
+	</select>
+#end
+
+
+#* ------------------------------------------------------------------
+#    Standard action form controls - Using w3.css styling
+*# ------------------------------------------------------------------
+
+#macro (insert)
+    <input type="submit" name="eventSubmit_doInsert" value="Insert"/>
+#end
+
+#macro (save)
+    <input type="submit" name="eventSubmit_doUpdate" value="Update"/>
+#end
+
+#macro (remove)
+    <input type="submit" name="eventSubmit_doDelete" value="Remove"/>
+#end
+
+
+#macro (warning $msg)
+<div class="w3-panel w3-orange w3-card-8">
+	$msg
+</div>
+#end
+
+#macro (error $msg)
+<div class="w3-panel w3-red w3-card-8">
+	$msg
+</div>
+#end
+
+#macro(info $msg)
+<div class="w3-panel w3-blue w3-card-8">
+	$msg
+</div>
+#end
+
+
+#* ------------------------------------------------------------------
+#
+# Macros that are used for displaying input forms. Using w3.css styling
+#
+*# ------------------------------------------------------------------
+
+#macro (formLabel $label)
+	<label>$!label</label>
+#end
+
+#macro (fileUpload $label $name)
+	<label>$!label</label>
+	<input class="w3-input" type="file" name="$!name">
+#end
+
+#macro (formCheckBox $label $name $checked)
+   #formLabel( $label )
+   #checkBox( $name $checked )
+#end
+
+#macro (checkBox $name $checked)
+	<input id="$!name" class="w3-check" type="checkbox" checked="$!checked">
+#end
+
+#macro (formLabelRequired $label)
+	<label class="w3-label w3-validate">$!label</label>
+#end
+
+#macro (formTextField $name $value)
+	<input class="w3-input" type="text" name="$!name" value="$!value">
+#end
+
+#macro (smallFormTextField $name $value)
+	<input class="w3-input" type="text" name="$!name" value="$!value">
+#end
+
+#macro (textField $name $value)
+	<input class="w3-input" type="text" name="$!name" value="$!value">
+#end
+
+#macro (textareaField $label $name $value)
+	<p>
+		<label class="w3-label">$label</label>
+		<textarea class="w3-input" style="width:90%" rows="6" name="$name" required>$!value</textarea>
+	</p>
+	
+#end
+
+#macro (formPasswordCell $label $name $value)
+	<p>
+	#formLabel( $label )
+	<input class="w3-input" type="password" name="$!name" value="$!value">
+	</p>
+#end
+
+#macro (formCellRequired $label $name $value)
+	<p>
+	  #formLabelRequired($label)
+  	  #formTextField($name $value)
+  	</p>
+#end
+
+#macro (formCell $label $name $value)
+  #formLabel($label)
+  #formTextField($name $value)
+#end
+
+#macro (smallFormCell $label $name $value)
+  #formLabel($label)
+  #smallFormTextField($name $value)
+#end
+
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/navigations/Menu.vm b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/navigations/Menu.vm
new file mode 100644
index 0000000..1548d0b
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/navigations/Menu.vm
@@ -0,0 +1,44 @@
+## 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.
+
+
+#if ( $data.getUser().hasLoggedIn() )
+<nav class="w3-navbar w3-theme">
+          <li><a  href="$link.setPage("Index.vm")">Home</a></li>
+          <li class="w3-dropdown-hover">
+            <a href="#">Administration <i class="fa fa-caret-down"></i></a>
+            <div class="w3-dropdown-content w3-white w3-card-4">
+              ## every user can change their password
+          <a href="$link.setPage("user,Password.vm")">Update Password <i class="fa fa-unlock"></i></a>
+          
+          #if ( $data.getACL().hasRole("admin") )
+              <a href="$link.setPage("user,FluxUserList.vm")">User List <div class="w3-right"><i class="fa fa-users"></i></div></a>
+              <a href="$link.setPage("role,FluxRoleList.vm")">User Roles <div class="w3-right"><i class="fa fa-user-plus"></i></div></a>
+              <a href="$link.setPage("user,FluxUserForm.vm")?mode=insert">Add User <div class="w3-right"><i class="fa fa-user"></i></div></a>
+              #end
+            </div>
+          </li>
+
+          <li class="w3-right"><a href="$link.setAction("LogoutUser")">Logout</a></li>
+</nav>
+#else
+<nav class="w3-navbar w3-theme">
+          <li><a  href="$link.setPage("Index.vm")">Home</a></li>
+          <li class="w3-right"><a href="$link.setPage("Login.vm")">Login</a></li>
+</nav>
+
+#end
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Index.vm b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Index.vm
index fdc5dcd..f1eb477 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Index.vm
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Index.vm
@@ -15,27 +15,25 @@
 ## specific language governing permissions and limitations

 ## under the License.

 

-<div align="center"><h1>$success</h1></div>

 

-You're now successfully running a <a

-href="http://turbine.apache.org/">Turbine</a> based

-application, deployed to <font color="red">$data.ServerData.ContextPath</a></font> on

-your web container.<p/>

 

-You can (and should!) change or remove this page at any time. It is

-intended to give you immediate feedback if you just deployed an newly

-setup Turbine application.</p>

 

-Login here

+#if ( $data.getMessage() )

+        #info( $data.getMessage() )

+#end

 

-<form method="post" enctype="application/x-www-form-urlencoded" name="loginForm" id="loginForm">

-  <fieldset>

-    <legend>Login</legend>

-    <input name="action" type="hidden" value="LoginUser">

-   <label for="username">Username</label>

-    <input type="text" id="username" name="username" value="" tabindex="1" autocomplete="off" autofocus="">

-    <label for="password">Password</label>

-    <input type="password" id="password" name="password" value="" tabindex="2" autocomplete="off"> 

-    <input type="submit" id="submitLogin" value="Login" tabindex="3">

- </fieldset>

-</form>

+     <div align="center"><h1>$success</h1></div>

+

+     <p>

+             You're now successfully running a <a href="http://turbine.apache.org/">Turbine</a> based

+             application, deployed to <font color="red">$data.ServerData.ContextPath</a></font> on

+             your web container.

+     </p>

+

+     <p>

+             You can (and should!) change or remove this page at any time. It is

+             intended to give you immediate feedback if you just deployed an newly

+             setup Turbine application.

+     </p>

+

+     <a href="$link.setPage("TestSecure.vm")">Test a secure access page</a>

diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Login.vm b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Login.vm
index a5fc2b7..a2fa451 100644
--- a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Login.vm
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/Login.vm
@@ -15,14 +15,55 @@
 ## specific language governing permissions and limitations
 ## under the License.
 
-<div align="center"><h1>Welcome </h1></div>
-User created : $data.user.createDate
-User lastLogin : $data.user.lastLogin
-<form method="post" name="logoutForm" id="logoutForm">
-  <fieldset>
-    <legend>Logout</legend>
-    <input name="action" type="hidden" value="LogoutUser">
-    <input type="submit" id="submitLogout" value="Logout" tabindex="1">
- </fieldset>
-</form>
+##
+## If you want to use intake to process the data, uncomment below
+##
 
+## #set ( $loginGroup = $intake.Login.Default )
+##  
+## #if (!$loginGroup.Username.isValid() ) 
+##      #info( "$loginGroup.Username.Message" )
+## #end
+## 
+## #if ( !$loginGroup.Password.isValid() ) 
+##      #info("$loginGroup.Password.Message" )
+## #end
+
+<p/>
+
+
+    <div class="w3-display-middle w3-card-8 w3-center w3-light-grey" style="max-width: 500px">
+  
+		<form class="w3-container w3-light-grey" name="login" method="post" action="$link.setAction("LoginUser").setPage("TestSecure.vm")">
+        	<div class="w3-section">
+        
+                <p>
+                	<!--  input class="w3-input w3-border" style="margin: auto; width: 200px;" placeholder="Username" type="text" name="$loginGroup.Username.Key" value="$!loginGroup.Username" -->
+                	<input class="w3-input w3-border" style="margin: auto; width: 200px;" placeholder="Username" type="text" name="username" value="" tabindex="1"  autocomplete="off" autofocus="">
+                </p>
+
+                <p>
+                	<input class="w3-input w3-border" style="margin: auto; width: 200px;" placeholder="Password" type="password" name="password" value="" tabindex="2" autocomplete="off">
+                </p>
+
+                <button type="submit" name="submit" id="submit" value="eventSubmit_doPerform" class="w3-ripple">Sign in</button>
+                
+                <p/>
+
+        
+			</div>
+		</form>
+
+		<div class="w3-container w3-border-top w3-padding-16 w3-light-grey">
+	        <span class="w3-right w3-padding w3-hide-small">Forgot <a href="#">password?</a></span>
+		</div>
+
+		## Display System messages here if there are any
+        #if($data.getMessage())
+         #info( $data.getMessage() ) <br/>
+        #end 
+
+    </div>
+              
+
+## $intake.declareGroups()
diff --git a/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/TestSecure.vm b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/TestSecure.vm
new file mode 100644
index 0000000..e15f318
--- /dev/null
+++ b/trunk/turbine-webapp-4.0/src/main/resources/archetype-resources/src/main/webapp/templates/screens/TestSecure.vm
@@ -0,0 +1,5 @@
+#if ( $data.getMessage() )
+	#info( $data.getMessage() )
+#end
+
+<h1> Secured Access Page </h1>