You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by mm...@apache.org on 2020/03/16 15:56:11 UTC

[syncope] 25/36: [SYNCOPE-1545] fit/wa-reference + inclusion in standalone

This is an automated email from the ASF dual-hosted git repository.

mmoayyed pushed a commit to branch SYNCOPE-1545
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit dd5bed66764f72f1437e8f710fdf269435958300
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Mar 3 17:28:49 2020 +0100

    [SYNCOPE-1545] fit/wa-reference + inclusion in standalone
---
 fit/pom.xml                                        |   1 +
 fit/wa-reference/pom.xml                           | 181 +++++++++++++++++++++
 .../main/resources/application-embedded.properties |  18 ++
 fit/wa-reference/src/main/resources/log4j2.xml     | 134 +++++++++++++++
 fit/wa-reference/src/main/webapp/WEB-INF/web.xml   |  29 ++++
 standalone/pom.xml                                 |  75 ++++++---
 wa/src/main/resources/templates/layout.html        |  61 +++++++
 7 files changed, 472 insertions(+), 27 deletions(-)

diff --git a/fit/pom.xml b/fit/pom.xml
index 5df60e1..30d9912 100644
--- a/fit/pom.xml
+++ b/fit/pom.xml
@@ -81,6 +81,7 @@ under the License.
     <module>core-reference</module>
     <module>console-reference</module>
     <module>enduser-reference</module>
+    <module>wa-reference</module>
   </modules>
 
 </project>
