├── .editorconfig ├── .gitattributes ├── .gitignore ├── .idea └── runConfigurations │ ├── await.xml │ ├── build_debug.xml │ ├── bundle_install_core.xml │ ├── develop.xml │ ├── down.xml │ ├── environment_await.xml │ ├── environment_dev.xml │ ├── environment_down.xml │ ├── environment_reload.xml │ ├── environment_restart.xml │ ├── environment_up.xml │ ├── instance_await.xml │ ├── instance_debug_author.xml │ ├── instance_debug_publish.xml │ ├── instance_down.xml │ ├── instance_groovy_eval.xml │ ├── instance_provision.xml │ ├── instance_restart.xml │ ├── instance_satisfy.xml │ ├── instance_status.xml │ ├── instance_tail.xml │ ├── instance_up.xml │ ├── package_compose_all.xml │ ├── package_config_ui_apps.xml │ ├── package_deploy_assembly_full.xml │ ├── package_deploy_migration.xml │ ├── package_sync_ui_content.xml │ ├── restart.xml │ ├── setup.xml │ ├── tasks.xml │ ├── test_functional_open_gui.xml │ ├── test_functional_run.xml │ ├── test_integration_run.xml │ ├── test_performance_run.xml │ └── up.xml ├── LICENSE ├── README.md ├── app ├── aem │ ├── all │ │ └── build.gradle.kts │ ├── common.gradle.kts │ ├── common │ │ └── package │ │ │ ├── defaults │ │ │ └── META-INF │ │ │ │ └── vault │ │ │ │ └── definition │ │ │ │ └── thumbnail.png │ │ │ └── validator │ │ │ ├── OAKPAL_OPEAR │ │ │ └── plan.json │ │ │ └── initial │ │ │ └── META-INF │ │ │ └── vault │ │ │ └── nodetypes.cnd │ ├── core │ │ ├── build.gradle.kts │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── company │ │ │ │ └── example │ │ │ │ └── core │ │ │ │ ├── filters │ │ │ │ ├── LoggingFilter.java │ │ │ │ └── package-info.java │ │ │ │ ├── listeners │ │ │ │ ├── SimpleResourceListener.java │ │ │ │ └── package-info.java │ │ │ │ ├── models │ │ │ │ ├── HelloWorldModel.java │ │ │ │ └── package-info.java │ │ │ │ ├── schedulers │ │ │ │ ├── SimpleScheduledTask.java │ │ │ │ └── package-info.java │ │ │ │ └── servlets │ │ │ │ ├── SimpleServlet.java │ │ │ │ └── package-info.java │ │ │ └── test │ │ │ └── java │ │ │ └── com │ │ │ └── company │ │ │ └── example │ │ │ └── core │ │ │ ├── filters │ │ │ └── LoggingFilterTest.java │ │ │ ├── listeners │ │ │ └── SimpleResourceListenerTest.java │ │ │ ├── models │ │ │ └── HelloWorldModelTest.java │ │ │ ├── schedulers │ │ │ └── SimpleScheduledTaskTest.java │ │ │ └── servlets │ │ │ └── SimpleServletTest.java │ ├── dispatcher │ │ ├── README.md │ │ ├── build.gradle.kts │ │ └── src │ │ │ ├── conf.d │ │ │ ├── available_vhosts │ │ │ │ └── default.vhost │ │ │ ├── dispatcher_vhost.conf │ │ │ ├── enabled_vhosts │ │ │ │ ├── README │ │ │ │ └── default.vhost │ │ │ ├── rewrites │ │ │ │ ├── default_rewrite.rules │ │ │ │ └── rewrite.rules │ │ │ └── variables │ │ │ │ ├── custom.vars │ │ │ │ └── global.vars │ │ │ └── conf.dispatcher.d │ │ │ ├── available_farms │ │ │ └── default.farm │ │ │ ├── cache │ │ │ ├── default_invalidate.any │ │ │ ├── default_rules.any │ │ │ └── rules.any │ │ │ ├── clientheaders │ │ │ ├── clientheaders.any │ │ │ └── default_clientheaders.any │ │ │ ├── dispatcher.any │ │ │ ├── enabled_farms │ │ │ ├── README │ │ │ └── default.farm │ │ │ ├── filters │ │ │ ├── default_filters.any │ │ │ └── filters.any │ │ │ ├── renders │ │ │ └── default_renders.any │ │ │ └── virtualhosts │ │ │ ├── default_virtualhosts.any │ │ │ └── virtualhosts.any │ ├── migration │ │ ├── README.MD │ │ ├── build.gradle.kts │ │ └── src │ │ │ └── main │ │ │ └── content │ │ │ ├── META-INF │ │ │ └── vault │ │ │ │ └── filter.xml │ │ │ └── jcr_root │ │ │ └── var │ │ │ └── groovyconsole │ │ │ └── scripts │ │ │ └── aecu │ │ │ └── example │ │ │ └── migrate.groovy │ ├── ui.apps │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ └── src │ │ │ └── main │ │ │ └── content │ │ │ ├── META-INF │ │ │ └── vault │ │ │ │ └── filter.xml │ │ │ └── jcr_root │ │ │ └── apps │ │ │ ├── .content.xml │ │ │ └── example │ │ │ ├── clientlibs │ │ │ ├── clientlib-base │ │ │ │ ├── .content.xml │ │ │ │ ├── css.txt │ │ │ │ └── js.txt │ │ │ └── clientlib-grid │ │ │ │ ├── .content.xml │ │ │ │ ├── css.txt │ │ │ │ └── less │ │ │ │ └── grid.less │ │ │ ├── components │ │ │ ├── accordion │ │ │ │ ├── .content.xml │ │ │ │ ├── _cq_editConfig.xml │ │ │ │ └── _cq_template │ │ │ │ │ └── .content.xml │ │ │ ├── breadcrumb │ │ │ │ └── .content.xml │ │ │ ├── button │ │ │ │ └── .content.xml │ │ │ ├── carousel │ │ │ │ ├── .content.xml │ │ │ │ └── _cq_editConfig.xml │ │ │ ├── container │ │ │ │ └── .content.xml │ │ │ ├── contentfragment │ │ │ │ ├── .content.xml │ │ │ │ └── _cq_editConfig.xml │ │ │ ├── contentfragmentlist │ │ │ │ └── .content.xml │ │ │ ├── download │ │ │ │ └── .content.xml │ │ │ ├── embed │ │ │ │ └── .content.xml │ │ │ ├── experiencefragment │ │ │ │ ├── .content.xml │ │ │ │ └── _cq_editConfig.xml │ │ │ ├── form │ │ │ │ ├── button │ │ │ │ │ └── .content.xml │ │ │ │ ├── container │ │ │ │ │ ├── .content.xml │ │ │ │ │ └── new │ │ │ │ │ │ └── .content.xml │ │ │ │ ├── hidden │ │ │ │ │ └── .content.xml │ │ │ │ ├── options │ │ │ │ │ └── .content.xml │ │ │ │ └── text │ │ │ │ │ └── .content.xml │ │ │ ├── helloworld │ │ │ │ ├── .content.xml │ │ │ │ ├── _cq_dialog │ │ │ │ │ └── .content.xml │ │ │ │ └── helloworld.html │ │ │ ├── image │ │ │ │ ├── .content.xml │ │ │ │ └── _cq_editConfig.xml │ │ │ ├── languagenavigation │ │ │ │ └── .content.xml │ │ │ ├── list │ │ │ │ ├── .content.xml │ │ │ │ └── _cq_editConfig.xml │ │ │ ├── navigation │ │ │ │ └── .content.xml │ │ │ ├── page │ │ │ │ ├── .content.xml │ │ │ │ ├── customfooterlibs.html │ │ │ │ └── customheaderlibs.html │ │ │ ├── search │ │ │ │ └── .content.xml │ │ │ ├── separator │ │ │ │ └── .content.xml │ │ │ ├── sharing │ │ │ │ └── .content.xml │ │ │ ├── spa │ │ │ │ └── .content.xml │ │ │ ├── tabs │ │ │ │ ├── .content.xml │ │ │ │ ├── _cq_editConfig.xml │ │ │ │ └── _cq_template │ │ │ │ │ └── .content.xml │ │ │ ├── teaser │ │ │ │ └── .content.xml │ │ │ ├── text │ │ │ │ └── .content.xml │ │ │ ├── title │ │ │ │ └── .content.xml │ │ │ └── xfpage │ │ │ │ ├── .content.xml │ │ │ │ ├── content.html │ │ │ │ ├── customfooterlibs.html │ │ │ │ └── customheaderlibs.html │ │ │ ├── config.author │ │ │ └── com.day.cq.wcm.mobile.core.impl.MobileEmulatorProvider-example.xml │ │ │ ├── config.prod │ │ │ └── org.apache.sling.commons.log.LogManager.factory.config-example.xml │ │ │ ├── config.publish │ │ │ └── org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl.xml │ │ │ ├── config.stage │ │ │ └── org.apache.sling.commons.log.LogManager.factory.config-example.xml │ │ │ ├── config │ │ │ └── org.apache.sling.commons.log.LogManager.factory.config-example.xml │ │ │ ├── i18n │ │ │ ├── .content.xml │ │ │ ├── fr.json │ │ │ └── fr.json.dir │ │ │ │ └── .content.xml │ │ │ ├── templates │ │ │ ├── page-content │ │ │ │ └── .content.xml │ │ │ └── page-home │ │ │ │ └── .content.xml │ │ │ └── tests │ │ │ ├── .content.xml │ │ │ ├── SampleTests.js │ │ │ └── js.txt │ ├── ui.content │ │ ├── build.gradle.kts │ │ └── src │ │ │ └── main │ │ │ └── content │ │ │ ├── META-INF │ │ │ └── vault │ │ │ │ └── filter.xml │ │ │ └── jcr_root │ │ │ ├── conf │ │ │ └── example │ │ │ │ ├── .content.xml │ │ │ │ └── settings │ │ │ │ ├── .content.xml │ │ │ │ └── wcm │ │ │ │ ├── .content.xml │ │ │ │ ├── policies │ │ │ │ ├── .content.xml │ │ │ │ └── _rep_policy.xml │ │ │ │ ├── segments │ │ │ │ ├── .content.xml │ │ │ │ ├── summer │ │ │ │ │ └── .content.xml │ │ │ │ └── winter │ │ │ │ │ └── .content.xml │ │ │ │ ├── template-types │ │ │ │ ├── .content.xml │ │ │ │ ├── _rep_policy.xml │ │ │ │ ├── page │ │ │ │ │ ├── .content.xml │ │ │ │ │ ├── initial │ │ │ │ │ │ └── .content.xml │ │ │ │ │ ├── policies │ │ │ │ │ │ └── .content.xml │ │ │ │ │ ├── structure │ │ │ │ │ │ └── .content.xml │ │ │ │ │ ├── thumbnail.png │ │ │ │ │ └── thumbnail.png.dir │ │ │ │ │ │ ├── .content.xml │ │ │ │ │ │ └── _jcr_content │ │ │ │ │ │ └── _dam_thumbnails │ │ │ │ │ │ ├── _dam_thumbnail_300.png │ │ │ │ │ │ ├── _dam_thumbnail_319.png │ │ │ │ │ │ └── _dam_thumbnail_48.png │ │ │ │ └── xf │ │ │ │ │ ├── .content.xml │ │ │ │ │ ├── initial │ │ │ │ │ └── .content.xml │ │ │ │ │ ├── policies │ │ │ │ │ └── .content.xml │ │ │ │ │ ├── structure │ │ │ │ │ └── .content.xml │ │ │ │ │ └── thumbnail.png │ │ │ │ └── templates │ │ │ │ ├── .content.xml │ │ │ │ ├── _rep_policy.xml │ │ │ │ ├── page-content │ │ │ │ ├── .content.xml │ │ │ │ ├── initial │ │ │ │ │ └── .content.xml │ │ │ │ ├── policies │ │ │ │ │ └── .content.xml │ │ │ │ ├── structure │ │ │ │ │ └── .content.xml │ │ │ │ ├── thumbnail.png │ │ │ │ └── thumbnail.png.dir │ │ │ │ │ ├── .content.xml │ │ │ │ │ └── _jcr_content │ │ │ │ │ └── _dam_thumbnails │ │ │ │ │ ├── _dam_thumbnail_300.png │ │ │ │ │ ├── _dam_thumbnail_319.png │ │ │ │ │ └── _dam_thumbnail_48.png │ │ │ │ └── xf-web-variation │ │ │ │ ├── .content.xml │ │ │ │ ├── initial │ │ │ │ └── .content.xml │ │ │ │ ├── policies │ │ │ │ └── .content.xml │ │ │ │ ├── structure │ │ │ │ └── .content.xml │ │ │ │ ├── thumbnail.png │ │ │ │ └── thumbnail.png.dir │ │ │ │ ├── .content.xml │ │ │ │ └── _jcr_content │ │ │ │ └── _dam_thumbnails │ │ │ │ ├── _dam_thumbnail_128.png │ │ │ │ └── _dam_thumbnail_319.png │ │ │ └── content │ │ │ ├── dam │ │ │ ├── .content.xml │ │ │ └── example │ │ │ │ ├── .content.xml │ │ │ │ ├── _jcr_content │ │ │ │ └── folderThumbnail │ │ │ │ └── asset.jpg │ │ │ │ ├── .content.xml │ │ │ │ └── _jcr_content │ │ │ │ └── renditions │ │ │ │ ├── cq5dam.thumbnail.140.100.png │ │ │ │ ├── cq5dam.thumbnail.319.319.png │ │ │ │ ├── cq5dam.thumbnail.48.48.png │ │ │ │ ├── cq5dam.web.1280.1280.jpeg │ │ │ │ ├── original │ │ │ │ └── original.dir │ │ │ │ └── .content.xml │ │ │ ├── example │ │ │ ├── .content.xml │ │ │ ├── _jcr_content │ │ │ │ └── image │ │ │ │ │ ├── file │ │ │ │ │ └── file.dir │ │ │ │ │ ├── .content.xml │ │ │ │ │ └── _jcr_content │ │ │ │ │ └── _dam_thumbnails │ │ │ │ │ ├── _dam_thumbnail_48.png │ │ │ │ │ └── _dam_thumbnail_480.png │ │ │ └── us │ │ │ │ ├── .content.xml │ │ │ │ └── en │ │ │ │ └── .content.xml │ │ │ └── experience-fragments │ │ │ └── example │ │ │ ├── .content.xml │ │ │ └── us │ │ │ ├── .content.xml │ │ │ └── en │ │ │ ├── .content.xml │ │ │ └── site │ │ │ ├── .content.xml │ │ │ ├── footer │ │ │ ├── .content.xml │ │ │ └── master │ │ │ │ └── .content.xml │ │ │ └── header │ │ │ ├── .content.xml │ │ │ └── master │ │ │ └── .content.xml │ └── ui.frontend │ │ ├── .babelrc │ │ ├── .eslintignore │ │ ├── .eslintrc.js │ │ ├── README.md │ │ ├── build.gradle.kts │ │ ├── clientlib.config.js │ │ ├── package.json │ │ ├── src │ │ └── main │ │ │ └── webpack │ │ │ ├── components │ │ │ ├── _accordion.scss │ │ │ ├── _breadcrumb.scss │ │ │ ├── _button.scss │ │ │ ├── _carousel.scss │ │ │ ├── _container.scss │ │ │ ├── _contentfragment.scss │ │ │ ├── _contentfragmentlist.scss │ │ │ ├── _download.scss │ │ │ ├── _experiencefragment.scss │ │ │ ├── _form-button.scss │ │ │ ├── _form-options.scss │ │ │ ├── _form-text.scss │ │ │ ├── _form.scss │ │ │ ├── _helloworld.js │ │ │ ├── _helloworld.scss │ │ │ ├── _image.scss │ │ │ ├── _languagenavigation.scss │ │ │ ├── _list.scss │ │ │ ├── _navigation.scss │ │ │ ├── _search.scss │ │ │ ├── _tabs.scss │ │ │ ├── _teaser.scss │ │ │ ├── _text.scss │ │ │ └── _title.scss │ │ │ ├── resources │ │ │ ├── fonts │ │ │ │ └── .gitkeep │ │ │ └── images │ │ │ │ └── .gitkeep │ │ │ ├── site │ │ │ ├── _base.scss │ │ │ ├── _variables.scss │ │ │ ├── main.scss │ │ │ ├── main.ts │ │ │ └── styles │ │ │ │ ├── container_main.scss │ │ │ │ ├── experiencefragment_footer.scss │ │ │ │ └── experiencefragment_header.scss │ │ │ └── static │ │ │ └── index.html │ │ ├── tsconfig.json │ │ ├── webpack.common.js │ │ ├── webpack.dev.js │ │ ├── webpack.prod.js │ │ └── yarn.lock └── common.gradle.kts ├── azure-pipelines.yml ├── build.gradle.kts ├── buildSrc └── build.gradle.kts ├── docs ├── develop-task.gif ├── docker-vpn-kit.png ├── fork-default-dialog.png ├── fork-props-dialog.png ├── gradle-aem-multi-build.gif ├── logo.png └── wtt-logo.png ├── env ├── build.gradle.kts └── src │ ├── aem │ ├── instance │ │ ├── groovyScript │ │ │ └── 1.0.0 │ │ │ │ └── content-cleanup.groovy │ │ └── tail │ │ │ └── incidentFilter.txt │ ├── localInstance │ │ └── override │ │ │ ├── author │ │ │ └── .gitkeep │ │ │ ├── common │ │ │ └── .gitkeep │ │ │ └── publish │ │ │ └── .gitkeep │ └── package │ │ └── validator │ │ ├── OAKPAL_OPEAR │ │ └── plan.json │ │ └── initial │ │ └── META-INF │ │ └── vault │ │ └── nodetypes.cnd │ └── environment │ ├── docker-compose.yml.peb │ └── httpd │ ├── conf.d │ └── variables │ │ └── default.vars │ └── conf │ └── httpd.conf ├── gh-md-toc ├── gradle.properties ├── gradle ├── fork │ ├── README.MD.peb │ ├── fork.gradle.kts │ ├── gradle.user.properties.peb │ └── props.gradle.kts ├── notifier │ ├── icon-failure.png │ └── icon-success.png └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── test ├── common.gradle.kts ├── functional ├── README.md ├── build.gradle.kts ├── cypress.json ├── cypress │ ├── fixtures │ │ └── .gitkeep │ ├── integration │ │ └── home.spec.js │ ├── plugins │ │ └── index.js │ └── support │ │ ├── commands.js │ │ └── index.js ├── docs │ ├── gui-home-spec.png │ └── gui-spec-select.png ├── package.json ├── scripts │ └── generateReport.js └── yarn.lock ├── integration ├── README.md ├── build.gradle.kts ├── docs │ ├── cucumber-report.png │ └── karate-feature-intellij.png └── src │ └── integTest │ └── kotlin │ ├── jsoup │ ├── base │ │ └── MarkupTest.kt │ └── test │ │ └── HomeTest.kt │ └── karate │ ├── basic-auth.js │ ├── feature │ ├── FeatureRunner.kt │ ├── pageModel.feature │ └── posts.feature │ └── karate-config.js └── performance ├── README.md ├── build.gradle.kts ├── docs └── lighthouse-report.png ├── lighthouse ├── config.json └── suites.json ├── package.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | insert_final_newline = true 6 | 7 | [*.js] 8 | indent_style = space 9 | indent_size = 4 10 | 11 | [*.xml] 12 | indent_style = space 13 | indent_size = 4 14 | 15 | [*.{scss,less,css}] 16 | indent_style = space 17 | indent_size = 4 18 | insert_final_newline = true 19 | 20 | [*.{kt,java,jsp}] 21 | indent_style = space 22 | indent_size = 2 23 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Handle line endings automatically for files detected as text 2 | # and leave all files detected as binary untouched. 3 | * text=auto eol=lf 4 | 5 | # The above will handle all files NOT found below 6 | # 7 | # These files are text and should be normalized (Convert crlf => lf) 8 | *.css text 9 | *.scss text 10 | *.df text 11 | *.htm text 12 | *.html text 13 | *.java text 14 | *.kt text 15 | *.js text 16 | *.json text 17 | *.jsp text 18 | *.jspf text 19 | *.jspx text 20 | *.properties text 21 | *.sh text 22 | *.tld text 23 | *.txt text 24 | *.tag text 25 | *.tagx text 26 | *.xml text 27 | *.yml text 28 | 29 | # These files are binary and should be left untouched 30 | # (binary is a macro for -text -diff) 31 | *.class binary 32 | *.dll binary 33 | *.ear binary 34 | *.gif binary 35 | *.ico binary 36 | *.jar binary 37 | *.jpg binary 38 | *.jpeg binary 39 | *.png binary 40 | *.so binary 41 | *.war binary 42 | *original binary 43 | -------------------------------------------------------------------------------- /.idea/runConfigurations/await.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/build_debug.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | -------------------------------------------------------------------------------- /.idea/runConfigurations/bundle_install_core.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/develop.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/environment_await.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/environment_dev.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/environment_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/environment_reload.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/environment_restart.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/environment_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_await.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_debug_author.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_debug_publish.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_groovy_eval.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_provision.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_restart.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_satisfy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_status.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_tail.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/instance_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/package_compose_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/package_config_ui_apps.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/package_deploy_assembly_full.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/package_deploy_migration.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/package_sync_ui_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/restart.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/setup.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/tasks.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/test_functional_open_gui.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/test_functional_run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/test_integration_run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/test_performance_run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/runConfigurations/up.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 16 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/aem/all/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.cognifide.aem.package") 3 | id("maven-publish") 4 | } 5 | 6 | apply(from = rootProject.file("app/common.gradle.kts")) 7 | apply(from = rootProject.file("app/aem/common.gradle.kts")) 8 | 9 | description = "Example - AEM All-In-One Package" 10 | 11 | aem { 12 | tasks { 13 | packageCompose { 14 | nestPackageProject(":app:aem:ui.apps") 15 | nestPackageProject(":app:aem:ui.content") 16 | } 17 | } 18 | } 19 | 20 | publishing { 21 | publications { 22 | create("maven") { 23 | artifact(common.publicationArtifact(tasks.packageCompose)) 24 | } 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /app/aem/common/package/defaults/META-INF/vault/definition/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/common/package/defaults/META-INF/vault/definition/thumbnail.png -------------------------------------------------------------------------------- /app/aem/common/package/validator/OAKPAL_OPEAR/plan.json: -------------------------------------------------------------------------------- 1 | { 2 | "checklists": [ 3 | "net.adamcin.oakpal.core/basic", 4 | "acs-commons-integrators", 5 | "content-class-aem65" 6 | ], 7 | "installHookPolicy": "SKIP", 8 | "checks": [ 9 | { 10 | "name": "basic/subpackages", 11 | "config": { 12 | "denyAll": false 13 | } 14 | }, 15 | { 16 | "name": "basic/acHandling", 17 | "config": { 18 | "levelSet": "no_unsafe" 19 | } 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /app/aem/core/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.cognifide.aem.bundle") 3 | id("maven-publish") 4 | } 5 | 6 | apply(from = rootProject.file("app/common.gradle.kts")) 7 | apply(from = rootProject.file("app/aem/common.gradle.kts")) 8 | 9 | description = "Example - Core" 10 | 11 | dependencies { 12 | testImplementation("uk.org.lidalia:slf4j-test:1.0.1") 13 | testImplementation("org.junit.jupiter:junit-jupiter:5.4.1") 14 | testImplementation("org.mockito:mockito-core:2.25.1") 15 | testImplementation("org.mockito:mockito-junit-jupiter:2.25.1") 16 | testImplementation("junit-addons:junit-addons:1.4") 17 | } 18 | 19 | publishing { 20 | publications { 21 | create("maven") { 22 | from(components["java"]) 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/aem/core/src/main/java/com/company/example/core/filters/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | @Version("1.0") 17 | package com.company.example.core.filters; 18 | 19 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /app/aem/core/src/main/java/com/company/example/core/listeners/SimpleResourceListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.company.example.core.listeners; 17 | 18 | import org.apache.sling.api.SlingConstants; 19 | import org.osgi.service.component.annotations.Component; 20 | import org.osgi.service.component.propertytypes.ServiceDescription; 21 | import org.osgi.service.event.Event; 22 | import org.osgi.service.event.EventConstants; 23 | import org.osgi.service.event.EventHandler; 24 | import org.slf4j.Logger; 25 | import org.slf4j.LoggerFactory; 26 | 27 | /** 28 | * A service to demonstrate how changes in the resource tree 29 | * can be listened for. It registers an event handler service. 30 | * The component is activated immediately after the bundle is 31 | * started through the immediate flag. 32 | * Please note, that apart from EventHandler services, 33 | * the immediate flag should not be set on a service. 34 | */ 35 | @Component(service = EventHandler.class, 36 | immediate = true, 37 | property = { 38 | EventConstants.EVENT_TOPIC + "=org/apache/sling/api/resource/Resource/*" 39 | }) 40 | @ServiceDescription("Demo to listen on changes in the resource tree") 41 | public class SimpleResourceListener implements EventHandler { 42 | 43 | private final Logger logger = LoggerFactory.getLogger(getClass()); 44 | 45 | public void handleEvent(final Event event) { 46 | logger.debug("Resource event: {} at: {}", event.getTopic(), event.getProperty(SlingConstants.PROPERTY_PATH)); 47 | } 48 | } 49 | 50 | -------------------------------------------------------------------------------- /app/aem/core/src/main/java/com/company/example/core/listeners/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | @Version("1.0") 17 | package com.company.example.core.listeners; 18 | 19 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /app/aem/core/src/main/java/com/company/example/core/models/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | @Version("1.0") 17 | package com.company.example.core.models; 18 | 19 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /app/aem/core/src/main/java/com/company/example/core/schedulers/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | @Version("1.0") 17 | package com.company.example.core.schedulers; 18 | 19 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /app/aem/core/src/main/java/com/company/example/core/servlets/package-info.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | @Version("1.0") 17 | package com.company.example.core.servlets; 18 | 19 | import org.osgi.annotation.versioning.Version; -------------------------------------------------------------------------------- /app/aem/core/src/test/java/com/company/example/core/listeners/SimpleResourceListenerTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.company.example.core.listeners; 17 | 18 | import java.util.Collections; 19 | import java.util.List; 20 | 21 | import org.apache.sling.api.SlingConstants; 22 | import org.junit.jupiter.api.Test; 23 | import org.osgi.service.event.Event; 24 | 25 | import uk.org.lidalia.slf4jext.Level; 26 | import uk.org.lidalia.slf4jtest.LoggingEvent; 27 | import uk.org.lidalia.slf4jtest.TestLogger; 28 | import uk.org.lidalia.slf4jtest.TestLoggerFactory; 29 | 30 | import static org.junit.jupiter.api.Assertions.assertAll; 31 | import static org.junit.jupiter.api.Assertions.assertEquals; 32 | 33 | class SimpleResourceListenerTest { 34 | 35 | private SimpleResourceListener fixture = new SimpleResourceListener(); 36 | 37 | private TestLogger logger = TestLoggerFactory.getTestLogger(fixture.getClass()); 38 | 39 | @Test 40 | void handleEvent() { 41 | Event resourceEvent = new Event("event/topic", Collections.singletonMap(SlingConstants.PROPERTY_PATH, "/content/test")); 42 | 43 | fixture.handleEvent(resourceEvent); 44 | 45 | List events = logger.getLoggingEvents(); 46 | assertEquals(1, events.size()); 47 | LoggingEvent event = events.get(0); 48 | 49 | assertAll( 50 | () -> assertEquals(Level.DEBUG, event.getLevel()), 51 | () -> assertEquals(2, event.getArguments().size()), 52 | () -> assertEquals("event/topic", event.getArguments().get(0)), 53 | () -> assertEquals("/content/test", event.getArguments().get(1)) 54 | ); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/aem/core/src/test/java/com/company/example/core/servlets/SimpleServletTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.company.example.core.servlets; 17 | 18 | import java.io.IOException; 19 | 20 | import javax.servlet.ServletException; 21 | 22 | import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest; 23 | import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse; 24 | import org.junit.jupiter.api.Test; 25 | import org.junit.jupiter.api.extension.ExtendWith; 26 | 27 | import io.wcm.testing.mock.aem.junit5.AemContext; 28 | import io.wcm.testing.mock.aem.junit5.AemContextExtension; 29 | 30 | import static org.junit.jupiter.api.Assertions.assertEquals; 31 | 32 | @ExtendWith(AemContextExtension.class) 33 | class SimpleServletTest { 34 | 35 | private SimpleServlet fixture = new SimpleServlet(); 36 | 37 | @Test 38 | void doGet(AemContext context) throws ServletException, IOException { 39 | context.build().resource("/content/test", "jcr:title", "resource title").commit(); 40 | context.currentResource("/content/test"); 41 | 42 | MockSlingHttpServletRequest request = context.request(); 43 | MockSlingHttpServletResponse response = context.response(); 44 | 45 | fixture.doGet(request, response); 46 | 47 | assertEquals("Title = resource title", response.getOutputAsString()); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/aem/dispatcher/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("base") 3 | } 4 | 5 | apply(from = rootProject.file("app/common.gradle.kts")) 6 | apply(from = rootProject.file("app/aem/common.gradle.kts")) 7 | 8 | tasks { 9 | register("zip") { 10 | from("src") 11 | } 12 | named("build") { 13 | dependsOn("zip") 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.d/enabled_vhosts/README: -------------------------------------------------------------------------------- 1 | # 2 | # Enabled virtual hosts will be symlinked here. Their names should match the pattern '*.vhost' 3 | # 4 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.d/rewrites/default_rewrite.rules: -------------------------------------------------------------------------------- 1 | # 2 | # These are the default rewrite rules. 3 | # 4 | # DO NOT EDIT this file, your changes will have no impact on your deployment. 5 | # 6 | # Instead modify your rewrite.rules file 7 | # 8 | 9 | # Examples: 10 | # This ruleset would look for robots.txt and fetch it from the dam only if the domain is exampleco-dev.adobecqms.net 11 | # RewriteCond %{SERVER_NAME} exampleco-dev.adobecqms.net [NC] 12 | # RewriteRule ^/robots.txt$ /content/dam/exampleco/robots.txt [NC,PT] 13 | # This ruleset would look for favicon.ico in exampleco's base dam folder if the domain is exampleco-brand1-dev.adobecqms.net 14 | # RewriteCond %{SERVER_NAME} exampleco-brand1-dev.adobecqms.net [NC] 15 | # RewriteRule ^/favicon.ico$ /content/dam/exampleco/favicon.ico [NC,PT] 16 | # This ruleset would look for sitemap.xml and point it at the re-usable file in exampleco's general folder of their site pages 17 | # RewriteCond %{SERVER_NAME} exampleco-brand2-dev.adobecqms.net [NC] 18 | # RewriteRule ^/sitemap.xml$ /content/exampleco/general/sitemap.xml [NC,PT] 19 | # This ruleset would look for logo.jpg on all sites and source it from exampleco's general folder 20 | # RewriteRule ^/logo.jpg$ /content/dam/exampleco/general/logo.jpg [NC,PT] 21 | # This ruleset is a vanity url that exampleco's contactus site that doesn't exist on our environment 22 | # RewriteRule ^/contactus https://corp.exampleco.com/contactus.html [NC,R=301] 23 | 24 | # Prevent X-FORWARDED-FOR spoofing 25 | RewriteCond %{HTTP:X-Forwarded-For} !^$ 26 | RewriteCond %{HTTP:X-Forwarded-For} !^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 27 | RewriteRule .* - [F] 28 | 29 | # Uncomment to force HSTS protection 30 | # Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;" 31 | 32 | # Block wordpress DDOS Attempts 33 | RewriteRule ^.*xmlrpc.php - [F] 34 | RewriteCond %{HTTP_USER_AGENT} ^.*wordpress [NC] 35 | RewriteRule .* - [F] 36 | 37 | # Block wp-login 38 | RewriteRule ^.*wp-login - [F,NC,L] 39 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.d/rewrites/rewrite.rules: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains the rewrite rules, and can be customized. 3 | # 4 | # By default, it includes just the rewrite rules. You can 5 | # add rewrite rules to this file but you should still include 6 | # the default rewrite rules. 7 | 8 | Include conf.d/rewrites/default_rewrite.rules 9 | 10 | # rewrite for root redirect 11 | RewriteRule ^/?$ /content/${CONTENT_FOLDER_NAME}/us/en.html [PT,L] 12 | 13 | RewriteCond %{REQUEST_URI} !^/apps 14 | RewriteCond %{REQUEST_URI} !^/bin 15 | RewriteCond %{REQUEST_URI} !^/content 16 | RewriteCond %{REQUEST_URI} !^/etc 17 | RewriteCond %{REQUEST_URI} !^/home 18 | RewriteCond %{REQUEST_URI} !^/libs 19 | RewriteCond %{REQUEST_URI} !^/saml_login 20 | RewriteCond %{REQUEST_URI} !^/system 21 | RewriteCond %{REQUEST_URI} !^/tmp 22 | RewriteCond %{REQUEST_URI} !^/var 23 | RewriteCond %{REQUEST_URI} (.html|.jpe?g|.png|.svg)$ 24 | RewriteRule ^/(.*)$ /content/${CONTENT_FOLDER_NAME}/$1 [PT,L] 25 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.d/variables/custom.vars: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains the variables defined within a virtual host definition 3 | # 4 | # By default, it is empty and does not define any variable 5 | # 6 | Define CONTENT_FOLDER_NAME example -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.d/variables/global.vars: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains the variables defined for all virtual hosts 3 | # 4 | 5 | # Log level for the dispatcher 6 | # 7 | # Possible values are: Error, Warn, Info, Debug and Trace1 8 | # Default value: Warn 9 | # 10 | # Define DISP_LOG_LEVEL Warn 11 | 12 | # Log level for mod_rewrite 13 | # 14 | # Possible values are: Error, Warn, Info, Debug and Trace1 - Trace8 15 | # Default value: Warn 16 | # 17 | # To debug your RewriteRules, it is recommended to raise your log 18 | # level to Trace2. 19 | # 20 | # More information can be found at: 21 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#logging 22 | # 23 | # Define REWRITE_LOG_LEVEL Warn 24 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/cache/default_invalidate.any: -------------------------------------------------------------------------------- 1 | # 2 | # This is the default list of hosts that are allowed to invalidate (flush) the cache 3 | # on the dispatcher. 4 | # 5 | # DO NOT EDIT this file, your changes will have no impact on your deployment. 6 | # 7 | 8 | # Contains the AEM backend that is allowed to invalidate the cache on the dispatcher 9 | /0001 { 10 | /type "deny" 11 | /glob "*.*.*.*" 12 | } 13 | /0002 { 14 | /type "allow" 15 | /glob "${AEM_IP}" 16 | } 17 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/cache/default_rules.any: -------------------------------------------------------------------------------- 1 | # 2 | # These are the default cache rules. 3 | # 4 | # DO NOT EDIT this file, your changes will have no impact on your deployment. 5 | # 6 | # Instead modify rules.any. 7 | # 8 | 9 | # Put entries of items you do or don't want to cache in apaches doc root 10 | # the globbing pattern to be compared against the url 11 | # example: * -> everything 12 | # : /foo/bar.* -> only the /foo/bar documents 13 | # : /foo/bar/* -> all pages below /foo/bar 14 | # : /foo/bar[./]* -> all pages below and /foo/bar itself 15 | # : *.html -> all .html files 16 | # Default allow all items to cache 17 | /0000 { 18 | /glob "*" 19 | /type "allow" 20 | } 21 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/cache/rules.any: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains the cache rules, and can be customized. 3 | # 4 | # By default, it includes the default rules. 5 | # 6 | 7 | $include "./default_rules.any" 8 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/clientheaders/clientheaders.any: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains the request headers, and can be customized. 3 | # 4 | # By default, it includes the default client headers. 5 | # 6 | 7 | $include "./default_clientheaders.any" 8 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/clientheaders/default_clientheaders.any: -------------------------------------------------------------------------------- 1 | # 2 | # This is the default list of request headers to forward to AEM. 3 | # 4 | # DO NOT EDIT this file, your changes will have no impact on your deployment. 5 | # 6 | # Instead modify clientheaders.any. 7 | # 8 | 9 | "X-Forwarded-Proto" 10 | "X-Forwarded-SSL-Certificate" 11 | "X-Forwarded-SSL-Client-Cert" 12 | "X-Forwarded-SSL" 13 | "X-Forwarded-Protocol" 14 | "CSRF-Token" 15 | "referer" 16 | "user-agent" 17 | "from" 18 | "content-type" 19 | "content-length" 20 | "accept-charset" 21 | "accept-encoding" 22 | "accept-language" 23 | "accept" 24 | "host" 25 | "if-match" 26 | "if-none-match" 27 | "if-range" 28 | "if-unmodified-since" 29 | "max-forwards" 30 | "range" 31 | "cookie" 32 | "depth" 33 | "translate" 34 | "expires" 35 | "date" 36 | "if" 37 | "lock-token" 38 | "x-expected-entity-length" 39 | "destination" 40 | "Sling-uploadmode" 41 | "x-requested-with" 42 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/dispatcher.any: -------------------------------------------------------------------------------- 1 | # 2 | # This is a file provided by the runtime environment and only included for 3 | # illustration purposes. 4 | # 5 | # DO NOT EDIT this file, your changes will have no impact on your deployment. 6 | # 7 | 8 | /farms { 9 | # Include all *.farm files in enabled_farms 10 | $include "enabled_farms/*.farm" 11 | } 12 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/enabled_farms/README: -------------------------------------------------------------------------------- 1 | # 2 | # Enabled farms will be symlinked here. Their names should match the pattern '*.farm' 3 | # 4 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/filters/filters.any: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains the filter ACL, and can be customized. 3 | # 4 | # By default, it includes the default filter ACL. 5 | # 6 | 7 | $include "./default_filters.any" 8 | 9 | # Allow components JSON model 10 | /0101 { /type "allow" /extension "json" /selectors "model" /path "/content/*" } 11 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/renders/default_renders.any: -------------------------------------------------------------------------------- 1 | # 2 | # This is the default list of backends that the dispatcher contacts. 3 | # 4 | # DO NOT EDIT this file, your changes will have no impact on your deployment. 5 | # 6 | 7 | /0 { 8 | /hostname "${AEM_HOST}" 9 | /port "${AEM_PORT}" 10 | /timeout "10000" 11 | } 12 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/virtualhosts/default_virtualhosts.any: -------------------------------------------------------------------------------- 1 | # 2 | # This is the default list of virtual hosts (or domain names) that the dispatcher 3 | # will handle. 4 | # 5 | # DO NOT EDIT this file, your changes will have no impact on your deployment. 6 | # 7 | # Instead modify virtualhosts.any. 8 | # 9 | 10 | "*" 11 | -------------------------------------------------------------------------------- /app/aem/dispatcher/src/conf.dispatcher.d/virtualhosts/virtualhosts.any: -------------------------------------------------------------------------------- 1 | # 2 | # This file contains the list of virtual hosts (or domain names) that the dispatcher 3 | # will handle. 4 | # 5 | # By default, it includes the default list of virtual hosts. 6 | # 7 | 8 | $include "./default_virtualhosts.any" 9 | -------------------------------------------------------------------------------- /app/aem/migration/README.MD: -------------------------------------------------------------------------------- 1 | # AEM Migration Module 2 | 3 | ## Description 4 | 5 | * Automated Groovy Script execution on AEM instances after CRX package deployment 6 | * on script change (default mode) 7 | * always (if file name ends with *.always.groovy) 8 | * with fallbacks (secondary file names ending with *.fallback.groovy) 9 | 10 | The main requirement of using this automated migrartion script execution is to have pre-installed on AEM instances [AEM Easy Content Upgrade Package](https://github.com/valtech/aem-easy-content-upgrade) (e.g by `instanceSatisfy` task, it is bundling also [Groovy Console](https://github.com/icfnext/aem-groovy-console)). 11 | Secondary requirement is to have specified Vault hook in CRX package (it is already configured in this module). 12 | 13 | Using AECU eliminates a need for manual script execution via [Groovy Console](https://github.com/icfnext/aem-groovy-console) or a need for implementing custom automation. What is also worth to indicate is that this kind of automation works on any environment (even local/dev) and is mostly covered by AEM itself (the trigger is just CRX package installation). 14 | -------------------------------------------------------------------------------- /app/aem/migration/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.cognifide.aem.package") 3 | } 4 | 5 | apply(from = rootProject.file("app/common.gradle.kts")) 6 | apply(from = rootProject.file("app/aem/common.gradle.kts")) 7 | 8 | description = "Example - AEM Migration" 9 | 10 | aem { 11 | tasks { 12 | packageCompose { 13 | mustRunAfter( 14 | ":app:aem:all:packageCompose", 15 | ":app:aem:ui.apps:packageCompose", 16 | ":app:aem:ui.content:packageCompose" 17 | ) 18 | vaultDefinition { 19 | property("installhook.aecu.class", "de.valtech.aecu.core.installhook.AecuInstallHook") 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/aem/migration/src/main/content/META-INF/vault/filter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/aem/migration/src/main/content/jcr_root/var/groovyconsole/scripts/aecu/example/migrate.groovy: -------------------------------------------------------------------------------- 1 | /** 2 | * Purpose of this script is to demonstrate some script being run by AEM Groovy Console. 3 | */ 4 | 5 | // =====[ Configuration ]===== 6 | 7 | DRY_RUN = true // TODO 'false' (to automatically applied changes) 8 | CONTENT_PATHS = ["/content/example", "/content/example-demo"] 9 | MIGRATED_DATE = Calendar.getInstance() 10 | 11 | // =====[ Definition ]===== 12 | 13 | def debug(message) { 14 | println message 15 | log.info(message) 16 | } 17 | 18 | def migratePages(def rootPath) { 19 | def sql = "SELECT * FROM [cq:PageContent] AS s WHERE ISDESCENDANTNODE([$rootPath])" 20 | for (def contentResource : resourceResolver.findResources(sql, "JCR-SQL2")) { 21 | def pagePath = contentResource.parent.path 22 | def props = contentResource.adaptTo(ModifiableValueMap.class) 23 | 24 | if (props["migrated"] == null) { 25 | debug "Migrating page: $pagePath" 26 | props["migrated"] = MIGRATED_DATE 27 | } else { 28 | debug "Not migrating page: $pagePath" 29 | } 30 | } 31 | } 32 | 33 | // =====[ Execution ]===== 34 | 35 | for (def contentPath : CONTENT_PATHS) { 36 | migratePages(contentPath) 37 | } 38 | 39 | if (!DRY_RUN) { 40 | resourceResolver.commit() 41 | } 42 | -------------------------------------------------------------------------------- /app/aem/ui.apps/.gitignore: -------------------------------------------------------------------------------- 1 | src/main/content/jcr_root/apps/example/clientlibs/clientlib-site 2 | src/main/content/jcr_root/apps/example/clientlibs/clientlib-dependencies 3 | -------------------------------------------------------------------------------- /app/aem/ui.apps/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.cognifide.htl") 3 | id("com.cognifide.aem.package") 4 | id("com.cognifide.aem.package.sync") 5 | } 6 | 7 | apply(from = rootProject.file("app/common.gradle.kts")) 8 | apply(from = rootProject.file("app/aem/common.gradle.kts")) 9 | 10 | description = "Example - UI Apps" 11 | 12 | aem { 13 | tasks { 14 | packageCompose { 15 | dependsOn(":app:aem:ui.frontend:webpack") 16 | installBundleProject(":app:aem:core") 17 | vaultDefinition { 18 | property("installhook.actool.class", "biz.netcentric.cq.tools.actool.installhook.AcToolInstallHook") 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/META-INF/vault/filter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/clientlibs/clientlib-base/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/clientlibs/clientlib-base/css.txt: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Copyright 2017 Adobe Systems Incorporated 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | ############################################################################### -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/clientlibs/clientlib-base/js.txt: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Copyright 2017 Adobe Systems Incorporated 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | ############################################################################### -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/clientlibs/clientlib-grid/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/clientlibs/clientlib-grid/css.txt: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Copyright 2018 Adobe Systems Incorporated 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | ############################################################################### 16 | 17 | less/grid.less -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/clientlibs/clientlib-grid/less/grid.less: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | @import (once) "/libs/wcm/foundation/clientlibs/grid/grid_base.less"; 18 | 19 | /* maximum amount of grid cells to be provided */ 20 | @max_col: 12; 21 | 22 | /* default breakpoint */ 23 | .aem-Grid { 24 | .generate-grid(default, @max_col); 25 | } 26 | 27 | /* phone breakpoint */ 28 | @media (max-width: 650px) { 29 | .aem-Grid { 30 | .generate-grid(phone, @max_col); 31 | } 32 | } 33 | 34 | /* tablet breakpoint */ 35 | @media (min-width: 651px) and (max-width: 1200px) { 36 | .aem-Grid { 37 | .generate-grid(tablet, @max_col); 38 | } 39 | } -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/accordion/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/accordion/_cq_editConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/accordion/_cq_template/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/breadcrumb/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/button/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/carousel/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/carousel/_cq_editConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/container/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/contentfragment/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/contentfragment/_cq_editConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 14 | 22 | 23 | 24 | 29 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/contentfragmentlist/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/download/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/embed/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/experiencefragment/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/experiencefragment/_cq_editConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 15 | 16 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/form/button/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/form/container/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/form/container/new/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/form/hidden/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/form/options/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/form/text/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/helloworld/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/helloworld/_cq_dialog/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 13 | 14 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/helloworld/helloworld.html: -------------------------------------------------------------------------------- 1 | 16 |
17 |

