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