diff --git a/fit/wa-reference/pom.xml b/fit/wa-reference/pom.xml
new file mode 100644
index 0000000..7c08b20
--- /dev/null
+++ b/fit/wa-reference/pom.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.syncope</groupId>
+    <artifactId>syncope-fit</artifactId>
+    <version>3.0.0-SNAPSHOT</version>
+  </parent>
+
+  <name>Apache Syncope FIT WA Reference</name>
+  <description>Apache Syncope FIT WA Reference</description>
+  <groupId>org.apache.syncope.fit</groupId>
+  <artifactId>syncope-fit-wa-reference</artifactId>
+  <packaging>war</packaging>
+  
+  <properties>
+    <guava.version>28.2-jre</guava.version>
+    <opensaml.version>3.4.5</opensaml.version>
+    <bootstrap.version>4.4.1</bootstrap.version>
+    <slf4j.version>2.0.0-alpha1</slf4j.version>
+
+    <ianal.skip>true</ianal.skip>
+
+    <rootpom.basedir>${basedir}/../..</rootpom.basedir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.syncope</groupId>
+      <artifactId>syncope-wa</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.cargo</groupId>
+        <artifactId>cargo-maven2-plugin</artifactId>
+        <inherited>true</inherited>
+        <configuration>
+          <container>
+            <containerId>tomcat9x</containerId>
+            <zipUrlInstaller>
+              <url>https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/${tomcat.version}/tomcat-${tomcat.version}.zip</url>
+              <downloadDir>${settings.localRepository}/org/codehaus/cargo/cargo-container-archives</downloadDir>
+              <extractDir>${project.build.directory}/cargo/extract</extractDir>
+            </zipUrlInstaller>
+            <timeout>300000</timeout>
+            <log>${cargo.log}</log>
+            <output>${cargo.output}</output>
+          </container>
+          <configuration>
+            <properties>
+              <cargo.jvmargs>
+                -Dspring.profiles.active=embedded
+                -XX:+CMSClassUnloadingEnabled -Xmx1024m -Xms512m</cargo.jvmargs>
+            </properties>
+          </configuration>
+          <deployables>
+            <deployable>
+              <location>${project.build.directory}/${project.build.finalName}</location>
+              <properties>
+                <context>syncope-wa</context>
+              </properties>
+            </deployable>
+          </deployables>
+        </configuration>
+      </plugin>
+      
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+        <configuration>
+          <resourceIncludes>src/main/resources/**/*.properties</resourceIncludes>
+        </configuration>
+      </plugin>
+    </plugins>
+    
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>true</filtering>
+      </resource>
+    </resources>
+    <testResources>
+      <testResource>
+        <directory>src/test/resources</directory>
+        <filtering>true</filtering>
+      </testResource>
+    </testResources>
+  </build>
+  
+  <profiles>
+    <profile>
+      <id>properties4cas</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+    </profile>
+
+    <profile>
+      <id>skipTests</id>
+    </profile>
+
+    <profile>
+      <id>debug</id>
+
+      <properties>
+        <skipTests>true</skipTests>
+      </properties>
+
+      <build>
+        <defaultGoal>clean verify cargo:run</defaultGoal>
+        
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.cargo</groupId>
+            <artifactId>cargo-maven2-plugin</artifactId>
+            <inherited>true</inherited>
+            <configuration>
+              <configuration>
+                <properties>
+                  <cargo.jvmargs>
+                    -Dspring.profiles.active=embedded
+                    -Xdebug -Djaxb.debug=true -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
+                    -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -Xmx1024m -Xms512m</cargo.jvmargs>
+                </properties>
+              </configuration>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+
+    <profile>
+      <id>apache-release</id>
+
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-deploy-plugin</artifactId>
+            <configuration>
+              <skip>true</skip>
+            </configuration>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-source-plugin</artifactId>
+            <inherited>false</inherited>
+            <configuration>
+              <skipSource>true</skipSource>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+
+  </profiles>
+</project>
diff --git a/fit/wa-reference/src/main/resources/application-embedded.properties b/fit/wa-reference/src/main/resources/application-embedded.properties
new file mode 100644
index 0000000..464c8c8
--- /dev/null
+++ b/fit/wa-reference/src/main/resources/application-embedded.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+spring.main.banner-mode=console
+service.discovery.address=http://localhost:9080/syncope-wa/
diff --git a/fit/wa-reference/src/main/resources/log4j2.xml b/fit/wa-reference/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..08196df
--- /dev/null
+++ b/fit/wa-reference/src/main/resources/log4j2.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+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.
+-->
+<!-- Specify the refresh internal in seconds. -->
+<Configuration monitorInterval="5" packages="org.apereo.cas.logging">
+  <Properties>
+    <Property name="baseDir">${log.directory}</Property>
+    <Property name="cas.log.level">info</Property>
+    <Property name="spring.webflow.log.level">warn</Property>
+    <Property name="spring.security.log.level">info</Property>
+    <Property name="spring.cloud.log.level">warn</Property>
+    <Property name="spring.web.log.level">warn</Property>
+    <Property name="spring.boot.log.level">warn</Property>
+    <Property name="ldap.log.level">warn</Property>
+    <Property name="pac4j.log.level">warn</Property>
+    <Property name="opensaml.log.level">warn</Property>
+    <Property name="hazelcast.log.level">warn</Property>
+  </Properties>
+  <Appenders>
+    <RollingFile name="file" fileName="${baseDir}/wa.log" append="true"
+                 filePattern="${baseDir}/wa-%d{yyyy-MM-dd-HH}-%i.log">
+      <PatternLayout pattern="%highlight{%d %p [%c] - &lt;%m&gt;%n}" />
+      <Policies>
+        <OnStartupTriggeringPolicy />
+        <SizeBasedTriggeringPolicy size="10 MB"/>
+        <TimeBasedTriggeringPolicy />
+      </Policies>
+      <DefaultRolloverStrategy max="5" compressionLevel="9">
+        <Delete basePath="${baseDir}" maxDepth="2">
+          <IfFileName glob="*/*.log.gz" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingFile>
+    <RollingFile name="auditlogfile" fileName="${baseDir}/wa-audit.log" append="true"
+                 filePattern="${baseDir}/wa-audit-%d{yyyy-MM-dd-HH}-%i.log">
+      <PatternLayout pattern="%highlight{%d %p [%c] - %m%n}" />
+      <Policies>
+        <OnStartupTriggeringPolicy />
+        <SizeBasedTriggeringPolicy size="10 MB"/>
+        <TimeBasedTriggeringPolicy />
+      </Policies>
+      <DefaultRolloverStrategy max="5" compressionLevel="9">
+        <Delete basePath="${baseDir}" maxDepth="2">
+          <IfFileName glob="*/*.log.gz" />
+          <IfLastModified age="7d" />
+        </Delete>
+      </DefaultRolloverStrategy>
+    </RollingFile>
+
+    <CasAppender name="casAudit">
+      <AppenderRef ref="auditlogfile" />
+    </CasAppender>
+    <CasAppender name="casFile">
+      <AppenderRef ref="file" />
+    </CasAppender>
+  </Appenders>
+  <Loggers>
+    <AsyncLogger name="org.apereo.cas" level="${sys:cas.log.level}" includeLocation="true" />
+    <AsyncLogger name="org.apereo.cas.services" level="${sys:cas.log.level}" includeLocation="true" />
+    <AsyncLogger name="org.apereo.spring" level="${sys:cas.log.level}" includeLocation="true" />
+    <AsyncLogger name="org.apereo.services.persondir" level="${sys:cas.log.level}" includeLocation="true" />
+    <AsyncLogger name="org.apereo.cas.web.flow" level="${sys:cas.log.level}" includeLocation="true" />
+    <AsyncLogger name="org.apereo.cas.web.CasWebApplication" level="${sys:cas.log.level}" includeLocation="true"/>
+
+    <AsyncLogger name="org.apereo.inspektr.audit.support" additivity="true" level="info" includeLocation="true">
+      <AppenderRef ref="casAudit"/>
+    </AsyncLogger>
+
+    <AsyncLogger name="org.springframework.boot" level="${sys:spring.boot.log.level}" />
+    <AsyncLogger name="org.springframework.boot.context.embedded" level="info" />
+    <AsyncLogger name="org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration" level="${sys:spring.security.log.level}" />
+    <AsyncLogger name="org.springframework.boot.autoconfigure.security" level="${sys:spring.security.log.level}" />
+    <AsyncLogger name="org.springframework.boot.devtools" level="debug" />
+        
+    <AsyncLogger name="org.springframework" level="warn" includeLocation="true" />
+    <AsyncLogger name="org.springframework.webflow" level="${sys:spring.webflow.log.level}" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.aop" level="warn" includeLocation="true" />
+    <AsyncLogger name="org.springframework.session" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.scheduling" level="info" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.cloud.vault" level="warn" includeLocation="true" />
+    <AsyncLogger name="org.springframework.web.client" level="warn" includeLocation="true" />
+    <AsyncLogger name="org.springframework.security" level="${sys:spring.security.log.level}" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.cloud" level="${sys:spring.cloud.log.level}" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.amqp" level="error" />
+    <AsyncLogger name="org.springframework.integration" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.messaging" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.web" level="${sys:spring.web.log.level}" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.orm.jpa" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.scheduling" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.context.annotation" level="off" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.web.socket" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter" level="trace" includeLocation="true"/>
+
+    <AsyncLogger name="com.couchbase" level="warn" includeLocation="true" />
+    <AsyncLogger name="org.apache" level="error" includeLocation="true"/>
+    <AsyncLogger name="com.netflix" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.quartz" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.thymeleaf" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.pac4j" level="${sys:pac4j.log.level}" includeLocation="true"/>
+
+    <AsyncLogger name="org.opensaml" level="${sys:opensaml.log.level}" includeLocation="true"/>
+    <AsyncLogger name="PROTOCOL_MESSAGE" level="${sys:opensaml.log.level}" includeLocation="true" />
+
+    <AsyncLogger name="net.sf.ehcache" level="warn" includeLocation="true"/>
+    <AsyncLogger name="net.jradius" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.openid4java" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.ldaptive" level="${sys:ldap.log.level}" includeLocation="true"/>
+    <AsyncLogger name="com.hazelcast" level="${sys:hazelcast.log.level}" includeLocation="true"/>
+    <AsyncLogger name="org.jasig.spring" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.apache.cxf" level="warn" includeLocation="true"/>
+    <AsyncLogger name="org.apache.http" level="warn" includeLocation="true"/>
+
+    <AsyncRoot level="warn">
+      <AppenderRef ref="casFile"/>
+    </AsyncRoot>
+  </Loggers>
+</Configuration>
diff --git a/fit/wa-reference/src/main/webapp/WEB-INF/web.xml b/fit/wa-reference/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..34b536e
--- /dev/null
+++ b/fit/wa-reference/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
+         version="4.0"
+         metadata-complete="true">
+
+  <display-name>Apache Syncope ${syncope.version} WA</display-name>
+
+</web-app>
diff --git a/standalone/pom.xml b/standalone/pom.xml
index 1fee6ac..45d71fd 100644
--- a/standalone/pom.xml
+++ b/standalone/pom.xml
@@ -73,6 +73,13 @@ under the License.
       <type>war</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.syncope.fit</groupId>