Hello World Component

18 |
19 |

Text property:

20 |
${properties.text}
21 |
22 |
23 |

Model message:

24 |
${model.message}
25 |
26 |
27 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/image/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/languagenavigation/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/list/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/list/_cq_editConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/navigation/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/page/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/page/customfooterlibs.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/page/customheaderlibs.html: -------------------------------------------------------------------------------- 1 | 16 | 18 | 19 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/search/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/separator/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/sharing/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/spa/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/tabs/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/tabs/_cq_editConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/tabs/_cq_template/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/teaser/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/text/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/title/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/xfpage/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/xfpage/content.html: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/xfpage/customfooterlibs.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/components/xfpage/customheaderlibs.html: -------------------------------------------------------------------------------- 1 | 16 | 17 | 19 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/config.author/com.day.cq.wcm.mobile.core.impl.MobileEmulatorProvider-example.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/config.prod/org.apache.sling.commons.log.LogManager.factory.config-example.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/config.publish/org.apache.sling.jcr.resource.internal.JcrResourceResolverFactoryImpl.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/config.stage/org.apache.sling.commons.log.LogManager.factory.config-example.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/config/org.apache.sling.commons.log.LogManager.factory.config-example.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/i18n/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/i18n/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "&copy; {0} Example Site. All rights reserved." : "&copy; {0} Example Site. Tous droits réservés." 3 | } -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/i18n/fr.json.dir/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 8 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/templates/page-content/.content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 14 | 17 | <topnav 18 | jcr:primaryType="nt:unstructured" 19 | sling:resourceType="example/components/topnav"/> 20 | <par 21 | jcr:primaryType="nt:unstructured" 22 | sling:resourceType="wcm/foundation/components/parsys"> 23 | <text 24 | jcr:primaryType="nt:unstructured" 25 | sling:resourceType="example/components/text" 26 | text="<p>This is a content page</p>" 27 | textIsRich="true"/> 28 | </par> 29 | </jcr:content> 30 | </jcr:root> 31 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/templates/page-home/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:description="Template for initial or main page of the site." 4 | jcr:primaryType="cq:Template" 5 | jcr:title="Example Home Page" 6 | allowedPaths="[/content/example]" 7 | ranking="{Long}100"> 8 | <jcr:content 9 | jcr:primaryType="cq:PageContent" 10 | sling:resourceType="example/components/page"> 11 | <logo 12 | jcr:primaryType="nt:unstructured" 13 | sling:resourceType="example/components/logo"/> 14 | <title 15 | jcr:primaryType="nt:unstructured" 16 | sling:resourceType="example/components/title"/> 17 | <topnav 18 | jcr:primaryType="nt:unstructured" 19 | sling:resourceType="example/components/topnav"/> 20 | <par 21 | jcr:primaryType="nt:unstructured" 22 | sling:resourceType="wcm/foundation/components/parsys"> 23 | <text 24 | jcr:primaryType="nt:unstructured" 25 | sling:resourceType="example/components/text" 26 | text="<p>This is a home page</p>" 27 | textIsRich="true"/> 28 | </par> 29 | </jcr:content> 30 | </jcr:root> 31 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/tests/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:ClientLibraryFolder" 4 | categories="[cq.authoring.editor.hook.tests]" 5 | dependencies="[cq.authoring.editor]"/> 6 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/tests/SampleTests.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2015 Adobe Systems Incorporated 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | new hobs.TestSuite("Example Tests", {path:"/apps/example/tests/SampleTests.js", register: true}) 17 | 18 | .addTestCase(new hobs.TestCase("Hello World component on english page") 19 | .navigateTo("/content/example/en.html") 20 | .asserts.location("/content/example/en.html", true) 21 | .asserts.visible(".helloworld", true) 22 | ) 23 | 24 | .addTestCase(new hobs.TestCase("Hello World component on french page") 25 | .navigateTo("/content/example/fr.html") 26 | .asserts.location("/content/example/fr.html", true) 27 | .asserts.visible(".helloworld", true) 28 | ); 29 | -------------------------------------------------------------------------------- /app/aem/ui.apps/src/main/content/jcr_root/apps/example/tests/js.txt: -------------------------------------------------------------------------------- 1 | SampleTests.js -------------------------------------------------------------------------------- /app/aem/ui.content/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.cognifide.aem.package") 3 | id("com.cognifide.aem.package.sync") 4 | } 5 | 6 | apply(from = rootProject.file("app/common.gradle.kts")) 7 | apply(from = rootProject.file("app/aem/common.gradle.kts")) 8 | 9 | description = "Example - UI Content" 10 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/META-INF/vault/filter.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <workspaceFilter version="1.0"> 3 | <filter root="/conf/example" mode="merge"/> 4 | <filter root="/content/example" mode="merge"/> 5 | <filter root="/content/dam/example" mode="merge"/> 6 | <filter root="/content/experience-fragments/example" mode="merge"/> 7 | </workspaceFilter> 8 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="sling:Folder" 4 | jcr:title="Example"/> 5 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="sling:Folder"/> 4 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <templates/> 5 | <policies/> 6 | <segments/> 7 | <template-types/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/policies/_rep_policy.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:crx="http://www.day.com/crx/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" 3 | jcr:primaryType="rep:ACL"> 4 | <allow 5 | jcr:primaryType="rep:GrantACE" 6 | rep:principalName="everyone" 7 | rep:privileges="{Name}[jcr:read]"/> 8 | <allow1 9 | jcr:primaryType="rep:GrantACE" 10 | rep:principalName="content-authors" 11 | rep:privileges="{Name}[crx:replicate]"/> 12 | <allow2 13 | jcr:primaryType="rep:GrantACE" 14 | rep:principalName="template-authors" 15 | rep:privileges="{Name}[jcr:versionManagement,rep:write,crx:replicate,jcr:lockManagement]"/> 16 | <allow3 17 | jcr:primaryType="rep:GrantACE" 18 | rep:principalName="version-manager-service" 19 | rep:privileges="{Name}[jcr:versionManagement,rep:write]"/> 20 | </jcr:root> 21 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/segments/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | jcr:primaryType="cq:PageContent" 6 | sling:resourceType="cq/contexthub/components/segments-listing-page"/> 7 | <winter/> 8 | <summer/> 9 | </jcr:root> 10 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" 3 | jcr:mixinTypes="[rep:AccessControllable]" 4 | jcr:primaryType="cq:Page"> 5 | <xf/> 6 | <rep:policy/> 7 | <page/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/_rep_policy.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" 3 | jcr:primaryType="rep:ACL"> 4 | <allow 5 | jcr:primaryType="rep:GrantACE" 6 | rep:principalName="template-authors" 7 | rep:privileges="{Name}[jcr:read]"/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Template"> 4 | <jcr:content 5 | jcr:description="Generic template for empty pages of My Site" 6 | jcr:primaryType="cq:PageContent" 7 | jcr:title="Page"/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/initial/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:template="/conf/example/settings/wcm/templates/page-content" 6 | jcr:primaryType="cq:PageContent" 7 | sling:resourceType="example/components/page"> 8 | <root 9 | jcr:primaryType="nt:unstructured" 10 | sling:resourceType="example/components/container"> 11 | <container 12 | jcr:primaryType="nt:unstructured" 13 | sling:resourceType="example/components/container" 14 | layout="responsiveGrid"/> 15 | </root> 16 | </jcr:content> 17 | </jcr:root> 18 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/policies/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:policy="example/components/page/policy" 6 | jcr:primaryType="nt:unstructured" 7 | sling:resourceType="wcm/core/components/policies/mappings"> 8 | <root 9 | cq:policy="example/components/container/policy_1574694950110" 10 | jcr:primaryType="nt:unstructured" 11 | sling:resourceType="wcm/core/components/policies/mapping"> 12 | <container 13 | cq:policy="example/components/container/policy_1574695586800" 14 | jcr:primaryType="nt:unstructured" 15 | sling:resourceType="wcm/core/components/policies/mapping"/> 16 | </root> 17 | </jcr:content> 18 | </jcr:root> 19 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/structure/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:deviceGroups="[/etc/mobile/groups/responsive]" 6 | cq:template="/conf/example/settings/wcm/templates/page-content" 7 | jcr:primaryType="cq:PageContent" 8 | sling:resourceType="example/components/page"> 9 | <root 10 | jcr:primaryType="nt:unstructured" 11 | sling:resourceType="example/components/container"> 12 | <container 13 | jcr:primaryType="nt:unstructured" 14 | sling:resourceType="example/components/container" 15 | editable="{Boolean}true" 16 | layout="responsiveGrid"/> 17 | </root> 18 | <cq:responsive jcr:primaryType="nt:unstructured"> 19 | <breakpoints jcr:primaryType="nt:unstructured"> 20 | <phone 21 | jcr:primaryType="nt:unstructured" 22 | title="Smaller Screen" 23 | width="{Long}768"/> 24 | <tablet 25 | jcr:primaryType="nt:unstructured" 26 | title="Tablet" 27 | width="{Long}1200"/> 28 | </breakpoints> 29 | </cq:responsive> 30 | </jcr:content> 31 | </jcr:root> 32 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:dam="http://www.day.com/dam/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:mixinTypes="[dam:Thumbnails]" 6 | jcr:primaryType="nt:resource"/> 7 | </jcr:root> 8 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_300.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_319.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/page/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_48.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/xf/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" 3 | jcr:mixinTypes="[mix:lockable]" 4 | jcr:primaryType="cq:Template"> 5 | <jcr:content 6 | jcr:description="Generic template for empty experience fragments variations of My Site" 7 | jcr:primaryType="cq:PageContent" 8 | jcr:title="Experience Fragment"/> 9 | </jcr:root> 10 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/xf/initial/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:tags="[experience-fragments:variation/web]" 6 | cq:template="/conf/example/settings/wcm/templates/empty-experience-fragment" 7 | cq:xfVariantType="web" 8 | jcr:primaryType="cq:PageContent" 9 | sling:resourceType="example/components/xfpage"> 10 | <root 11 | jcr:primaryType="nt:unstructured" 12 | sling:resourceType="example/components/container" 13 | layout="responsiveGrid"/> 14 | </jcr:content> 15 | </jcr:root> 16 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/xf/policies/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | jcr:primaryType="nt:unstructured" 6 | sling:resourceType="wcm/core/components/policies/mappings"> 7 | <root 8 | cq:policy="example/components/container/policy_1575040440977" 9 | jcr:primaryType="nt:unstructured" 10 | sling:resourceType="wcm/core/components/policies/mapping"/> 11 | </jcr:content> 12 | </jcr:root> 13 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/xf/structure/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:deviceGroups="[mobile/groups/responsive]" 6 | cq:template="/conf/example/settings/wcm/templates/empty-experience-fragment" 7 | jcr:primaryType="cq:PageContent" 8 | sling:resourceType="example/components/page"> 9 | <root 10 | jcr:primaryType="nt:unstructured" 11 | sling:resourceType="example/components/container" 12 | editable="{Boolean}true" 13 | layout="responsiveGrid"/> 14 | <cq:responsive jcr:primaryType="nt:unstructured"> 15 | <breakpoints jcr:primaryType="nt:unstructured"> 16 | <phone 17 | jcr:primaryType="nt:unstructured" 18 | title="Smaller Screen" 19 | width="{Long}768"/> 20 | <tablet 21 | jcr:primaryType="nt:unstructured" 22 | title="Tablet" 23 | width="{Long}1200"/> 24 | </breakpoints> 25 | </cq:responsive> 26 | </jcr:content> 27 | </jcr:root> 28 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/xf/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/template-types/xf/thumbnail.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:rep="internal" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:mixinTypes="[rep:AccessControllable]" 4 | jcr:primaryType="cq:Page"> 5 | <page-content/> 6 | <xf-web-variation/> 7 | <rep:policy/> 8 | </jcr:root> -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/_rep_policy.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:crx="http://www.day.com/crx/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" 3 | jcr:primaryType="rep:ACL"> 4 | <allow 5 | jcr:primaryType="rep:GrantACE" 6 | rep:principalName="everyone" 7 | rep:privileges="{Name}[jcr:read]"/> 8 | <allow1 9 | jcr:primaryType="rep:GrantACE" 10 | rep:principalName="content-authors" 11 | rep:privileges="{Name}[crx:replicate]"/> 12 | <allow2 13 | jcr:primaryType="rep:GrantACE" 14 | rep:principalName="template-authors" 15 | rep:privileges="{Name}[jcr:versionManagement,rep:write,crx:replicate,jcr:lockManagement]"/> 16 | <allow3 17 | jcr:primaryType="rep:GrantACE" 18 | rep:principalName="version-manager-service" 19 | rep:privileges="{Name}[jcr:versionManagement,rep:write]"/> 20 | </jcr:root> 21 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Template"> 4 | <jcr:content 5 | cq:lastModified="{Date}2019-12-02T17:37:24.544+01:00" 6 | cq:lastModifiedBy="admin" 7 | cq:templateType="/conf/example/settings/wcm/template-types/page" 8 | jcr:description="My Site Page Template" 9 | jcr:primaryType="cq:PageContent" 10 | jcr:title="Content Page" 11 | status="enabled"/> 12 | </jcr:root> 13 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/initial/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:template="/conf/example/settings/wcm/templates/page-content" 6 | jcr:primaryType="cq:PageContent" 7 | sling:resourceType="example/components/page"> 8 | <root 9 | jcr:primaryType="nt:unstructured" 10 | sling:resourceType="example/components/container"> 11 | <container 12 | jcr:primaryType="nt:unstructured" 13 | sling:resourceType="example/components/container"> 14 | <title 15 | jcr:primaryType="nt:unstructured" 16 | sling:resourceType="example/components/title"/> 17 | <container 18 | jcr:primaryType="nt:unstructured" 19 | sling:resourceType="example/components/container" 20 | layout="responsiveGrid"/> 21 | </container> 22 | </root> 23 | </jcr:content> 24 | </jcr:root> 25 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:dam="http://www.day.com/dam/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:mixinTypes="[dam:Thumbnails]" 6 | jcr:primaryType="nt:resource"/> 7 | </jcr:root> 8 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_300.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_319.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/page-content/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_48.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Template"> 4 | <jcr:content 5 | cq:templateType="/conf/example/settings/wcm/template-types/xf" 6 | jcr:description="My Site Experience Fragment Template" 7 | jcr:primaryType="cq:PageContent" 8 | jcr:title="Web Variation" 9 | status="enabled"/> 10 | </jcr:root> 11 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/initial/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:tags="[experience-fragments:variation/web]" 6 | cq:template="/conf/example/settings/wcm/templates/xf-web-variation" 7 | cq:xfVariantType="web" 8 | jcr:primaryType="cq:PageContent" 9 | sling:resourceType="example/components/xfpage"> 10 | <root 11 | jcr:primaryType="nt:unstructured" 12 | sling:resourceType="example/components/container" 13 | layout="responsiveGrid"/> 14 | </jcr:content> 15 | </jcr:root> 16 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/policies/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:policy="example/components/page/policy" 6 | jcr:primaryType="nt:unstructured" 7 | sling:resourceType="wcm/core/components/policies/mappings"> 8 | <root 9 | cq:policy="example/components/container/policy_1575040440977" 10 | jcr:primaryType="nt:unstructured" 11 | sling:resourceType="wcm/core/components/policies/mapping"> 12 | <mysite jcr:primaryType="nt:unstructured"> 13 | <components jcr:primaryType="nt:unstructured"> 14 | <title 15 | cq:policy="example/components/title/policy_641528232375303" 16 | jcr:primaryType="nt:unstructured" 17 | sling:resourceType="wcm/core/components/policies/mapping"/> 18 | <text 19 | cq:policy="example/components/text/policy_641562756958017" 20 | jcr:primaryType="nt:unstructured" 21 | sling:resourceType="wcm/core/components/policies/mapping"/> 22 | <teaser 23 | cq:policy="example/components/teaser/policy_1575031387650" 24 | jcr:primaryType="nt:unstructured" 25 | sling:resourceType="wcm/core/components/policies/mapping"/> 26 | <download 27 | cq:policy="example/components/download/policy_1575032193319" 28 | jcr:primaryType="nt:unstructured" 29 | sling:resourceType="wcm/core/components/policies/mapping"/> 30 | <image 31 | cq:policy="example/components/image/policy_651483963895698" 32 | jcr:primaryType="nt:unstructured" 33 | sling:resourceType="wcm/core/components/policies/mapping"/> 34 | </components> 35 | </mysite> 36 | </root> 37 | </jcr:content> 38 | </jcr:root> 39 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/structure/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:deviceGroups="[mobile/groups/responsive]" 6 | cq:template="/conf/example/settings/wcm/templates/xf-web-variation" 7 | jcr:primaryType="cq:PageContent" 8 | sling:resourceType="example/components/page"> 9 | <root 10 | jcr:primaryType="nt:unstructured" 11 | sling:resourceType="example/components/container" 12 | editable="{Boolean}true"/> 13 | <cq:responsive jcr:primaryType="nt:unstructured"> 14 | <breakpoints jcr:primaryType="nt:unstructured"> 15 | <phone 16 | jcr:primaryType="nt:unstructured" 17 | title="Smaller Screen" 18 | width="{Long}768"/> 19 | <tablet 20 | jcr:primaryType="nt:unstructured" 21 | title="Tablet" 22 | width="{Long}1200"/> 23 | </breakpoints> 24 | </cq:responsive> 25 | </jcr:content> 26 | </jcr:root> 27 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/thumbnail.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/thumbnail.png.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:dam="http://www.day.com/dam/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:mixinTypes="[dam:Thumbnails]" 6 | jcr:primaryType="nt:resource"/> 7 | </jcr:root> 8 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_128.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/conf/example/settings/wcm/templates/xf-web-variation/thumbnail.png.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_319.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:rep="internal" 3 | jcr:mixinTypes="[mix:lockable,rep:AccessControllable]" 4 | jcr:primaryType="sling:OrderedFolder"> 5 | <rep:policy/> 6 | <example/> 7 | </jcr:root> 8 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/example/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="sling:OrderedFolder"> 4 | <jcr:content 5 | cq:conf="/conf/example" 6 | jcr:primaryType="nt:unstructured" 7 | jcr:title="Example"> 8 | <folderThumbnail/> 9 | </jcr:content> 10 | <asset.jpg/> 11 | </jcr:root> 12 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.thumbnail.140.100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.thumbnail.140.100.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.thumbnail.319.319.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.thumbnail.319.319.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.thumbnail.48.48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.thumbnail.48.48.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.web.1280.1280.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/cq5dam.web.1280.1280.jpeg -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/original: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/original -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/dam/example/asset.jpg/_jcr_content/renditions/original.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:lastModifiedBy="admin" 6 | jcr:mimeType="image/jpeg" 7 | jcr:primaryType="nt:resource"/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/example/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:allowedTemplates="[/conf/example/settings/wcm/templates/(?!xf-).*]" 6 | cq:conf="/conf/example" 7 | cq:deviceGroups="[/etc/mobile/groups/responsive]" 8 | jcr:primaryType="cq:PageContent" 9 | jcr:title="Example" 10 | sling:redirect="{Boolean}true" 11 | sling:redirectStatus="{Long}302" 12 | sling:resourceType="foundation/components/redirect" 13 | redirectTarget="/content/example/us/en"> 14 | <image jcr:primaryType="nt:unstructured"> 15 | <file/> 16 | </image> 17 | </jcr:content> 18 | <us/> 19 | </jcr:root> -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/example/_jcr_content/image/file: -------------------------------------------------------------------------------- 1 | �PNG 2 |  3 | ��� 4 | IHDR��������� 5 | �{���7IDATx����j�`��a��.rT���5��G� !l'F��b_��sn���K~���|>������{=���"���@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@�G=�n�~��,�Rϸk�0l�i�g��`x�wx�y��<�eY�����u���$�!��j�ߋ������� �9 �ܩ]���$��`�0�� ����@@� ��`�0��!|���K=��v�z�� <==�n��t�'��q 6 | ����@@� ���4��p8�>�v��'��`X��x�'\���s=�#h�0�� ����@@� ��`�0�� ����@@� ���a%~/���� 7 | ��m=�3�� ��`�0������O��{O[����<p9���ǫ���g���_���eA@@� ��`�0�� ���J��d����~�jVP�����~��"G��`�0�� �OA�N�S=x ���� �q 8 | ����@@���0 ���廅? 0���i3�c=��㸙���7G��aDxE�8���wx 9 | ��}�6 �fY�x�}���/�ŷ�����_�#h�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� ��`�0�� ����@@� � 10 | �e��]�����IEND�B`� -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/example/_jcr_content/image/file.dir/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:dam="http://www.day.com/dam/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="nt:file"> 4 | <jcr:content 5 | jcr:lastModifiedBy="admin" 6 | jcr:mimeType="image/png" 7 | jcr:mixinTypes="[dam:Thumbnails]" 8 | jcr:primaryType="nt:resource"/> 9 | </jcr:root> 10 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/example/_jcr_content/image/file.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/content/example/_jcr_content/image/file.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_48.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/example/_jcr_content/image/file.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_480.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/app/aem/ui.content/src/main/content/jcr_root/content/example/_jcr_content/image/file.dir/_jcr_content/_dam_thumbnails/_dam_thumbnail_480.png -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/example/us/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:redirectTarget="/content/example/us/en" 6 | cq:template="/conf/example/settings/wcm/templates/page-content" 7 | jcr:primaryType="cq:PageContent" 8 | jcr:title="us" 9 | sling:resourceType="foundation/components/redirect"/> 10 | <en/> 11 | </jcr:root> 12 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | cq:adobeTargetExportFormat="html" 4 | cq:allowedTemplates="[/conf/example/settings/wcm/templates/(?!page-).*]" 5 | jcr:primaryType="sling:OrderedFolder" 6 | jcr:title="Example Fragments"> 7 | <us/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/us/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | cq:adobeTargetExportFormat="html" 4 | jcr:primaryType="sling:OrderedFolder" 5 | jcr:title="us"> 6 | <en/> 7 | </jcr:root> 8 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/us/en/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | cq:adobeTargetExportFormat="html" 4 | jcr:primaryType="sling:OrderedFolder" 5 | jcr:title="en"> 6 | <site/> 7 | </jcr:root> 8 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/us/en/site/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | cq:adobeTargetExportFormat="html" 4 | jcr:primaryType="sling:OrderedFolder" 5 | jcr:title="Site"> 6 | <header/> 7 | <footer/> 8 | </jcr:root> 9 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/us/en/site/footer/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:tags="[]" 6 | cq:template="/libs/cq/experience-fragments/components/experiencefragment/template" 7 | jcr:primaryType="cq:PageContent" 8 | jcr:title="Footer" 9 | sling:resourceType="cq/experience-fragments/components/experiencefragment"/> 10 | <master/> 11 | </jcr:root> 12 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/us/en/site/footer/master/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:tags="[]" 6 | cq:template="/conf/example/settings/wcm/templates/xf-web-variation" 7 | cq:xfMasterVariation="{Boolean}true" 8 | cq:xfVariantType="web" 9 | jcr:primaryType="cq:PageContent" 10 | jcr:title="Footer" 11 | sling:resourceType="example/components/xfpage"> 12 | <root 13 | jcr:primaryType="nt:unstructured" 14 | sling:resourceType="example/components/container" 15 | layout="responsiveGrid"> 16 | <separator 17 | jcr:primaryType="nt:unstructured" 18 | sling:resourceType="example/components/separator"/> 19 | <text 20 | jcr:primaryType="nt:unstructured" 21 | sling:resourceType="example/components/text" 22 | text="<p>Copyright 2020, Example.&nbsp;All rights reserved.</p> <p>345 Park Avenue,&nbsp;San Jose, CA 95110-2704, USA</p> " 23 | textIsRich="true"/> 24 | </root> 25 | </jcr:content> 26 | </jcr:root> 27 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/us/en/site/header/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:tags="[]" 6 | cq:template="/libs/cq/experience-fragments/components/experiencefragment/template" 7 | jcr:primaryType="cq:PageContent" 8 | jcr:title="Header" 9 | sling:resourceType="cq/experience-fragments/components/experiencefragment"/> 10 | <master/> 11 | </jcr:root> 12 | -------------------------------------------------------------------------------- /app/aem/ui.content/src/main/content/jcr_root/content/experience-fragments/example/us/en/site/header/master/.content.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" 3 | jcr:primaryType="cq:Page"> 4 | <jcr:content 5 | cq:tags="[]" 6 | cq:template="/conf/example/settings/wcm/templates/xf-web-variation" 7 | cq:xfMasterVariation="{Boolean}true" 8 | cq:xfVariantType="web" 9 | jcr:primaryType="cq:PageContent" 10 | jcr:title="Header" 11 | sling:resourceType="example/components/xfpage"> 12 | <root 13 | jcr:primaryType="nt:unstructured" 14 | sling:resourceType="example/components/container" 15 | layout="simple"> 16 | <navigation 17 | jcr:primaryType="nt:unstructured" 18 | sling:resourceType="example/components/navigation" 19 | collectAllPages="false" 20 | navigationRoot="/content/example/us/en" 21 | skipNavigationRoot="false" 22 | structureDepth="1"/> 23 | <languagenavigation 24 | jcr:primaryType="nt:unstructured" 25 | sling:resourceType="example/components/languagenavigation" 26 | navigationRoot="/content/example/us" 27 | structureDepth="2"/> 28 | <search 29 | jcr:primaryType="nt:unstructured" 30 | sling:resourceType="example/components/search" 31 | searchRoot="/content/example/us"/> 32 | </root> 33 | </jcr:content> 34 | </jcr:root> 35 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/typescript" 4 | ], 5 | "plugins": [ 6 | "@babel/plugin-proposal-class-properties", 7 | "@babel/plugin-proposal-object-rest-spread" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/.eslintignore: -------------------------------------------------------------------------------- 1 | ../ui.apps/ 2 | ./src/main/webpack/tests/ 3 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', // Specifies the ESLint parser 3 | extends: [ 4 | 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin 5 | ], 6 | parserOptions: { 7 | ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features 8 | sourceType: 'module', // Allows for the use of imports 9 | }, 10 | rules: { 11 | "curly": 1, 12 | "@typescript-eslint/explicit-function-return-type": [0], 13 | "@typescript-eslint/no-explicit-any": [0], 14 | "ordered-imports": [0], 15 | "object-literal-sort-keys": [0], 16 | "max-len": [1, 120], 17 | "new-parens": 1, 18 | "no-bitwise": 1, 19 | "no-cond-assign": 1, 20 | "no-trailing-spaces": 0, 21 | "eol-last": 1, 22 | "func-style": ["error", "declaration", { "allowArrowFunctions": true }], 23 | "semi": 1, 24 | "no-var": 0 25 | }, 26 | }; 27 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.moowork.gradle.node.yarn.YarnTask 2 | 3 | plugins { 4 | id("base") 5 | id("com.github.node-gradle.node") 6 | } 7 | 8 | apply(from = rootProject.file("app/common.gradle.kts")) 9 | apply(from = rootProject.file("app/aem/common.gradle.kts")) 10 | 11 | description = "Example - AEM UI Frontend" 12 | 13 | tasks { 14 | register<YarnTask>("webpack") { 15 | description = "Builds UI frontend clientlib using Webpack" 16 | dependsOn("yarn") 17 | 18 | val mode = project.findProperty("webpack.mode")?.toString() ?: "prod" 19 | 20 | setYarnCommand(mode) 21 | 22 | inputs.property("mode", mode) 23 | inputs.file("package.json") 24 | inputs.dir("src") 25 | outputs.dir("dist") 26 | } 27 | named<Task>("clean") { 28 | doLast { 29 | delete("dist") 30 | } 31 | } 32 | register<Zip>("zip") { 33 | dependsOn("webpack") 34 | from("dist") 35 | } 36 | named("build") { 37 | dependsOn("zip") 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aem-maven-archetype", 3 | "version": "1.0.0", 4 | "description": "Generates an AEM Frontend project with Webpack", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/adobe/aem-project-archetype" 8 | }, 9 | "private": true, 10 | "main": "src/main/webpack/site/main.ts", 11 | "license": "SEE LICENSE IN LICENSE.txt", 12 | "scripts": { 13 | "dev": "webpack -d --env dev --config ./webpack.dev.js && clientlib --verbose", 14 | "prod": "webpack -p --config ./webpack.prod.js && clientlib --verbose", 15 | "start": "webpack-dev-server --open --config ./webpack.dev.js" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.0.0", 19 | "@babel/plugin-proposal-class-properties": "^7.3.3", 20 | "@babel/plugin-proposal-object-rest-spread": "^7.3.2", 21 | "@typescript-eslint/eslint-plugin": "^2.14.0", 22 | "@typescript-eslint/parser": "^2.14.0", 23 | "acorn": "^6.1.0", 24 | "aem-clientlib-generator": "^1.4.3", 25 | "autoprefixer": "^9.2.1", 26 | "browserslist": "^4.2.1", 27 | "clean-webpack-plugin": "^3.0.0", 28 | "copy-webpack-plugin": "^5.0.4", 29 | "css-loader": "^3.0.0", 30 | "cssnano": "^4.1.10", 31 | "eslint": "^6.8.0", 32 | "eslint-loader": "^3.0.3", 33 | "html-webpack-plugin": "^3.2.0", 34 | "mini-css-extract-plugin": "^0.4.4", 35 | "node-sass": "^4.11.0", 36 | "optimize-css-assets-webpack-plugin": "^5.0.1", 37 | "postcss-loader": "^3.0.0", 38 | "sass": "^1.17.2", 39 | "sass-loader": "^7.1.0", 40 | "source-map-loader": "^0.2.4", 41 | "style-loader": "^0.14.1", 42 | "terser-webpack-plugin": "^1.4.1", 43 | "ts-loader": "^5.3.3", 44 | "tsconfig-paths-webpack-plugin": "^3.2.0", 45 | "typescript": "^3.3.3333", 46 | "webpack": "^4.27.1", 47 | "webpack-cli": "^3.1.2", 48 | "webpack-dev-server": "^3.9.0", 49 | "webpack-import-glob-loader": "^1.6.3", 50 | "webpack-merge": "^4.2.1" 51 | }, 52 | "dependencies": {}, 53 | "browserslist": [ 54 | "last 2 version", 55 | "> 1%" 56 | ] 57 | } 58 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_accordion.scss: -------------------------------------------------------------------------------- 1 | .cmp-accordion {} 2 | .cmp-accordion__item {} 3 | .cmp-accordion__header {} 4 | .cmp-accordion__button {} 5 | .cmp-accordion__button--expanded {} 6 | .cmp-accordion__title {} 7 | .cmp-accordion__icon {} 8 | .cmp-accordion__panel {} 9 | .cmp-accordion__panel--expanded {} 10 | .cmp-accordion__panel--hidden {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | .cmp-breadcrumb {} 2 | .cmp-breadcrumb__list {} 3 | .cmp-breadcrumb__item {} 4 | .cmp-breadcrumb__item--active {} 5 | .cmp-breadcrumb__item-link {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_button.scss: -------------------------------------------------------------------------------- 1 | .cmp-button {} 2 | .cmp-button__text {} 3 | .cmp-button__icon {} 4 | //.cmp-button__icon--myIcon {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_carousel.scss: -------------------------------------------------------------------------------- 1 | .cmp-carousel {} 2 | .cmp-carousel__content {} 3 | .cmp-carousel__item {} 4 | .cmp-carousel__actions {} 5 | .cmp-carousel__action {} 6 | .cmp-carousel__action--disabled {} 7 | .cmp-carousel__action--previous {} 8 | .cmp-carousel__action--next {} 9 | .cmp-carousel__action--pause {} 10 | .cmp-carousel__action--play {} 11 | .cmp-carousel__action-icon {} 12 | .cmp-carousel__action-text {} 13 | .cmp-carousel__indicators {} 14 | .cmp-carousel__indicator {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_container.scss: -------------------------------------------------------------------------------- 1 | .cmp-container {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_contentfragment.scss: -------------------------------------------------------------------------------- 1 | .cmp-contentfragment {} 2 | .cmp-contentfragment__title {} 3 | .cmp-contentfragment__description {} 4 | .cmp-contentfragment__elements {} 5 | .cmp-contentfragment__element {} 6 | //.cmp-contentfragment__element--myElementName {} 7 | .cmp-contentfragment__element-title {} 8 | .cmp-contentfragment__element-value {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_contentfragmentlist.scss: -------------------------------------------------------------------------------- 1 | .cmp-contentfragmentlist {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_download.scss: -------------------------------------------------------------------------------- 1 | .cmp-download {} 2 | .cmp-download__title {} 3 | .cmp-download__title-link {} 4 | .cmp-download__description {} 5 | .cmp-download__properties {} 6 | .cmp-download__property {} 7 | .cmp-download__property-label {} 8 | .cmp-download__property-content {} 9 | .cmp-download__property--filename {} 10 | .cmp-download__property--size {} 11 | .cmp-download__property--format {} 12 | .cmp-download__action {} 13 | .cmp-download__action-text {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_experiencefragment.scss: -------------------------------------------------------------------------------- 1 | .cmp-experiencefragment {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_form-button.scss: -------------------------------------------------------------------------------- 1 | .cmp-form-button {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_form-options.scss: -------------------------------------------------------------------------------- 1 | .cmp-form-options {} 2 | .cmp-form-options__legend {} 3 | .cmp-form-options__field-label {} 4 | .cmp-form-options__field {} 5 | .cmp-form-options__field--checkbox {} 6 | .cmp-form-options__field--radio {} 7 | .cmp-form-options__field-description {} 8 | .cmp-form-options__label {} 9 | .cmp-form-options__drop-down-field {} 10 | .cmp-form-options__multi-drop-down-field {} 11 | .cmp-form-options__help-message {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_form-text.scss: -------------------------------------------------------------------------------- 1 | .cmp-form-text {} 2 | .cmp-form-text__help-block {} 3 | .cmp-form-text__textarea {} 4 | .cmp-form-text__text {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_form.scss: -------------------------------------------------------------------------------- 1 | .cmp-form {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_helloworld.scss: -------------------------------------------------------------------------------- 1 | // Best practice: 2 | // For a good separation of concerns, don't rely on the DOM element names, 3 | // but on dedicated CSS selectors to identify all elements 4 | .cmp-helloworld {} 5 | .cmp-helloworld__title {} 6 | .cmp-helloworld__item {} 7 | .cmp-helloworld__item-label { 8 | margin-bottom: 0; 9 | } 10 | .cmp-helloworld__item-output { 11 | margin-top: 0; 12 | } -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_image.scss: -------------------------------------------------------------------------------- 1 | .cmp-image {} 2 | .cmp-image__link {} 3 | .cmp-image__image {} 4 | .cmp-image__title {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_languagenavigation.scss: -------------------------------------------------------------------------------- 1 | .cmp-languagenavigation {} 2 | //.cmp-languagenavigation--countrycode-US 3 | //.cmp-languagenavigation--langcode-en-US 4 | .cmp-languagenavigation__group {} 5 | .cmp-languagenavigation__item {} 6 | .cmp-languagenavigation__item--active {} 7 | //.cmp-languagenavigation__item--level-0 {} 8 | .cmp-languagenavigation__item-link {} 9 | .cmp-languagenavigation__item-title {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_list.scss: -------------------------------------------------------------------------------- 1 | .cmp-list {} 2 | .cmp-list__item {} 3 | .cmp-list__item-link {} 4 | .cmp-list__item-title {} 5 | .cmp-list__item-date {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_navigation.scss: -------------------------------------------------------------------------------- 1 | .cmp-navigation {} 2 | .cmp-navigation__group {} 3 | .cmp-navigation__item {} 4 | .cmp-navigation__item--active {} 5 | .cmp-navigation__item-link {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_search.scss: -------------------------------------------------------------------------------- 1 | .cmp-search {} 2 | .cmp-search__form {} 3 | .cmp-search__field {} 4 | .cmp-search__icon {} 5 | .cmp-search__input {} 6 | .cmp-search__loading-indicator {} 7 | .cmp-search__clear {} 8 | .cmp-search__clear-icon {} 9 | .cmp-search__results {} 10 | .cmp-search__item {} 11 | .cmp-search__item--is-focused {} 12 | .cmp-search__item-mark {} 13 | .cmp-search__item-title {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_tabs.scss: -------------------------------------------------------------------------------- 1 | .cmp-tabs {} 2 | .cmp-tabs__tablist {} 3 | .cmp-tabs__tab {} 4 | .cmp-tabs__tab--active {} 5 | .cmp-tabs__tabpanel {} 6 | .cmp-tabs__tabpanel--active {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_teaser.scss: -------------------------------------------------------------------------------- 1 | .cmp-teaser {} 2 | .cmp-teaser__image {} 3 | .cmp-teaser__content {} 4 | .cmp-teaser__title {} 5 | .cmp-teaser__title-link {} 6 | .cmp-teaser__description {} 7 | .cmp-teaser__action-container {} 8 | .cmp-teaser__action-link {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_text.scss: -------------------------------------------------------------------------------- 1 | .cmp-text {} 2 | .cmp-text__paragraph {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/components/_title.scss: -------------------------------------------------------------------------------- 1 | .cmp-title {} 2 | .cmp-title__text {} 3 | .cmp-title__link {} -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/resources/fonts/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/resources/images/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/site/_base.scss: -------------------------------------------------------------------------------- 1 | //== Base 2 | 3 | html, 4 | body { 5 | margin: 0; 6 | font-size: $font-size; 7 | font-family: $font-family; 8 | line-height: $font-height; 9 | color: $color-foreground; 10 | background: $color-background; 11 | 12 | @media (prefers-color-scheme: dark) { 13 | color: $color-foreground-dark; 14 | background: $color-background-dark; 15 | } 16 | } 17 | 18 | 19 | a { 20 | color: $color-link; 21 | 22 | @media (prefers-color-scheme: dark) { 23 | color: $color-link-dark; 24 | } 25 | } 26 | 27 | button, 28 | input, 29 | optgroup, 30 | select, 31 | textarea { 32 | font: inherit; 33 | } 34 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/site/_variables.scss: -------------------------------------------------------------------------------- 1 | 2 | //== Font 3 | 4 | $font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 5 | $font-size: 16px; 6 | $font-height: 1.5; 7 | 8 | //== Color 9 | 10 | // Normal mode 11 | $color-foreground: #202020; 12 | $color-background: #ECECEC; 13 | $color-link: #2020E0; 14 | 15 | // Dark mode 16 | $color-foreground-dark: invert($color-foreground); 17 | $color-background-dark: invert($color-background); 18 | $color-link-dark: invert($color-link); 19 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/site/main.scss: -------------------------------------------------------------------------------- 1 | 2 | @import 'variables'; 3 | @import 'base'; 4 | @import './components/*.scss'; 5 | @import './styles/*.scss'; 6 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/site/main.ts: -------------------------------------------------------------------------------- 1 | 2 | // Stylesheets 3 | import "./main.scss"; 4 | 5 | // Javascript or Typescript 6 | import "./**/*.js"; 7 | import "./**/*.ts"; 8 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/site/styles/container_main.scss: -------------------------------------------------------------------------------- 1 | 2 | //== Container main content style, used on page template 3 | 4 | main.container { 5 | padding: .5em 1em; 6 | } 7 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/src/main/webpack/site/styles/experiencefragment_footer.scss: -------------------------------------------------------------------------------- 1 | 2 | //== XF Footer style, used on page template 3 | 4 | footer.experiencefragment { 5 | padding: .5em 1em; 6 | border-top: 1px solid $color-foreground; 7 | 8 | @media (prefers-color-scheme: dark) { 9 | border-color: $color-foreground-dark; 10 | } 11 | 12 | .cmp-separator__horizontal-rule { 13 | margin: 0; 14 | border: 0; 15 | } 16 | } -------------------------------------------------------------------------------- /app/aem/ui.frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "es6", 5 | "baseUrl": "../ui.frontend", 6 | "removeComments": true, 7 | "allowJs": true, 8 | "preserveConstEnums": true, 9 | "allowSyntheticDefaultImports": true, 10 | "sourceMap": true 11 | }, 12 | "include": [ "./src/**/*.ts" ] 13 | } 14 | -------------------------------------------------------------------------------- /app/aem/ui.frontend/webpack.dev.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge'); 2 | const common = require('./webpack.common.js'); 3 | const path = require('path'); 4 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 5 | 6 | const SOURCE_ROOT = __dirname + '/src/main/webpack'; 7 | 8 | module.exports = merge(common, { 9 | mode: 'development', 10 | devtool: 'inline-source-map', 11 | performance: { hints: 'warning' }, 12 | plugins: [ 13 | new HtmlWebpackPlugin({ 14 | template: path.resolve(__dirname, SOURCE_ROOT + '/static/index.html') 15 | }) 16 | ], 17 | devServer: { 18 | inline: true, 19 | proxy: [{ 20 | context: ['/content', '/etc.clientlibs'], 21 | target: 'http://localhost:4502', 22 | }] 23 | } 24 | }); -------------------------------------------------------------------------------- /app/aem/ui.frontend/webpack.prod.js: -------------------------------------------------------------------------------- 1 | const merge = require('webpack-merge'); 2 | const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); 3 | const TerserPlugin = require('terser-webpack-plugin'); 4 | const common = require('./webpack.common.js'); 5 | 6 | module.exports = merge(common, { 7 | mode: 'production', 8 | optimization: { 9 | minimize: true, 10 | minimizer: [ 11 | new TerserPlugin(), 12 | new OptimizeCSSAssetsPlugin({ 13 | cssProcessorPluginOptions: { 14 | cssProcessor: require('cssnano'), 15 | preset: ['default', { 16 | calc: true, 17 | convertValues: true, 18 | discardComments: { 19 | removeAll: true 20 | }, 21 | discardDuplicates: true, 22 | discardEmpty: true, 23 | mergeRules: true, 24 | normalizeCharset: true, 25 | reduceInitial: true, // This is since IE11 does not support the value Initial 26 | svgo: true 27 | }], 28 | }, 29 | canPrint: false 30 | }) 31 | ], 32 | splitChunks: { 33 | cacheGroups: { 34 | main: { 35 | chunks: 'all', 36 | name: 'site', 37 | test: 'main', 38 | enforce: true 39 | } 40 | } 41 | } 42 | }, 43 | devtool: 'none', 44 | performance: { hints: false } 45 | }); 46 | -------------------------------------------------------------------------------- /app/common.gradle.kts: -------------------------------------------------------------------------------- 1 | /** 2 | * Common configuration for all application artifacts 3 | */ 4 | import org.gradle.api.tasks.testing.logging.TestExceptionFormat 5 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile 6 | import com.moowork.gradle.node.NodeExtension 7 | 8 | repositories { 9 | jcenter() 10 | maven("https://repo.adobe.com/nexus/content/groups/public") 11 | maven("https://dl.bintray.com/acs/releases") 12 | } 13 | 14 | plugins.withId("maven-publish") { 15 | configure<PublishingExtension> { 16 | repositories { 17 | maven(findProperty("release.repository").toString()) { 18 | name = "internal" 19 | credentials { 20 | username = findProperty("release.user")?.toString() 21 | password = findProperty("release.password")?.toString() 22 | } 23 | } 24 | } 25 | } 26 | } 27 | 28 | plugins.withId("java") { 29 | tasks.withType<JavaCompile>().configureEach { 30 | with(options) { 31 | sourceCompatibility = "1.8" 32 | targetCompatibility = "1.8" 33 | encoding = "UTF-8" 34 | } 35 | } 36 | 37 | tasks.withType<Test>().configureEach { 38 | useJUnitPlatform() 39 | testLogging { 40 | events("passed", "skipped", "failed") 41 | exceptionFormat = TestExceptionFormat.SHORT 42 | } 43 | } 44 | 45 | dependencies { 46 | "testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:5.6.0") 47 | "testImplementation"("org.junit.jupiter:junit-jupiter-api:5.6.0") 48 | } 49 | } 50 | 51 | plugins.withId("org.jetbrains.kotlin.jvm") { 52 | tasks.withType<KotlinCompile>().configureEach { 53 | kotlinOptions { 54 | jvmTarget = "1.8" 55 | } 56 | } 57 | } 58 | 59 | plugins.withId("com.github.node-gradle.node") { 60 | configure<NodeExtension> { 61 | version = "12.16.2" 62 | yarnVersion = "1.22.4" 63 | download = true 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | # Gradle 2 | # Build your Java project and run tests with Gradle using a Gradle wrapper script. 3 | # Add steps that analyze code, save build artifacts, deploy, and more: 4 | # https://docs.microsoft.com/azure/devops/pipelines/languages/java 5 | 6 | trigger: 7 | - master 8 | 9 | pool: 10 | vmImage: 'ubuntu-latest' 11 | 12 | steps: 13 | - task: Gradle@2 14 | inputs: 15 | workingDirectory: '' 16 | gradleWrapperFile: 'gradlew' 17 | gradleOptions: '-Xmx3072m' 18 | javaHomeOption: 'JDKVersion' 19 | jdkVersionOption: '1.8' 20 | jdkArchitectureOption: 'x64' 21 | publishJUnitResults: true 22 | testResultsFiles: '**/TEST-*.xml' 23 | tasks: 'build' 24 | -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | repositories { 2 | mavenLocal() 3 | jcenter() 4 | gradlePluginPortal() 5 | } 6 | 7 | dependencies { 8 | implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0") 9 | implementation("com.neva.gradle:fork-plugin:5.0.5") 10 | implementation("com.netflix.nebula:nebula-project-plugin:7.0.9") 11 | implementation("com.cognifide.gradle:environment-plugin:1.1.3") 12 | implementation("com.cognifide.gradle:aem-plugin:14.4.6") 13 | implementation("com.cognifide.gradle:htl-plugin:1.0.0") 14 | implementation("org.apache.sling:org.apache.sling.caconfig.bnd-plugin:1.0.2") 15 | implementation("com.cognifide.gradle:lighthouse-plugin:1.0.0") 16 | implementation("com.github.node-gradle:gradle-node-plugin:2.2.4") 17 | implementation("net.researchgate:gradle-release:2.6.0") 18 | } 19 | -------------------------------------------------------------------------------- /docs/develop-task.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/docs/develop-task.gif -------------------------------------------------------------------------------- /docs/docker-vpn-kit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/docs/docker-vpn-kit.png -------------------------------------------------------------------------------- /docs/fork-default-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/docs/fork-default-dialog.png -------------------------------------------------------------------------------- /docs/fork-props-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/docs/fork-props-dialog.png -------------------------------------------------------------------------------- /docs/gradle-aem-multi-build.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/docs/gradle-aem-multi-build.gif -------------------------------------------------------------------------------- /docs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/docs/logo.png -------------------------------------------------------------------------------- /docs/wtt-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/docs/wtt-logo.png -------------------------------------------------------------------------------- /env/src/aem/instance/groovyScript/1.0.0/content-cleanup.groovy: -------------------------------------------------------------------------------- 1 | // ===[ Configuration ]=== 2 | 3 | def debug(message) { 4 | println(message) 5 | log.info(message) 6 | } 7 | 8 | def contentRoots = [ 9 | '/content/example/demo', 10 | '/content/example/live' 11 | ] 12 | 13 | def cleanContent(root) { 14 | debug "Cleaning content at root '$root'" 15 | def sql = "SELECT * FROM [cq:PageContent] AS s WHERE ISDESCENDANTNODE([$root])" 16 | for (def pageContent : resourceResolver.findResources(sql, "JCR-SQL2")) { 17 | debug "Cleaning page '${pageContent.path}'" 18 | Thread.sleep(500) // TODO simulates some repository operation 19 | } 20 | debug "Cleaned content at root '$root'" 21 | } 22 | 23 | // ===[ Execution ]=== 24 | 25 | contentRoots.forEach { cleanContent(it) } 26 | -------------------------------------------------------------------------------- /env/src/aem/instance/tail/incidentFilter.txt: -------------------------------------------------------------------------------- 1 | # Put here fragment of first line of exception from log to treat incident as known issue (no longer see notification, wildcards supported) 2 | org.apache.jackrabbit.oak.jcr.session.RefreshStrategy This session has been idle for * minutes 3 | org.apache.felix.http.jetty Exception while processing request to /system/console/*.json 4 | -------------------------------------------------------------------------------- /env/src/aem/localInstance/override/author/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/env/src/aem/localInstance/override/author/.gitkeep -------------------------------------------------------------------------------- /env/src/aem/localInstance/override/common/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/env/src/aem/localInstance/override/common/.gitkeep -------------------------------------------------------------------------------- /env/src/aem/localInstance/override/publish/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/env/src/aem/localInstance/override/publish/.gitkeep -------------------------------------------------------------------------------- /env/src/aem/package/validator/OAKPAL_OPEAR/plan.json: -------------------------------------------------------------------------------- 1 | { 2 | "checklists": [ 3 | "net.adamcin.oakpal.core/basic", 4 | "acs-commons-integrators", 5 | "content-class-aem65" 6 | ], 7 | "installHookPolicy": "SKIP", 8 | "checks": [ 9 | { 10 | "name": "basic/subpackages", 11 | "config": { 12 | "denyAll": false 13 | } 14 | }, 15 | { 16 | "name": "basic/acHandling", 17 | "config": { 18 | "levelSet": "no_unsafe" 19 | } 20 | }, 21 | { 22 | "name": "com.adobe.acs.acs-aem-commons-oakpal-checks/content-class-aem65/content-classifications", 23 | "config": { 24 | "severity": "MINOR" 25 | } 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /env/src/environment/docker-compose.yml.peb: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | httpd: 4 | image: centos/httpd:latest 5 | command: ["tail", "-f", "--retry", "/usr/local/apache2/logs/error.log"] 6 | deploy: 7 | replicas: 1 8 | ports: 9 | - "80:80" 10 | networks: 11 | - docker-net 12 | volumes: 13 | - "{{ docker.rootPath }}/env/src/environment/httpd/conf/httpd.conf:/etc/httpd/conf/httpd.conf" 14 | - "{{ docker.rootPath }}/app/aem/dispatcher/src/conf.d:/etc/httpd/conf.d" 15 | - "{{ docker.rootPath }}/app/aem/dispatcher/src/conf.dispatcher.d:/etc/httpd/conf.dispatcher.d" 16 | - "{{ docker.workPath }}/httpd/modules/mod_dispatcher.so:/etc/httpd/modules/mod_dispatcher.so" 17 | - "{{ docker.workPath }}/httpd/logs:/etc/httpd/logs" 18 | {% if docker.runtime.safeVolumes %} 19 | - "{{ docker.workPath }}/httpd/cache:/var/www/localhost/cache" 20 | - "{{ docker.workPath }}/httpd/htdocs:/var/www/localhost/htdocs" 21 | {% endif %} 22 | {% if docker.runtime.hostInternalIpMissing %} 23 | extra_hosts: 24 | - "host.docker.internal:{{ docker.runtime.hostInternalIp }}" 25 | {% endif %} 26 | networks: 27 | docker-net: 28 | -------------------------------------------------------------------------------- /env/src/environment/httpd/conf.d/variables/default.vars: -------------------------------------------------------------------------------- 1 | Define DOCROOT /var/www/localhost/cache 2 | Define AEM_HOST host.docker.internal 3 | Define AEM_IP host.docker.internal 4 | Define AEM_PORT 4503 5 | 6 | Define DISP_LOG_LEVEL Warn 7 | Define REWRITE_LOG_LEVEL Warn 8 | Define EXPIRATION_TIME A2592000 9 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | version=1.0.0-SNAPSHOT 2 | release.useAutomaticVersion=true 3 | 4 | # Tests configuration 5 | test.parallel=false 6 | test.publishUrl=http://example.com 7 | 8 | # Performance tuning 9 | org.gradle.daemon=true 10 | org.gradle.parallel=true 11 | org.gradle.caching=true 12 | org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -Dfile.encoding=UTF-8 13 | 14 | # SMB / JCIFS workaround for Mac OSX 15 | systemProp.jcifs.resolveOrder=DNS 16 | systemProp.jcifs.smb.client.dfs.disabled=true 17 | -------------------------------------------------------------------------------- /gradle/fork/README.MD.peb: -------------------------------------------------------------------------------- 1 | # {{ projectLabel }} 2 | 3 | ## Description 4 | 5 | TBD 6 | 7 | ## Building 8 | 9 | Project build is based on [Gradle](https://docs.gradle.org/current/userguide/userguide.html) and using [Gradle AEM Plugin](https://github.com/wttech/gradle-aem-plugin). 10 | 11 | ### Environment 12 | 13 | 0. See [prerequisites](https://github.com/wttech/gradle-aem-plugin/tree/develop#environment-configuration) 14 | 1. Generate user-specific properties file covering AEM instance source files and configuration: 15 | ```bash 16 | sh gradlew props 17 | ``` 18 | 2. Append project-specific host entries to OS-specific file by running script: 19 | * `sh hosts` (Unix) 20 | * `hosts.bat` (Windows) 21 | 22 | 3. Create, run and configure AEM instances and AEM dispatcher automatically by running command: 23 | ```bash 24 | sh gradlew setup 25 | ``` 26 | 27 | ### Application 28 | 29 | To build CRX package and deploy it on AEM instance(s), simply run command: 30 | 31 | ```bash 32 | sh gradlew 33 | ``` 34 | 35 | ## Releasing 36 | 37 | At first, ensure having configured release repository URL and credentials in _Authorization_ tab when running command `gradlew props`. 38 | 39 | Simply run command: `gradle release`. 40 | -------------------------------------------------------------------------------- /gradle/fork/fork.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.neva.gradle.fork.ForkExtension 2 | 3 | configure<ForkExtension> { 4 | properties { 5 | define(mapOf( 6 | "projectLabel" to { 7 | description = "Human-readable project name" 8 | defaultValue = "Example" 9 | }, 10 | "projectName" to { 11 | description = "Artifact 'name' coordinate" 12 | validator { lowercased(); alphanumeric() } 13 | controller { other("targetPath").value = File(File(other("sourcePath").value).parentFile, value).toString() } 14 | defaultValue = "example" 15 | }, 16 | "projectGroup" to { 17 | description = "Artifact 'group' coordinate and base Java package" 18 | validator { javaPackage(); notEndsWith("projectName") } 19 | defaultValue = "com.company.aem" 20 | }, 21 | "sourcePath" to { enabled = false }, 22 | "targetPath" to { enabled = false } 23 | )) 24 | } 25 | config { 26 | cloneFiles() 27 | moveFiles(mapOf( 28 | "/com/company/example/aem" to "/{{projectGroup|substitute('.', '/')}}/{{projectName}}/aem", 29 | "/example" to "/{{projectName}}" 30 | )) 31 | replaceContents(mapOf( 32 | "com.company.example.aem" to "{{projectGroup}}.{{projectName}}.aem", 33 | "com.company.example" to "{{projectGroup}}.{{projectName}}", 34 | "com.company" to "{{projectGroup}}", 35 | "Example" to "{{projectLabel}}", 36 | "example" to "{{projectName}}" 37 | )) 38 | copyTemplateFile("README.MD") 39 | removeFiles(listOf( 40 | "LICENSE", 41 | "azure-pipelines.yml", 42 | "gh-md-toc", 43 | "docs/*", 44 | "gradle/fork/fork.gradle.kts", 45 | "gradle/fork/README.MD.peb" 46 | )) 47 | removeTexts(listOf( 48 | """apply(from = "gradle/fork/fork.gradle.kts")""" + "\n" 49 | )) 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /gradle/notifier/icon-failure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/gradle/notifier/icon-failure.png -------------------------------------------------------------------------------- /gradle/notifier/icon-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/gradle/notifier/icon-success.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | 7 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "example" 2 | 3 | include(":env") 4 | 5 | include(":app:aem:core") 6 | include(":app:aem:ui.apps") 7 | include(":app:aem:ui.content") 8 | include(":app:aem:ui.frontend") 9 | include(":app:aem:dispatcher") 10 | include(":app:aem:migration") 11 | include(":app:aem:all") 12 | 13 | /* 14 | include(":app:knotx:distribution") // fork of starterkit 15 | include(":app:knotx:custom-module") // extra JAR building if needed by custom distribution 16 | */ 17 | 18 | include("test:functional") 19 | include("test:integration") 20 | include("test:performance") 21 | -------------------------------------------------------------------------------- /test/common.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.gradle.api.tasks.testing.logging.TestExceptionFormat 2 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile 3 | import com.moowork.gradle.node.NodeExtension 4 | 5 | repositories { 6 | jcenter() 7 | } 8 | 9 | plugins.withId("java") { 10 | tasks.withType<JavaCompile>().configureEach { 11 | with(options) { 12 | sourceCompatibility = "1.8" 13 | targetCompatibility = "1.8" 14 | encoding = "UTF-8" 15 | } 16 | } 17 | 18 | tasks.withType<Test>().configureEach { 19 | useJUnitPlatform() 20 | testLogging { 21 | events("passed", "skipped", "failed") 22 | exceptionFormat = TestExceptionFormat.SHORT 23 | } 24 | } 25 | 26 | dependencies { 27 | "testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:5.6.0") 28 | "testImplementation"("org.junit.jupiter:junit-jupiter-api:5.6.0") 29 | } 30 | } 31 | 32 | plugins.withId("org.jetbrains.kotlin.jvm") { 33 | tasks.withType<KotlinCompile>().configureEach { 34 | kotlinOptions { 35 | jvmTarget = "1.8" 36 | } 37 | } 38 | } 39 | 40 | plugins.withId("com.github.node-gradle.node") { 41 | configure<NodeExtension> { 42 | version = "12.16.2" 43 | yarnVersion = "1.22.4" 44 | download = true 45 | } 46 | } 47 | 48 | -------------------------------------------------------------------------------- /test/functional/README.md: -------------------------------------------------------------------------------- 1 | # Functional tests 2 | 3 | ## About 4 | 5 | Module which consists of functional tests based on [Cypress](https://www.cypress.io/) tool. 6 | 7 | ## Running 8 | 9 | To run all tests use command: `sh gradlew :test:functional:run`. 10 | Optionally configure with `-Ptest.publishUrl=http://aem-host.com` to run tests on other host. 11 | 12 | To open GUI use command: `sh gradlew :test:functional:openGui`. 13 | Then it will be available to select: 14 | 15 | * single / concrete test spec to be launched, 16 | * web browser to be used when launching test spec. 17 | 18 | 19 | To tune test runner, see all available [Cypress configuration options](https://docs.cypress.io/guides/references/configuration.html#Options) then configure each option by editing file: [cypress.json](cypress.json) 20 | 21 | ## Screenshots 22 | 23 | ![Spec select](docs/gui-spec-select.png) 24 | 25 | ![Home spec run](docs/gui-home-spec.png) 26 | -------------------------------------------------------------------------------- /test/functional/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import com.moowork.gradle.node.yarn.YarnTask 2 | 3 | plugins { 4 | id("com.cognifide.aem.common") 5 | id("com.github.node-gradle.node") 6 | } 7 | 8 | apply(from = rootProject.file("test/common.gradle.kts")) 9 | 10 | description = "Example - Functional Tests" 11 | 12 | tasks { 13 | val args by lazy { 14 | mutableListOf<String>().apply { 15 | aem.prop.string("test.publishUrl")?.let { addAll(listOf("-c", "baseUrl=$it")) } 16 | if (aem.prop.flag("test.headed")) add("--headed") 17 | if (aem.prop.flag("test.record")) add("--record") 18 | aem.prop.string("test.spec")?.let { add("--spec=$it")} 19 | aem.prop.string("test.browser")?.let { if (it != "auto") add("--browser=$it")} 20 | } 21 | } 22 | val reportDir = "build/cypress/reports" 23 | 24 | register<YarnTask>("runTests") { 25 | group = "check" 26 | description = "Run functional tests (Cypress)" 27 | dependsOn("yarn") 28 | mustRunAfter(":env:environmentAwait") 29 | finalizedBy("generateReport") 30 | 31 | setWorkingDir(projectDir) 32 | setYarnCommand("cypress") 33 | setArgs(listOf("run") + args) 34 | doFirst { delete(reportDir) } 35 | } 36 | 37 | register<YarnTask>("generateReport") { 38 | group = "check" 39 | description = "Generate report for functional tests (Cypress)" 40 | 41 | setWorkingDir(projectDir) 42 | setYarnCommand("node") 43 | setArgs(listOf("scripts/generateReport.js")) 44 | } 45 | 46 | register<YarnTask>("openGui") { 47 | group = "check" 48 | description = "Open functional tests GUI runner (Cypress)" 49 | dependsOn("yarn") 50 | 51 | setWorkingDir(projectDir) 52 | setYarnCommand("cypress") 53 | setArgs(listOf("open") + args) 54 | doFirst { delete(reportDir) } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /test/functional/cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "video": false, 3 | "videosFolder": "build/cypress/videos", 4 | "screenshotsFolder": "build/cypress/screenshots", 5 | "reporter": "mochawesome", 6 | "reporterOptions": { 7 | "reportDir": "build/cypress/reports", 8 | "overwrite": false, 9 | "html": false, 10 | "json": true 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /test/functional/cypress/fixtures/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/test/functional/cypress/fixtures/.gitkeep -------------------------------------------------------------------------------- /test/functional/cypress/integration/home.spec.js: -------------------------------------------------------------------------------- 1 | /// <reference types="Cypress" /> 2 | 3 | context('Home Page', () => { 4 | beforeEach(() => { 5 | cy.visit('/') 6 | }); 7 | 8 | it('should have correct window title', () => { 9 | // https://on.cypress.io/title 10 | cy.title().should('include', 'en') 11 | }) 12 | }); 13 | -------------------------------------------------------------------------------- /test/functional/cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example plugins/index.js can be used to load plugins 3 | // 4 | // You can change the location of this file or turn off loading 5 | // the plugins file with the 'pluginsFile' configuration option. 6 | // 7 | // You can read more here: 8 | // https://on.cypress.io/plugins-guide 9 | // *********************************************************** 10 | 11 | // This function is called when a project is opened or re-opened (e.g. due to 12 | // the project's config changing) 13 | 14 | module.exports = (on, config) => { 15 | // `on` is used to hook into various events Cypress emits 16 | // `config` is the resolved Cypress config 17 | } 18 | -------------------------------------------------------------------------------- /test/functional/cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add("login", (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This is will overwrite an existing command -- 25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) 26 | -------------------------------------------------------------------------------- /test/functional/cypress/support/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /test/functional/docs/gui-home-spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/test/functional/docs/gui-home-spec.png -------------------------------------------------------------------------------- /test/functional/docs/gui-spec-select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/test/functional/docs/gui-spec-select.png -------------------------------------------------------------------------------- /test/functional/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "license": "UNLICENSED", 3 | "devDependencies": { 4 | "cypress": "^4.4.0", 5 | "mocha": "^7.0.1", 6 | "mochawesome": "^6.1.0", 7 | "mochawesome-merge": "^4.0.3", 8 | "mochawesome-report-generator": "^5.1.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /test/functional/scripts/generateReport.js: -------------------------------------------------------------------------------- 1 | const merger = require('mochawesome-merge'); 2 | const generator = require('mochawesome-report-generator'); 3 | const cypressOptions = require('../cypress'); 4 | const reportDir = cypressOptions.reporterOptions.reportDir; 5 | 6 | async function generateReport() { 7 | const jsonReport = await merger.merge({ files: [`./${reportDir}/mochawesome*.json`] }); 8 | await generator.create(jsonReport, { reportDir: reportDir}); 9 | } 10 | 11 | generateReport().then(() => console.log(`Cypress Mochawesome report available at path: ${process.cwd()}/${reportDir}/mochawesome.html`)); 12 | -------------------------------------------------------------------------------- /test/integration/README.md: -------------------------------------------------------------------------------- 1 | # Integration tests 2 | 3 | ## About 4 | 5 | Module which consists of integration test for: 6 | 7 | * webservices checking based on [Karate Framework](https://github.com/intuit/karate), 8 | * web page HTML markup checking based on [JUnit5](https://junit.org/junit5) & [JSoup](https://jsoup.org). 9 | 10 | ## Running 11 | 12 | To run tests use commands for: 13 | 14 | * all tests: `sh gradlew :test:integration:test`. 15 | * specific Karate feature: `sh gradlew :test:integration:test -i -Pkarate.options='classpath:karate/feature/pageDetails.feature'` 16 | 17 | Optionally consider properties for: 18 | 19 | * different host / base URL: `-Ptest.publishUrl=http://aem-host.com`, 20 | * running Karate features in parallel: `-Ptest.parallel` with auto-generating [Cucumber Reports](https://github.com/damianszczepanik/cucumber-reporting) under directory *build/cucumber-html-reports*. 21 | 22 | ## Screenshots 23 | 24 | ![Karate IntelliJ Run](docs/karate-feature-intellij.png) 25 | 26 | ![Karate / Cucumber Report](docs/cucumber-report.png) 27 | -------------------------------------------------------------------------------- /test/integration/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.gradle.api.tasks.testing.logging.TestLogEvent 2 | 3 | plugins { 4 | id("org.jetbrains.kotlin.jvm") 5 | id("com.cognifide.aem.common") 6 | id("nebula.integtest-standalone") 7 | } 8 | 9 | apply(from = rootProject.file("test/common.gradle.kts")) 10 | 11 | description = "Example - Integration Tests" 12 | 13 | dependencies { 14 | integTestImplementation(project(":app:aem:core")) 15 | 16 | integTestRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.3.2") 17 | integTestImplementation("org.junit.jupiter:junit-jupiter-api:5.3.2") 18 | integTestImplementation("org.jsoup:jsoup:1.12.1") 19 | 20 | integTestImplementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.71") 21 | integTestImplementation("com.intuit.karate:karate-core:0.9.4") 22 | integTestImplementation("com.intuit.karate:karate-apache:0.9.4") 23 | integTestImplementation("com.intuit.karate:karate-junit5:0.9.4") 24 | integTestImplementation("net.masterthought:cucumber-reporting:4.9.0") 25 | } 26 | 27 | tasks { 28 | integrationTest { 29 | mustRunAfter(":env:environmentAwait") 30 | outputs.upToDateWhen { false } 31 | 32 | testLogging { 33 | showStandardStreams = true 34 | events = setOf(TestLogEvent.PASSED, TestLogEvent.FAILED, TestLogEvent.SKIPPED) 35 | } 36 | systemProperties(mapOf<String, Any?>( 37 | "karate.options" to (aem.prop.string("karate.options") ?: ""), 38 | "karate.env" to (aem.prop.string("karate.env") ?: aem.commonOptions.env), 39 | "karate.config.dir" to "src/integTest/kotlin/karate", 40 | "test.publishUrl" to aem.prop.string("test.publishUrl")!! /* TODO ?: aem.projectMain.environment.hosts["publish"].url)*/, 41 | "test.parallel" to (aem.prop.string("test.parallel") ?: "") 42 | )) 43 | } 44 | } 45 | 46 | sourceSets { 47 | integTest { 48 | resources { 49 | srcDir(file("src/integTest/kotlin")) 50 | exclude("**/*.kt") 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /test/integration/docs/cucumber-report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/test/integration/docs/cucumber-report.png -------------------------------------------------------------------------------- /test/integration/docs/karate-feature-intellij.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/test/integration/docs/karate-feature-intellij.png -------------------------------------------------------------------------------- /test/integration/src/integTest/kotlin/jsoup/base/MarkupTest.kt: -------------------------------------------------------------------------------- 1 | package jsoup.base 2 | 3 | import org.apache.commons.io.FilenameUtils 4 | import org.jsoup.Jsoup 5 | import org.jsoup.select.Elements 6 | import org.junit.jupiter.api.Assertions.assertTrue 7 | 8 | abstract class MarkupTest { 9 | 10 | val publishUrl get() = System.getProperty("test.publishUrl") 11 | 12 | fun get(path: String) = Jsoup.connect("$publishUrl$path").get() 13 | 14 | fun assertText(expectedPattern: String, actualText: String) { 15 | assertTrue(FilenameUtils.wildcardMatch(expectedPattern, actualText)) { 16 | "Text '$actualText' does not match wildcard pattern '$expectedPattern'" 17 | } 18 | } 19 | 20 | fun Elements.textMatches(expectedPattern: String) { 21 | assertText(expectedPattern, text().trim()) 22 | } 23 | 24 | fun Elements.attributeMatches(attribute: String, expectedPattern: String) { 25 | assertText(expectedPattern, attr(attribute).trim()) 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /test/integration/src/integTest/kotlin/jsoup/test/HomeTest.kt: -------------------------------------------------------------------------------- 1 | package jsoup.test 2 | 3 | import jsoup.base.MarkupTest 4 | import org.junit.jupiter.api.Test 5 | 6 | class HomeTest : MarkupTest() { 7 | 8 | @Test 9 | fun shouldHaveElementsInMarkup() { 10 | get("/").apply { 11 | select(".title").first().apply { 12 | select(".cmp-title__text").textMatches("Example") 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /test/integration/src/integTest/kotlin/karate/basic-auth.js: -------------------------------------------------------------------------------- 1 | function fn(creds) { 2 | var temp = creds.username + ':' + creds.password; 3 | var Base64 = Java.type('java.util.Base64'); 4 | var encoded = Base64.getEncoder().encodeToString(temp.bytes); 5 | return 'Basic ' + encoded; 6 | } 7 | -------------------------------------------------------------------------------- /test/integration/src/integTest/kotlin/karate/feature/FeatureRunner.kt: -------------------------------------------------------------------------------- 1 | package karate.feature 2 | 3 | import com.intuit.karate.KarateOptions 4 | import com.intuit.karate.Runner 5 | import com.intuit.karate.junit5.Karate 6 | import net.masterthought.cucumber.Configuration 7 | import net.masterthought.cucumber.ReportBuilder 8 | import org.junit.jupiter.api.Assertions.assertTrue 9 | import org.junit.jupiter.api.Test 10 | import org.junit.jupiter.api.condition.DisabledIfSystemProperty 11 | import org.junit.jupiter.api.condition.EnabledIfSystemProperty 12 | import java.io.File 13 | 14 | @KarateOptions(tags = ["~@ignore"]) 15 | class FeatureRunner { 16 | 17 | @Karate.Test 18 | @DisabledIfSystemProperty(named = "test.parallel", matches = "true") 19 | fun testSequential() = Karate().tags("~@ignore").relativeTo(javaClass) 20 | 21 | @Test 22 | @EnabledIfSystemProperty(named = "test.parallel", matches = "true") 23 | fun testParallel() { 24 | Runner.parallel(javaClass, Runtime.getRuntime().availableProcessors()).apply { 25 | generateReport(File(reportDir)) 26 | assertTrue(failCount == 0, errorMessages) 27 | } 28 | } 29 | 30 | private fun generateReport(reportDir: File) { 31 | val jsonFiles = (reportDir.listFiles { file: File -> file.extension == "json" } ?: arrayOf()) 32 | val config = Configuration(reportDir.parentFile, "Integration Tests"); 33 | 34 | ReportBuilder(jsonFiles.map { it.absolutePath }.toList(), config).generateReports(); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /test/integration/src/integTest/kotlin/karate/feature/pageModel.feature: -------------------------------------------------------------------------------- 1 | @aem 2 | Feature: Page Model Endpoint 3 | 4 | Background: 5 | * url publishUrl 6 | 7 | Scenario: Check response format 8 | 9 | Given path '/content/example/us/en.model.json' 10 | When method get 11 | Then status 200 12 | And match response == 13 | """ 14 | { 15 | "designPath": "/libs/settings/wcm/designs/default", 16 | "title": "en", 17 | "templateName": "page-content", 18 | "cssClassNames": "page basicpage", 19 | "language": "en", 20 | ":items": "#object", 21 | ":itemsOrder": [ 22 | "root" 23 | ], 24 | ":type": "example/components/page" 25 | } 26 | """ 27 | -------------------------------------------------------------------------------- /test/integration/src/integTest/kotlin/karate/feature/posts.feature: -------------------------------------------------------------------------------- 1 | @3rd-party 2 | Feature: Posts from 3rd-party Web Service 3 | 4 | Background: 5 | * url 'https://jsonplaceholder.typicode.com' 6 | 7 | Scenario: Check posts data format 8 | 9 | Given path '/posts' 10 | When method get 11 | Then status 200 12 | And match $ == '#[100]' 13 | And match each $ == 14 | """ 15 | { 16 | "userId": #number, 17 | "id": #number, 18 | "title": "#string", 19 | "body": "#string" 20 | } 21 | """ 22 | -------------------------------------------------------------------------------- /test/integration/src/integTest/kotlin/karate/karate-config.js: -------------------------------------------------------------------------------- 1 | function() { 2 | // karate.configure('connectTimeout', 60000); 3 | // karate.configure('readTimeout', 60000); 4 | 5 | var env = karate.env || 'dev'; 6 | karate.log("Environment: " + env); 7 | 8 | var publishUrl = karate.properties['test.publishUrl']; 9 | karate.log("AEM Publish URL: " + publishUrl); 10 | 11 | return { 12 | env: env, 13 | publishUrl: publishUrl 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /test/performance/README.md: -------------------------------------------------------------------------------- 1 | # Performance tests 2 | 3 | ## About 4 | 5 | Tests are based on [Gradle Lighthouse Plugin](https://github.com/wttech/gradle-lighthouse-plugin) / [Lighthouse](https://developers.google.com/web/tools/lighthouse/) tool . 6 | 7 | ## Configuration 8 | 9 | See available configuration options on [plugin page](https://github.com/wttech/gradle-lighthouse-plugin#configuration). 10 | 11 | ## Running 12 | 13 | Simply run command: `sh gradlew :test:performance:lighthouseRun`. 14 | Optionally configure with `-Ptest.publishUrl=http://aem-host.com` to run tests on other host (using default paths). 15 | 16 | Test reports will be saved in `build/lighthouse` directory. 17 | For each url tested within suite, separate HTML report will be generated. 18 | 19 | ## Screenshots 20 | 21 | ![Lighthouse Report](docs/lighthouse-report.png) 22 | -------------------------------------------------------------------------------- /test/performance/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.cognifide.aem.common") 3 | id("com.cognifide.lighthouse") 4 | } 5 | 6 | apply(from = rootProject.file("test/common.gradle.kts")) 7 | 8 | description = "Example - Performance Tests" 9 | 10 | lighthouse { 11 | baseUrl = aem.prop.string("test.publishUrl") 12 | } 13 | 14 | tasks { 15 | lighthouseRun { 16 | mustRunAfter(":env:environmentAwait") 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /test/performance/docs/lighthouse-report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wttech/gradle-aem-multi/539b449fa8a4e6843592db556ce254a9cba696c5/test/performance/docs/lighthouse-report.png -------------------------------------------------------------------------------- /test/performance/lighthouse/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "lighthouse:default" 3 | } 4 | -------------------------------------------------------------------------------- /test/performance/lighthouse/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "suites": [ 3 | { 4 | "name": "site.live", 5 | "baseUrl": "http://example.com", 6 | "paths": [ 7 | "/" 8 | ], 9 | "args": [ 10 | "--config-path=lighthouse/config.json", 11 | "--performance=70", 12 | "--accessibility=70", 13 | "--best-practices=70", 14 | "--seo=70", 15 | "--pwa=30" 16 | ] 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /test/performance/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "license": "UNLICENSED", 3 | "devDependencies": { 4 | "lighthouse-ci": "^1.10.0" 5 | } 6 | } 7 | --------------------------------------------------------------------------------