diff --git a/bundle/pom.xml b/bundle/pom.xml
index 79fd784..14f683c 100644
--- a/bundle/pom.xml
+++ b/bundle/pom.xml
@@ -100,6 +100,10 @@
org.apache.sling
org.apache.sling.models.api
+
+ com.adobe.acs
+ acs-aem-commons-bundle
+
com.adobe.aem
uber-jar
@@ -187,6 +191,14 @@
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 8
+ 8
+
+
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/AutomatedLayoutPageInvalidator.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/AutomatedLayoutPageInvalidator.java
new file mode 100644
index 0000000..fb88ff2
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/AutomatedLayoutPageInvalidator.java
@@ -0,0 +1,96 @@
+package com.adobe.acs.samples.httpcache;
+
+/*
+ * #%L
+ * ACS AEM Commons Bundle
+ * %%
+ * Copyright (C) 2015 Adobe
+ * %%
+ * Licensed 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.
+ * #L%
+ */
+
+import com.adobe.acs.commons.httpcache.engine.HttpCacheEngine;
+import com.adobe.acs.commons.httpcache.exception.HttpCacheKeyCreationException;
+import com.adobe.acs.commons.httpcache.exception.HttpCachePersistenceException;
+import com.day.cq.commons.jcr.JcrConstants;
+import org.apache.commons.lang.StringUtils;
+import org.apache.sling.api.resource.observation.ResourceChange;
+import org.apache.sling.api.resource.observation.ResourceChangeListener;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Automated Memory Cache Flusher
+ *
+ * Helps reducing maintenance by automatically flushing the ACS commons memory cache by implementing ResourceChangeListener.
+ *
+ */
+@Component(
+ configurationPolicy = ConfigurationPolicy.OPTIONAL,
+ immediate = true,
+ property = {
+ ResourceChangeListener.PATHS + "=/apps/acs-samples/components/structure/page/layout",
+ ResourceChangeListener.PATHS + "=/content/acs-samples",
+ ResourceChangeListener.CHANGES + "=ADDED",
+ ResourceChangeListener.CHANGES + "=CHANGED",
+ ResourceChangeListener.CHANGES + "=REMOVED",
+ }
+)
+// @formatter:on
+public class AutomatedLayoutPageInvalidator implements ResourceChangeListener {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AutomatedLayoutPageInvalidator.class);
+ private static final String PATH_SUFFIX = "/" + JcrConstants.JCR_CONTENT + ".content.html";
+
+ private static final Pattern PATTERN = Pattern.compile("((/content/acs-samples/(headers|footers)/[a-zA-Z0-9_-]{1,99}))(.*)/(.*)");
+
+ @Reference
+ private HttpCacheEngine engine;
+
+ @Override
+ public void onChange(List changes) {
+ for (ResourceChange change : changes) {
+
+ LOG.debug("Attempting to extract header path from: {}", change.getPath());
+ String layoutPagePath = extractHeaderPath(change.getPath());
+
+ if (StringUtils.isNotEmpty(layoutPagePath)) {
+ LOG.debug("Extracted header path: {}", layoutPagePath);
+ try {
+ LOG.debug("Flushing path {}", layoutPagePath + PATH_SUFFIX);
+ engine.invalidateCache(layoutPagePath + PATH_SUFFIX);
+ } catch (HttpCachePersistenceException | HttpCacheKeyCreationException e) {
+ LOG.error("Error flushing path!", e);
+ }
+ }
+
+ }
+ }
+
+ private String extractHeaderPath(String headerChildResourcePath) {
+ Matcher matcher = PATTERN.matcher(headerChildResourcePath);
+
+ if (matcher.matches()) {
+ return matcher.group(1);
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/CookieCacheExtension.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/CookieCacheExtension.java
new file mode 100644
index 0000000..342e665
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/CookieCacheExtension.java
@@ -0,0 +1,101 @@
+package com.adobe.acs.samples.httpcache;
+
+import com.adobe.acs.commons.httpcache.config.HttpCacheConfig;
+import com.adobe.acs.commons.httpcache.config.HttpCacheConfigExtension;
+import com.adobe.acs.commons.httpcache.exception.HttpCacheKeyCreationException;
+import com.adobe.acs.commons.httpcache.exception.HttpCacheRepositoryAccessException;
+import com.adobe.acs.commons.httpcache.keys.CacheKey;
+import com.adobe.acs.commons.httpcache.keys.CacheKeyFactory;
+import com.adobe.acs.samples.httpcache.definitions.CookieCacheExtensionConfig;
+import com.adobe.acs.samples.httpcache.key.CookieCacheKey;
+import com.adobe.acs.samples.httpcache.key.CookieKeyValueMap;
+import com.adobe.acs.samples.httpcache.key.CookieKeyValueMapBuilder;
+import com.google.common.collect.ImmutableSet;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.Designate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.Cookie;
+import java.util.Set;
+
+/**
+ * CookieCacheExtension
+ *
+ * This extension on the HTTP cache allows for specific cookie combinations to create seperated cache entries.
+ * This so we can present a different header based on cookie values, which tell us if a user is logged in and what type of user it is.
+ *
+ */
+@Component(configurationPolicy = ConfigurationPolicy.REQUIRE , service = {HttpCacheConfigExtension.class, CacheKeyFactory.class})
+@Designate(ocd = CookieCacheExtensionConfig.class, factory = true)
+public class CookieCacheExtension implements HttpCacheConfigExtension, CacheKeyFactory {
+ private static final Logger log = LoggerFactory.getLogger(CookieCacheExtension.class);
+
+ private boolean emptyAllowed;
+ private String configName;
+ private Set cookieKeys;
+
+ //-------------------------
+
+ @Override
+ public boolean accepts(SlingHttpServletRequest request, HttpCacheConfig cacheConfig) throws
+ HttpCacheRepositoryAccessException {
+
+ if(emptyAllowed){
+ return true;
+ }else{
+ Set presentCookies = ImmutableSet.copyOf(request.getCookies());
+ return containsAtLeastOneMatch(presentCookies);
+ }
+ }
+
+ private boolean containsAtLeastOneMatch(Set presentCookies){
+ CookieKeyValueMapBuilder builder = new CookieKeyValueMapBuilder(cookieKeys, presentCookies);
+ CookieKeyValueMap map = builder.build();
+ return !map.isEmpty();
+ }
+
+
+ //-------------------------
+
+ @Override
+ public CacheKey build(final SlingHttpServletRequest slingHttpServletRequest, final HttpCacheConfig cacheConfig)
+ throws HttpCacheKeyCreationException {
+
+ ImmutableSet presentCookies = ImmutableSet.copyOf(slingHttpServletRequest.getCookies());
+ CookieKeyValueMapBuilder builder = new CookieKeyValueMapBuilder(cookieKeys, presentCookies);
+ return new CookieCacheKey(slingHttpServletRequest, cacheConfig, builder.build());
+ }
+
+
+ public CacheKey build(String resourcePath, HttpCacheConfig httpCacheConfig) throws HttpCacheKeyCreationException {
+ return new CookieCacheKey(resourcePath, httpCacheConfig, new CookieKeyValueMap());
+ }
+
+ @Override
+ public boolean doesKeyMatchConfig(CacheKey key, HttpCacheConfig cacheConfig) throws HttpCacheKeyCreationException {
+
+ // Check if key is instance of GroupCacheKey.
+ if (!(key instanceof CookieCacheKey)) {
+ return false;
+ }
+
+ CookieCacheKey thatKey = (CookieCacheKey) key;
+
+ return new CookieCacheKey(thatKey.getUri(), cacheConfig,thatKey.getKeyValueMap()).equals(key);
+ }
+
+
+ //-------------------------
+
+ @Activate
+ protected void activate(CookieCacheExtensionConfig config) {
+ this.cookieKeys = ImmutableSet.copyOf(config.allowedCookieKeys());
+ this.configName = config.configName();
+ this.emptyAllowed = config.emptyAllowed();
+ log.info("GroupHttpCacheConfigExtension activated/modified.");
+ }
+}
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/ResourcePathCacheExtension.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/ResourcePathCacheExtension.java
new file mode 100644
index 0000000..5d535e9
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/ResourcePathCacheExtension.java
@@ -0,0 +1,112 @@
+package com.adobe.acs.samples.httpcache;
+
+import com.adobe.acs.commons.httpcache.config.HttpCacheConfig;
+import com.adobe.acs.commons.httpcache.config.HttpCacheConfigExtension;
+import com.adobe.acs.commons.httpcache.exception.HttpCacheKeyCreationException;
+import com.adobe.acs.commons.httpcache.exception.HttpCacheRepositoryAccessException;
+import com.adobe.acs.commons.httpcache.keys.CacheKey;
+import com.adobe.acs.commons.httpcache.keys.CacheKeyFactory;
+import com.adobe.acs.samples.httpcache.definitions.ResourcePathCacheExtensionConfig;
+import com.adobe.acs.samples.httpcache.key.ResourcePathCacheKey;
+import org.apache.commons.lang.StringUtils;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.ConfigurationPolicy;
+import org.osgi.service.metatype.annotations.Designate;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * ResourcePathCacheExtension
+ *
+ * Simple cache extension to only create keys based on the resource path.
+ *
+ */
+@Component(configurationPolicy = ConfigurationPolicy.REQUIRE , service = {HttpCacheConfigExtension.class, CacheKeyFactory.class})
+@Designate(ocd = ResourcePathCacheExtensionConfig.class, factory = true)
+public class ResourcePathCacheExtension implements HttpCacheConfigExtension, CacheKeyFactory {
+
+ private List resourcePathPatterns;
+ private List selectorPatterns;
+ private List extensionPatterns;
+
+ private String configName;
+
+ @Override
+ public boolean accepts(SlingHttpServletRequest request, HttpCacheConfig cacheConfig) throws
+ HttpCacheRepositoryAccessException {
+ String resourcePath = request.getRequestPathInfo().getResourcePath();
+
+ if(!matches(resourcePathPatterns, resourcePath)){
+ return false;
+ }
+
+ if(!matches(selectorPatterns, request.getRequestPathInfo().getSelectorString())){
+ return false;
+ }
+
+ if(!matches(extensionPatterns, request.getRequestPathInfo().getExtension())){
+ return false;
+ }
+
+ return true;
+ }
+
+ private boolean matches(List source, String query) {
+ if(StringUtils.isNotBlank(query)){
+ for(Pattern pattern : source){
+ if(pattern.matcher(query).find()){
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public CacheKey build(final SlingHttpServletRequest slingHttpServletRequest, final HttpCacheConfig cacheConfig)
+ throws HttpCacheKeyCreationException {
+ return new ResourcePathCacheKey(slingHttpServletRequest, cacheConfig);
+ }
+
+
+ public CacheKey build(String resourcePath, HttpCacheConfig httpCacheConfig) throws HttpCacheKeyCreationException {
+ return new ResourcePathCacheKey(resourcePath, httpCacheConfig);
+ }
+
+ @Override
+ public boolean doesKeyMatchConfig(CacheKey key, HttpCacheConfig cacheConfig) throws HttpCacheKeyCreationException {
+
+ // Check if key is instance of GroupCacheKey.
+ if (!(key instanceof ResourcePathCacheKey)) {
+ return false;
+ }
+
+ ResourcePathCacheKey thatKey = (ResourcePathCacheKey) key;
+
+ return new ResourcePathCacheKey(thatKey.getUri(), cacheConfig).equals(key);
+ }
+
+ @Activate
+ protected void activate(ResourcePathCacheExtensionConfig config){
+ this.configName = config.configName();
+ this.resourcePathPatterns = compileToPatterns(config.resourcePathPatterns());
+ this.extensionPatterns = compileToPatterns(config.extensions());
+ this.selectorPatterns = compileToPatterns(config.selectors());
+ }
+
+ private List compileToPatterns(final String[] regexes) {
+ final List patterns = new ArrayList();
+
+ for (String regex : regexes) {
+ if (StringUtils.isNotBlank(regex)) {
+ patterns.add(Pattern.compile(regex));
+ }
+ }
+
+ return patterns;
+ }
+}
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/definitions/CookieCacheExtensionConfig.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/definitions/CookieCacheExtensionConfig.java
new file mode 100644
index 0000000..b938191
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/definitions/CookieCacheExtensionConfig.java
@@ -0,0 +1,36 @@
+package com.adobe.acs.samples.httpcache.definitions;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+/**
+ * CookieCacheExtensionConfig
+ *
+ * Configuration OCD object for the CookiecCacheExtension
+ *
+ */
+@ObjectClassDefinition(
+ name = "CookieCacheExtensionConfig - Configuration OCD object for the CookiecCacheExtension",
+ description = "Extension for the ACS commons HTTP Cache. Leverages cookies."
+)
+public @interface CookieCacheExtensionConfig {
+
+ @AttributeDefinition(
+ name = "Configuration Name",
+ description = "The unique identifier of this extension"
+ )
+ String configName() default "";
+
+ @AttributeDefinition(
+ name = "Allowed Cookies",
+ description = "Cookie keys that will used to generate a cache key."
+ )
+ String[] allowedCookieKeys() default {};
+
+ @AttributeDefinition(
+ name = "Empty is allowed",
+ description = "Cookie keys that will used to generate a cache key."
+ )
+ boolean emptyAllowed() default false;
+
+}
\ No newline at end of file
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/definitions/ResourcePathCacheExtensionConfig.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/definitions/ResourcePathCacheExtensionConfig.java
new file mode 100644
index 0000000..5b28964
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/definitions/ResourcePathCacheExtensionConfig.java
@@ -0,0 +1,41 @@
+package com.adobe.acs.samples.httpcache.definitions;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+/**
+ * ResourcePathCacheExtensionConfig
+ *
+ * Configuration OCD object for the ResourcePathCacheExtension
+ *
+ */
+@ObjectClassDefinition(
+ name = "ResourcePathCacheExtensionConfig - Configuration OCD object for the ResourcePathCacheExtension",
+ description = "Extension for the ACS commons HTTP Cache. Based on resource paths, selectors and extensions."
+)
+public @interface ResourcePathCacheExtensionConfig {
+
+ @AttributeDefinition(
+ name = "Configuration Name",
+ description = "The unique identifier of this extension"
+ )
+ String configName() default "";
+
+ @AttributeDefinition(
+ name = "Resource path patterns",
+ description = "List of resource path patterns (regex) that will be valid for caching"
+ )
+ String[] resourcePathPatterns();
+
+ @AttributeDefinition(
+ name = "Selector patterns",
+ description = "List of selector patterns (regex) that will be valid for caching"
+ )
+ String[] selectors();
+
+ @AttributeDefinition(
+ name = "Extension patterns",
+ description = "List of extension patterns (regex) that will be valid for caching"
+ )
+ String[] extensions();
+}
\ No newline at end of file
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieCacheKey.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieCacheKey.java
new file mode 100644
index 0000000..1df81e5
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieCacheKey.java
@@ -0,0 +1,69 @@
+package com.adobe.acs.samples.httpcache.key;
+
+import com.adobe.acs.commons.httpcache.config.HttpCacheConfig;
+import com.adobe.acs.commons.httpcache.exception.HttpCacheKeyCreationException;
+import com.adobe.acs.commons.httpcache.keys.AbstractCacheKey;
+import com.adobe.acs.commons.httpcache.keys.CacheKey;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.sling.api.SlingHttpServletRequest;
+
+/**
+ * CookieCacheKey
+ *
+ * This class represents a cache key in the HTTP Cache that will be used to separate header cache entries.
+ *
+ */
+public class CookieCacheKey extends AbstractCacheKey implements CacheKey {
+
+
+ private final CookieKeyValueMap keyValueMap;
+
+ public CookieCacheKey(SlingHttpServletRequest request, HttpCacheConfig cacheConfig, CookieKeyValueMap keyValueMap) throws
+ HttpCacheKeyCreationException {
+
+ super(request, cacheConfig);
+ this.keyValueMap = keyValueMap;
+ }
+
+ public CookieCacheKey(String uri, HttpCacheConfig cacheConfig, CookieKeyValueMap keyValueMap) throws HttpCacheKeyCreationException {
+ super(uri, cacheConfig);
+
+ this.keyValueMap = keyValueMap;
+ }
+
+ public CookieKeyValueMap getKeyValueMap() {
+ return keyValueMap;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!super.equals(o)) {
+ return false;
+ }
+
+ CookieCacheKey that = (CookieCacheKey) o;
+
+ return new EqualsBuilder()
+ .append(getUri(), that.getUri())
+ .append(keyValueMap, that.keyValueMap)
+ .append(getAuthenticationRequirement(), that.getAuthenticationRequirement())
+ .isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(17, 37)
+ .append(getUri())
+ .append(keyValueMap)
+ .append(getAuthenticationRequirement()).toHashCode();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder formattedString = new StringBuilder(this.uri);
+ formattedString.append(keyValueMap.toString());
+ formattedString.append("[AUTH_REQ:" + getAuthenticationRequirement() + "]");
+ return formattedString.toString();
+ }
+}
\ No newline at end of file
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieKeyValueMap.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieKeyValueMap.java
new file mode 100644
index 0000000..7df582f
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieKeyValueMap.java
@@ -0,0 +1,52 @@
+package com.adobe.acs.samples.httpcache.key;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * CookieKeyValueMap
+ *
+ * Basically a HashMap with a nice toString function for the CookieCacheKey to hold cookies into.
+ *
+ */
+public class CookieKeyValueMap extends HashMap {
+
+ public CookieKeyValueMap() {
+ }
+
+
+ @Override
+ public String toString() {
+
+ StringBuilder result = new StringBuilder("[CookieKeyValues:");
+
+ Iterator> entries = entrySet().iterator();
+
+ if(!isEmpty()){
+ while (entries.hasNext()) {
+
+ Entry entry = entries.next();
+ String key = entry.getKey();
+ String value = entry.getValue();
+
+ if (StringUtils.isNotEmpty(value)) {
+ result.append(key + "=" + value);
+ } else {
+ //cookie is only present, but no value.
+ result.append(key);
+ }
+
+ if (entries.hasNext()) {
+ result.append(",");
+ }
+
+ }
+ }
+
+ result.append("]");
+ return result.toString();
+
+ }
+}
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieKeyValueMapBuilder.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieKeyValueMapBuilder.java
new file mode 100644
index 0000000..12239da
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/CookieKeyValueMapBuilder.java
@@ -0,0 +1,34 @@
+package com.adobe.acs.samples.httpcache.key;
+
+import javax.servlet.http.Cookie;
+import java.util.Set;
+
+/**
+ * CookieKeyValueMapBuilder
+ *
+ * The purpose of the cookie key value map builder is to handle cookiekeyvaluemap instantation.
+ *
+ */
+public class CookieKeyValueMapBuilder {
+
+ private final Set allowedKeys;
+ private final Set presentCookies;
+ private final CookieKeyValueMap keyValueMap = new CookieKeyValueMap();
+
+ public CookieKeyValueMapBuilder(Set allowedKeys, Set presentCookies){
+
+ this.allowedKeys = allowedKeys;
+ this.presentCookies = presentCookies;
+ }
+
+
+ public CookieKeyValueMap build(){
+
+ presentCookies.stream()
+ .filter( cookie -> allowedKeys.contains(cookie.getName()))
+ .forEach(cookie -> keyValueMap.put(cookie.getName(), cookie.getValue()));
+
+ return keyValueMap;
+ }
+
+}
diff --git a/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/ResourcePathCacheKey.java b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/ResourcePathCacheKey.java
new file mode 100644
index 0000000..31b3d25
--- /dev/null
+++ b/bundle/src/main/java/com/adobe/acs/samples/httpcache/key/ResourcePathCacheKey.java
@@ -0,0 +1,74 @@
+package com.adobe.acs.samples.httpcache.key;
+
+import com.adobe.acs.commons.httpcache.config.HttpCacheConfig;
+import com.adobe.acs.commons.httpcache.keys.AbstractCacheKey;
+import com.adobe.acs.commons.httpcache.keys.CacheKey;
+import com.day.cq.commons.PathInfo;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.request.RequestPathInfo;
+
+/**
+ * ResourcePathCacheKey
+ *
+ * A key that only contains a resource path
+ *
+ */
+public class ResourcePathCacheKey extends AbstractCacheKey implements CacheKey {
+
+
+ private final String selector;
+ private final String extension;
+
+ public ResourcePathCacheKey(SlingHttpServletRequest request, HttpCacheConfig cacheConfig) {
+ super(request, cacheConfig);
+
+ RequestPathInfo pathInfo = request.getRequestPathInfo();
+ selector = pathInfo.getSelectorString();
+ extension = pathInfo.getExtension();
+ }
+
+ public ResourcePathCacheKey(String uri, HttpCacheConfig cacheConfig){
+ super(uri, cacheConfig);
+ RequestPathInfo pathInfo = new PathInfo(uri);
+ selector = pathInfo.getSelectorString();
+ extension = pathInfo.getExtension();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+
+ if (o == null) {
+ return false;
+ }
+
+ ResourcePathCacheKey that = (ResourcePathCacheKey) o;
+ return new EqualsBuilder()
+ .append(resourcePath, that.resourcePath)
+ .append(getExtension(), that.getExtension())
+ .append(getSelector(), that.getSelector())
+ .isEquals();
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder()
+ .append(resourcePath)
+ .toHashCode();
+ }
+
+ @Override
+ public String toString(){
+ return resourcePath + "." + getSelector() + "." + getExtension();
+ }
+
+
+ public String getSelector() {
+ return selector;
+ }
+
+ public String getExtension() {
+ return extension;
+ }
+}
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/.content.xml
new file mode 100644
index 0000000..479a352
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/_cq_dialog/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/_cq_dialog/.content.xml
new file mode 100644
index 0000000..7755c96
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/_cq_dialog/.content.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/body.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/body.html
new file mode 100644
index 0000000..5c89f78
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/contentpage/body.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/.content.xml
new file mode 100644
index 0000000..bddd1eb
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/_cq_dialog/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/_cq_dialog/.content.xml
new file mode 100644
index 0000000..391ad90
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/_cq_dialog/.content.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/body.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/body.html
new file mode 100644
index 0000000..60b417c
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/body.html
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/footerpage/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/footerpage/.content.xml
new file mode 100644
index 0000000..5c3edfa
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/footerpage/.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/footerpage/content.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/footerpage/content.html
new file mode 100644
index 0000000..c7eaa70
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/footerpage/content.html
@@ -0,0 +1,4 @@
+
+ Some footer content.
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/.content.xml
new file mode 100644
index 0000000..265b9d3
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/content.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/content.html
new file mode 100644
index 0000000..939068d
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/content.html
@@ -0,0 +1,9 @@
+
+
+ Logo component
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/include-menupage-entries.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/include-menupage-entries.html
new file mode 100644
index 0000000..11e6ab4
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/include-menupage-entries.html
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/.content.xml
new file mode 100644
index 0000000..9d27812
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/_cq_dialog/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/_cq_dialog/.content.xml
new file mode 100644
index 0000000..5f63c56
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/_cq_dialog/.content.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/content.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/content.html
new file mode 100644
index 0000000..502ea3e
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry-variant-b/content.html
@@ -0,0 +1,12 @@
+
+
+ Sling magic! I render differently!
+
+ ${properties['jcr:title']}
+
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/.content.xml
new file mode 100644
index 0000000..8c39ff1
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/_cq_dialog/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/_cq_dialog/.content.xml
new file mode 100644
index 0000000..5f63c56
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/_cq_dialog/.content.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/content.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/content.html
new file mode 100644
index 0000000..0836781
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-mainentry/content.html
@@ -0,0 +1,11 @@
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/.content.xml
new file mode 100644
index 0000000..3d7590c
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/.content.xml
@@ -0,0 +1,7 @@
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/_cq_dialog/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/_cq_dialog/.content.xml
new file mode 100644
index 0000000..5f63c56
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/_cq_dialog/.content.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/content.html b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/content.html
new file mode 100644
index 0000000..a7273da
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/components/structure/page/layout/headerpage/menupage-subentry/content.html
@@ -0,0 +1,7 @@
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/config/com.adobe.acs.commons.httpcache.config.impl.HttpCacheConfigImpl-layout.xml b/content/src/main/content/jcr_root/apps/acs-samples/config/com.adobe.acs.commons.httpcache.config.impl.HttpCacheConfigImpl-layout.xml
new file mode 100644
index 0000000..4ca1171
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/config/com.adobe.acs.commons.httpcache.config.impl.HttpCacheConfigImpl-layout.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/config/com.adobe.acs.samples.httpcache.ResourcePathCacheExtension-layout.xml b/content/src/main/content/jcr_root/apps/acs-samples/config/com.adobe.acs.samples.httpcache.ResourcePathCacheExtension-layout.xml
new file mode 100644
index 0000000..7896ea2
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/config/com.adobe.acs.samples.httpcache.ResourcePathCacheExtension-layout.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/content-page/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/content-page/.content.xml
new file mode 100644
index 0000000..4cad360
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/content-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/footer-page/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/footer-page/.content.xml
new file mode 100644
index 0000000..68badbb
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/footer-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-mainentry-page/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-mainentry-page/.content.xml
new file mode 100644
index 0000000..a4a6696
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-mainentry-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-mainentry-variant-b-page/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-mainentry-variant-b-page/.content.xml
new file mode 100644
index 0000000..2903594
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-mainentry-variant-b-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-subentry-page/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-subentry-page/.content.xml
new file mode 100644
index 0000000..4bce0cc
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-menu-subentry-page/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-page/.content.xml b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-page/.content.xml
new file mode 100644
index 0000000..b0f01bf
--- /dev/null
+++ b/content/src/main/content/jcr_root/apps/acs-samples/layout-pages/templates/header-page/.content.xml
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/.content.xml
new file mode 100644
index 0000000..1f7757e
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/initial/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/initial/.content.xml
new file mode 100644
index 0000000..d2a9ccf
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/initial/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/policies/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/policies/.content.xml
new file mode 100644
index 0000000..24701e2
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/policies/.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/structure/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/structure/.content.xml
new file mode 100644
index 0000000..d5d978b
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/structure/.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/thumbnail.png b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/thumbnail.png
new file mode 100644
index 0000000..b04e9f7
Binary files /dev/null and b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/content-page/thumbnail.png differ
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/empty-page/initial/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/empty-page/initial/.content.xml
index 822f308..839073b 100644
--- a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/empty-page/initial/.content.xml
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/empty-page/initial/.content.xml
@@ -12,4 +12,5 @@
jcr:primaryType="nt:unstructured"
sling:resourceType="wcm/foundation/components/responsivegrid"/>
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/.content.xml
new file mode 100644
index 0000000..9e45631
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/initial/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/initial/.content.xml
new file mode 100644
index 0000000..7d029ac
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/initial/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/policies/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/policies/.content.xml
new file mode 100644
index 0000000..24701e2
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/policies/.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/structure/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/structure/.content.xml
new file mode 100644
index 0000000..bc05a35
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/structure/.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/thumbnail.png b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/thumbnail.png
new file mode 100644
index 0000000..b04e9f7
Binary files /dev/null and b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/footer-page/thumbnail.png differ
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/.content.xml
new file mode 100644
index 0000000..43be981
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/initial/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/initial/.content.xml
new file mode 100644
index 0000000..cba99e8
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/initial/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/policies/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/policies/.content.xml
new file mode 100644
index 0000000..a75803f
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/policies/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/structure/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/structure/.content.xml
new file mode 100644
index 0000000..7554b31
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/structure/.content.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/thumbnail.png b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/thumbnail.png
new file mode 100644
index 0000000..b04e9f7
Binary files /dev/null and b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/template-types/header-page/thumbnail.png differ
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/.content.xml
new file mode 100644
index 0000000..6e8726c
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/initial/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/initial/.content.xml
new file mode 100644
index 0000000..a691582
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/initial/.content.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/policies/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/policies/.content.xml
new file mode 100644
index 0000000..dab196f
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/policies/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/structure/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/structure/.content.xml
new file mode 100644
index 0000000..fbf0997
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/structure/.content.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/thumbnail.png b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/thumbnail.png
new file mode 100644
index 0000000..b04e9f7
Binary files /dev/null and b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/layout-content-page/thumbnail.png differ
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/.content.xml
new file mode 100644
index 0000000..e8fc679
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/initial/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/initial/.content.xml
new file mode 100644
index 0000000..6051bed
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/initial/.content.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/policies/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/policies/.content.xml
new file mode 100644
index 0000000..dab196f
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/policies/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/structure/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/structure/.content.xml
new file mode 100644
index 0000000..d1f9425
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/structure/.content.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/thumbnail.png b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/thumbnail.png
new file mode 100644
index 0000000..b04e9f7
Binary files /dev/null and b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-footer/thumbnail.png differ
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/.content.xml
new file mode 100644
index 0000000..ee402d3
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/initial/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/initial/.content.xml
new file mode 100644
index 0000000..4639e4e
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/initial/.content.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/policies/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/policies/.content.xml
new file mode 100644
index 0000000..dab196f
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/policies/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/structure/.content.xml b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/structure/.content.xml
new file mode 100644
index 0000000..0d4e3d1
--- /dev/null
+++ b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/structure/.content.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/thumbnail.png b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/thumbnail.png
new file mode 100644
index 0000000..b04e9f7
Binary files /dev/null and b/content/src/main/content/jcr_root/conf/acs-samples/settings/wcm/templates/standard-header/thumbnail.png differ
diff --git a/content/src/main/content/jcr_root/content/acs-samples/footers/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/footers/.content.xml
new file mode 100755
index 0000000..89bed83
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/footers/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/footers/footer-example/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/footers/footer-example/.content.xml
new file mode 100755
index 0000000..3084309
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/footers/footer-example/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/headers/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/headers/.content.xml
new file mode 100755
index 0000000..3e011b7
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/headers/.content.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/.content.xml
new file mode 100755
index 0000000..a43a316
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/.content.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/.content.xml
new file mode 100755
index 0000000..f3be60d
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/.content.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/other-sub-entry/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/other-sub-entry/.content.xml
new file mode 100755
index 0000000..98ab179
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/other-sub-entry/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/some-sub-entry/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/some-sub-entry/.content.xml
new file mode 100755
index 0000000..8fbcc15
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/exotic-menu-item/some-sub-entry/.content.xml
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/home/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/home/.content.xml
new file mode 100755
index 0000000..637a09e
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/headers/header-example/home/.content.xml
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/content/src/main/content/jcr_root/content/acs-samples/layout-content-pageexample/.content.xml b/content/src/main/content/jcr_root/content/acs-samples/layout-content-pageexample/.content.xml
new file mode 100755
index 0000000..77605c8
--- /dev/null
+++ b/content/src/main/content/jcr_root/content/acs-samples/layout-content-pageexample/.content.xml
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/pom.xml b/pom.xml
index e865c4b..39191fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -159,6 +159,12 @@
provided
apis
+
+ com.adobe.acs
+ acs-aem-commons-bundle
+ 3.15.0
+ provided
+
org.slf4j
slf4j-api