+      <artifactId>syncope-fit-wa-reference</artifactId>
+      <version>${project.version}</version>
+      <type>war</type>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -116,68 +123,76 @@ under the License.
             <phase>verify</phase>
             <configuration>
               <target>
-                <mkdir dir="${work.dir}" />
+                <mkdir dir="${work.dir}"/>
 
                 <!-- legal stuff -->
-                <copy file="${project.build.outputDirectory}/README" todir="${work.dir}" />
-                <copy file="LICENSE" todir="${work.dir}" />
-                <copy file="NOTICE" todir="${work.dir}" />
+                <copy file="${project.build.outputDirectory}/README" todir="${work.dir}"/>
+                <copy file="LICENSE" todir="${work.dir}"/>
+                <copy file="NOTICE" todir="${work.dir}"/>
 
                 <!-- Unzip Tomcat and remove docs and examples from webapps (space saving) -->
-                <unzip src="${settings.localRepository}/org/codehaus/cargo/cargo-container-archives/tomcat-${tomcat.version}.zip" dest="${work.dir}" />
-                <delete dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/docs" />
-                <delete dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/examples" />
+                <unzip src="${settings.localRepository}/org/codehaus/cargo/cargo-container-archives/tomcat-${tomcat.version}.zip" dest="${work.dir}"/>
+                <delete dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/docs"/>
+                <delete dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/examples"/>
 
                 <!-- Syncope core -->
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope">
-                  <fileset dir="../fit/core-reference/target/syncope-fit-core-reference-${project.version}" includes="**/*" />
+                  <fileset dir="../fit/core-reference/target/syncope-fit-core-reference-${project.version}" includes="**/*"/>
                 </copy>
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope/WEB-INF/classes" overwrite="true">
-                  <fileset dir="${project.build.outputDirectory}/core" />
+                  <fileset dir="${project.build.outputDirectory}/core"/>
                 </copy>
-                <copy file="../fit/core-reference/target/test-classes/keystore" todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope/WEB-INF/classes" overwrite="true" />
+                <copy file="../fit/core-reference/target/test-classes/keystore" todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope/WEB-INF/classes" overwrite="true"/>
 
                 <!-- Syncope console -->
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-console">
-                  <fileset dir="../fit/console-reference/target/syncope-fit-console-reference-${project.version}" includes="**/*" />
+                  <fileset dir="../fit/console-reference/target/syncope-fit-console-reference-${project.version}" includes="**/*"/>
                 </copy>
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-console/WEB-INF/classes" overwrite="true">
-                  <fileset dir="${project.build.outputDirectory}/console" />
+                  <fileset dir="${project.build.outputDirectory}/console"/>
                 </copy>
 
                 <!-- Syncope enduser -->
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-enduser">
-                  <fileset dir="../fit/enduser-reference/target/syncope-fit-enduser-reference-${project.version}" includes="**/*" />
+                  <fileset dir="../fit/enduser-reference/target/syncope-fit-enduser-reference-${project.version}" includes="**/*"/>
                 </copy>
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-enduser/WEB-INF/classes" overwrite="true">
-                  <fileset dir="${project.build.outputDirectory}/enduser" />
+                  <fileset dir="${project.build.outputDirectory}/enduser"/>
+                </copy>f
+
+                <!-- Syncope wa -->
+                <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-wa">
+                  <fileset dir="../fit/wa-reference/target/syncope-fit-wa-reference-${project.version}" includes="**/*"/>
+                </copy>
+                <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-wa/WEB-INF/classes" overwrite="true">
+                  <fileset dir="${project.build.outputDirectory}/wa"/>
                 </copy>
 
-                <mkdir dir="${work.dir}/apache-tomcat-${tomcat.version}/${test.csvdir.path}" />
-                <copy file="../fit/core-reference/src/test/resources/test.csv" todir="${work.dir}/apache-tomcat-${tomcat.version}/${test.csvdir.path}" />
+                <mkdir dir="${work.dir}/apache-tomcat-${tomcat.version}/${test.csvdir.path}"/>
+                <copy file="../fit/core-reference/src/test/resources/test.csv" todir="${work.dir}/apache-tomcat-${tomcat.version}/${test.csvdir.path}"/>
 
                 <!-- Syncope build tools (provide H2, Apache DS and REST / SOAP resources + ConnId connector server) -->
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-fit-build-tools">
-                  <fileset dir="../fit/build-tools/target/syncope-fit-build-tools-${project.version}" includes="**/*" />
+                  <fileset dir="../fit/build-tools/target/syncope-fit-build-tools-${project.version}" includes="**/*"/>
                 </copy>
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope-fit-build-tools/WEB-INF/lib">
-                  <fileset dir="../fit/core-reference/target/bundles/" includes="**/*" />
+                  <fileset dir="../fit/core-reference/target/bundles/" includes="**/*"/>
                 </copy>
 
                 <!-- Tomcat shared libraries: H2, StAX2 API, Woodstox -->
-                <copy file="${settings.localRepository}/com/h2database/h2/${h2.version}/h2-${h2.version}.jar" todir="${work.dir}/apache-tomcat-${tomcat.version}/lib" />
+                <copy file="${settings.localRepository}/com/h2database/h2/${h2.version}/h2-${h2.version}.jar" todir="${work.dir}/apache-tomcat-${tomcat.version}/lib"/>
                 <copy todir="${work.dir}/apache-tomcat-${tomcat.version}/lib">
-                  <fileset dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope/WEB-INF/lib" includes="stax2-api-*.jar" />
-                  <fileset dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope/WEB-INF/lib" includes="woodstox-core-asl-*.jar" />
+                  <fileset dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope/WEB-INF/lib" includes="stax2-api-*.jar"/>
+                  <fileset dir="${work.dir}/apache-tomcat-${tomcat.version}/webapps/syncope/WEB-INF/lib" includes="woodstox-core-asl-*.jar"/>
                 </copy>
 
                 <!-- Other custom Tomcat resources -->
-                <copy file="${project.build.outputDirectory}/context.xml" todir="${work.dir}/apache-tomcat-${tomcat.version}/conf" overwrite="true" />
-                <copy file="src/main/resources/setenv.sh" todir="${work.dir}/apache-tomcat-${tomcat.version}/bin" />
-                <copy file="src/main/resources/setenv.bat" todir="${work.dir}/apache-tomcat-${tomcat.version}/bin" />
-                <replace file="${work.dir}/apache-tomcat-${tomcat.version}/conf/server.xml" token="8080" value="${cargo.servlet.port}" />
-                <replace file="${work.dir}/apache-tomcat-${tomcat.version}/conf/server.xml" token="8009" value="${cargo.tomcat.ajp.port}" />
-                <replace file="${work.dir}/apache-tomcat-${tomcat.version}/conf/server.xml" token="8005" value="${cargo.rmi.port}" />
+                <copy file="${project.build.outputDirectory}/context.xml" todir="${work.dir}/apache-tomcat-${tomcat.version}/conf" overwrite="true"/>
+                <copy file="src/main/resources/setenv.sh" todir="${work.dir}/apache-tomcat-${tomcat.version}/bin"/>
+                <copy file="src/main/resources/setenv.bat" todir="${work.dir}/apache-tomcat-${tomcat.version}/bin"/>
+                <replace file="${work.dir}/apache-tomcat-${tomcat.version}/conf/server.xml" token="8080" value="${cargo.servlet.port}"/>
+                <replace file="${work.dir}/apache-tomcat-${tomcat.version}/conf/server.xml" token="8009" value="${cargo.tomcat.ajp.port}"/>
+                <replace file="${work.dir}/apache-tomcat-${tomcat.version}/conf/server.xml" token="8005" value="${cargo.rmi.port}"/>
               </target>
             </configuration>
           </execution>
@@ -276,6 +291,12 @@ under the License.
       </resource>
 
       <resource>
+        <directory>../fit/wa-reference/src/main/resources</directory>
+        <targetPath>wa</targetPath>
+        <filtering>true</filtering>
+      </resource>
+
+      <resource>
         <directory>src/main/resources</directory>
       </resource>
       <resource>
diff --git a/wa/src/main/resources/templates/layout.html b/wa/src/main/resources/templates/layout.html
new file mode 100644
index 0000000..846f0d5
--- /dev/null
+++ b/wa/src/main/resources/templates/layout.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<!--
+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.
+-->
+<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
+
+<head>
+    <meta charset="UTF-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+
+    <title layout:title-pattern="$CONTENT_TITLE - $LAYOUT_TITLE">Apache Syncope</title>
+
+    <!--/* Core CAS CSS */-->
+    <link rel="stylesheet" type="text/css" href="../static/css/normalize.css" th:href="@{#{webjars.normalize.css}}" />
+    <link rel="stylesheet" type="text/css" href="../static/css/bootstrap-grid.min.css" th:href="@{#{webjars.bootstrap-grid.css}}" />
+    <link rel="stylesheet" type="text/css" href="../static/css/material-components-web.min.css" th:href="@{#{webjars.material-components.css}}" />
+    <link rel="stylesheet" type="text/css" href="../static/css/mdi-font.css" th:href="@{#{webjars.mdi-font.css}}" />
+    <link rel="stylesheet" type="text/css" href="../static/css/cas.css" th:href="@{${#themes.code('cas.standard.css.file')}}"/>
+
+    <link rel="icon" th:href="@{/favicon.ico}" type="image/x-icon"/>
+</head>
+
+<body>
+<script th:replace="fragments/scripts" />
+
+<div th:replace="fragments/header :: header">
+    <a href="fragments/header.html">Header</a> fragment will go here
+</div>
+
+<div class="mdc-drawer-scrim"></div>
+
+<div class="mdc-drawer-app-content mdc-top-app-bar--fixed-adjust d-flex justify-content-center">
+    <main role="main" id="main-content" class="container-lg py-4">
+        <div layout:fragment="content" id="content">
+            CAS content will go here
+        </div>
+    </main>
+</div>
+
+<div th:replace="fragments/footer :: footer">
+    <a href="fragments/footer.html">Footer</a> fragment will go here
+</div>
+
+</body>
+</html>