master 74a6f03fb4f8 cached
243 files
389.0 KB
96.1k tokens
505 symbols
1 requests
Download .txt
Showing preview only (490K chars total). Download the full file or copy to clipboard to get everything.
Repository: MarcGiffing/wicket-spring-boot
Branch: master
Commit: 74a6f03fb4f8
Files: 243
Total size: 389.0 KB

Directory structure:
gitextract_rhrs615o/

├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       └── maven.yml
├── .gitignore
├── README.adoc
├── pom.xml
├── wicket-spring-boot-context/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── giffing/
│                       └── wicket/
│                           └── spring/
│                               └── boot/
│                                   └── context/
│                                       ├── condition/
│                                       │   ├── ConditionalOnWicket.java
│                                       │   └── WicketSettingsCondition.java
│                                       ├── exceptions/
│                                       │   ├── WicketSpringBootException.java
│                                       │   └── extensions/
│                                       │       └── ExtensionMisconfigurationException.java
│                                       ├── extensions/
│                                       │   ├── ApplicationInitExtension.java
│                                       │   ├── WicketApplicationInitConfiguration.java
│                                       │   ├── boot/
│                                       │   │   └── actuator/
│                                       │   │       ├── WicketAutoConfig.java
│                                       │   │       └── WicketEndpointRepository.java
│                                       │   └── types/
│                                       │       ├── DurationUnit.java
│                                       │       ├── SessionUnit.java
│                                       │       └── TypeParser.java
│                                       ├── scan/
│                                       │   ├── WicketAccessDeniedPage.java
│                                       │   ├── WicketExpiredPage.java
│                                       │   ├── WicketHomePage.java
│                                       │   ├── WicketInternalErrorPage.java
│                                       │   └── WicketSignInPage.java
│                                       └── security/
│                                           └── AuthenticatedWebSessionConfig.java
├── wicket-spring-boot-starter/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── giffing/
│           │           └── wicket/
│           │               └── spring/
│           │                   └── boot/
│           │                       └── starter/
│           │                           ├── WicketAutoConfiguration.java
│           │                           ├── WicketBootWebApplicationAutoConfiguration.java
│           │                           ├── app/
│           │                           │   ├── WicketBootSecuredWebApplication.java
│           │                           │   ├── WicketBootStandardWebApplication.java
│           │                           │   ├── WicketBootWebApplication.java
│           │                           │   ├── classscanner/
│           │                           │   │   ├── ClassCandidateScanner.java
│           │                           │   │   ├── ClassCandidateScannerConfiguration.java
│           │                           │   │   └── candidates/
│           │                           │   │       ├── WicketClassCandidate.java
│           │                           │   │       └── WicketClassCandidatesHolder.java
│           │                           │   └── verifier/
│           │                           │       ├── WicketDependencyMismatchDetectedException.java
│           │                           │       ├── WicketDependencyVersionChecker.java
│           │                           │       ├── WicketDependencyVersionCheckerFailureAnalyzer.java
│           │                           │       └── WicketDependencyVersionCheckerProperties.java
│           │                           ├── configuration/
│           │                           │   ├── CustomAnnotationBeanNameGenerator.java
│           │                           │   └── extensions/
│           │                           │       ├── WicketExtensionLocation.java
│           │                           │       ├── core/
│           │                           │       │   ├── csrf/
│           │                           │       │   │   ├── CsrfAttacksPreventionConfig.java
│           │                           │       │   │   └── CsrfAttacksPreventionProperties.java
│           │                           │       │   ├── datastore/
│           │                           │       │   │   ├── DataStoreHttpSessionConfig.java
│           │                           │       │   │   └── DataStoreHttpSessionProperties.java
│           │                           │       │   ├── requestmapper/
│           │                           │       │   │   ├── CryptMapperConfig.java
│           │                           │       │   │   └── CryptMapperProperties.java
│           │                           │       │   ├── resources/
│           │                           │       │   │   └── SpringBootMainClassResourceRegistration.java
│           │                           │       │   ├── resourcesettings/
│           │                           │       │   │   └── packageresourceguard/
│           │                           │       │   │       ├── PackageResourceGuardConfig.java
│           │                           │       │   │       └── PackageResourceGuardProperties.java
│           │                           │       │   ├── serializer/
│           │                           │       │   │   └── deflated/
│           │                           │       │   │       ├── DeflatedJavaSerializerConfig.java
│           │                           │       │   │       └── DeflatedJavaSerializerProperties.java
│           │                           │       │   └── settings/
│           │                           │       │       ├── application/
│           │                           │       │       │   └── ApplicationSettingsConfig.java
│           │                           │       │       ├── debug/
│           │                           │       │       │   ├── DebugSettingsConfig.java
│           │                           │       │       │   └── DebugSettingsProperties.java
│           │                           │       │       ├── exceptions/
│           │                           │       │       │   ├── ExceptionSettingsConfig.java
│           │                           │       │       │   └── ExceptionSettingsProperties.java
│           │                           │       │       ├── general/
│           │                           │       │       │   └── GeneralSettingsProperties.java
│           │                           │       │       ├── markup/
│           │                           │       │       │   ├── MarkupSettingsConfig.java
│           │                           │       │       │   └── MarkupSettingsProperties.java
│           │                           │       │       ├── pagestore/
│           │                           │       │       │   ├── StoreSettingsConfig.java
│           │                           │       │       │   └── StoreSettingsProperties.java
│           │                           │       │       ├── requestlogger/
│           │                           │       │       │   ├── RequestLoggerSettingsConfig.java
│           │                           │       │       │   └── RequestLoggerSettingsProperties.java
│           │                           │       │       ├── requrestcycle/
│           │                           │       │       │   ├── RequestCycleSettingsConfig.java
│           │                           │       │       │   └── RequestCycleSettingsProperties.java
│           │                           │       │       └── resource/
│           │                           │       │           ├── ResourceSettingsConfig.java
│           │                           │       │           └── ResourceSettingsProperties.java
│           │                           │       ├── external/
│           │                           │       │   ├── beanvalidation/
│           │                           │       │   │   ├── BeanValidationConfig.java
│           │                           │       │   │   └── BeanValidationProperties.java
│           │                           │       │   ├── development/
│           │                           │       │   │   ├── devutils/
│           │                           │       │   │   │   ├── diskstorebrowser/
│           │                           │       │   │   │   │   ├── DiskStoreBrowserConfig.java
│           │                           │       │   │   │   │   └── DiskStoreBrowserProperties.java
│           │                           │       │   │   │   ├── inspector/
│           │                           │       │   │   │   │   ├── InspectorConfig.java
│           │                           │       │   │   │   │   └── InspectorProperties.java
│           │                           │       │   │   │   └── statelesschecker/
│           │                           │       │   │   │       ├── StatelessCheckerConfig.java
│           │                           │       │   │   │       └── StatelessCheckerProperties.java
│           │                           │       │   │   ├── springboot/
│           │                           │       │   │   │   └── devtools/
│           │                           │       │   │   │       ├── SpringDevToolsProperties.java
│           │                           │       │   │   │       ├── SpringDevToolsSerializer.java
│           │                           │       │   │   │       ├── SpringDevtoolsSerializerConfig.java
│           │                           │       │   │   │       └── WicketDevToolsPropertyDefaultsPostProcessor.java
│           │                           │       │   │   └── wicketsource/
│           │                           │       │   │       ├── WicketSourceConfig.java
│           │                           │       │   │       └── WicketSourceProperties.java
│           │                           │       │   ├── spring/
│           │                           │       │   │   ├── boot/
│           │                           │       │   │   │   └── actuator/
│           │                           │       │   │   │       ├── WicketEndpoint.java
│           │                           │       │   │   │       ├── WicketEndpointConfiguration.java
│           │                           │       │   │   │       └── WicketEndpointRepositoryDefault.java
│           │                           │       │   │   └── security/
│           │                           │       │   │       ├── SecureWebSession.java
│           │                           │       │   │       ├── SpringSecurityConfig.java
│           │                           │       │   │       └── SpringSecurityProperties.java
│           │                           │       │   └── webjars/
│           │                           │       │       ├── WebjarsConfig.java
│           │                           │       │       └── WebjarsProperties.java
│           │                           │       └── stuff/
│           │                           │           ├── annotationscan/
│           │                           │           │   ├── AnnotatedMountScannerConfig.java
│           │                           │           │   └── AnnotatedMountScannerProperties.java
│           │                           │           ├── datastore/
│           │                           │           │   ├── cassandra/
│           │                           │           │   │   ├── DataStoreCassandraConfig.java
│           │                           │           │   │   └── DataStoreCassandraProperties.java
│           │                           │           │   ├── hazelcast/
│           │                           │           │   │   ├── DataStoreHazelcastConfig.java
│           │                           │           │   │   └── DataStoreHazelcastProperties.java
│           │                           │           │   ├── memcached/
│           │                           │           │   │   ├── DataStoreMemcachedConfig.java
│           │                           │           │   │   └── DataStoreMemcachedProperties.java
│           │                           │           │   └── redis/
│           │                           │           │       ├── DataStoreRedisConfig.java
│           │                           │           │       └── DataStoreRedisProperties.java
│           │                           │           ├── htmlcompressor/
│           │                           │           │   ├── HTMLCompressingConfig.java
│           │                           │           │   └── HTMLCompressingProperties.java
│           │                           │           ├── monitoring/
│           │                           │           │   └── jamon/
│           │                           │           │       ├── BootJamonAdminPage.java
│           │                           │           │       ├── JamonConfig.java
│           │                           │           │       ├── JamonCssResourceReference.java
│           │                           │           │       ├── JamonProperties.java
│           │                           │           │       └── css/
│           │                           │           │           └── jamon.css
│           │                           │           ├── restannotations/
│           │                           │           │   ├── RestAnnotationsConfig.java
│           │                           │           │   └── RestAnnotationsProperties.java
│           │                           │           ├── serializer/
│           │                           │           │   ├── fast2/
│           │                           │           │   │   ├── WicketSerializerFast2Config.java
│           │                           │           │   │   └── WicketSerializerFast2Properties.java
│           │                           │           │   └── kryo2/
│           │                           │           │       ├── WicketSerializerKryo2Config.java
│           │                           │           │       └── WicketSerializerKryo2Properties.java
│           │                           │           ├── shiro/
│           │                           │           │   ├── ShiroSecurityConfig.java
│           │                           │           │   └── ShiroSecurityProperties.java
│           │                           │           └── springreference/
│           │                           │               ├── SpringReferenceConfig.java
│           │                           │               └── SpringReferenceProperties.java
│           │                           └── web/
│           │                               ├── WicketWebInitializer.java
│           │                               ├── WicketWebInitializerProperties.java
│           │                               ├── config/
│           │                               │   ├── WicketWebInitializerAutoConfig.java
│           │                               │   └── WicketWebInitializerConfig.java
│           │                               └── servlet/
│           │                                   ├── standard/
│           │                                   │   └── StandardWicketWebInitializer.java
│           │                                   └── websocket/
│           │                                       ├── DummyWicketSessionResolver.java
│           │                                       ├── WebSocketMessageBroadcaster.java
│           │                                       ├── WebSocketMessageSenderDefault.java
│           │                                       ├── WebSocketWicketWebInitializer.java
│           │                                       ├── WicketServerEndpointConfigRegister.java
│           │                                       └── WicketSessionResolver.java
│           └── resources/
│               ├── META-INF/
│               │   ├── spring/
│               │   │   └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│               │   ├── spring-devtools.properties
│               │   └── spring.factories
│               └── application-development.yml
└── wicket-spring-boot-starter-example/
    ├── .gitignore
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── doc/
        │   │   └── index.adoc
        │   ├── java/
        │   │   └── com/
        │   │       └── giffing/
        │   │           └── wicket/
        │   │               └── spring/
        │   │                   └── boot/
        │   │                       └── example/
        │   │                           ├── WicketApplication.java
        │   │                           ├── WicketApplication.properties
        │   │                           ├── model/
        │   │                           │   └── Customer.java
        │   │                           ├── repository/
        │   │                           │   ├── DefaultFilter.java
        │   │                           │   ├── Domain.java
        │   │                           │   ├── Filter.java
        │   │                           │   ├── FilterService.java
        │   │                           │   ├── Sort.java
        │   │                           │   └── services/
        │   │                           │       ├── DefaultRepositoryService.java
        │   │                           │       └── customer/
        │   │                           │           ├── CustomerRepository.java
        │   │                           │           ├── CustomerRepositoryService.java
        │   │                           │           ├── CustomerRepositoryServiceImpl.java
        │   │                           │           ├── filter/
        │   │                           │           │   ├── CustomerFilter.java
        │   │                           │           │   └── CustomerSort.java
        │   │                           │           └── specs/
        │   │                           │               └── CustomerSpecs.java
        │   │                           └── web/
        │   │                               ├── SpringBootWebPackageIdentifier.java
        │   │                               ├── assets/
        │   │                               │   └── base/
        │   │                               │       ├── CustomStylesCssRessourceReference.java
        │   │                               │       └── custom.css
        │   │                               ├── general/
        │   │                               │   ├── action/
        │   │                               │   │   └── panel/
        │   │                               │   │       ├── ActionPanel.html
        │   │                               │   │       ├── ActionPanel.java
        │   │                               │   │       └── items/
        │   │                               │   │           ├── AbstractActionItemLink.html
        │   │                               │   │           ├── AbstractActionItemLink.java
        │   │                               │   │           ├── AbstrractActionItem.java
        │   │                               │   │           ├── links/
        │   │                               │   │           │   ├── ActionItemLink.html
        │   │                               │   │           │   └── ActionItemLink.java
        │   │                               │   │           └── yesno/
        │   │                               │   │               └── YesNoLink.java
        │   │                               │   └── notify/
        │   │                               │       ├── NotyJSReference.java
        │   │                               │       ├── NotyPackagedJSReference.java
        │   │                               │       ├── NotyThemeBootstrapJSReference.java
        │   │                               │       ├── jquery.noty.js
        │   │                               │       └── noty.theme.bootstrap.js
        │   │                               ├── html/
        │   │                               │   ├── autocomplete/
        │   │                               │   │   ├── AutoCompleteTextField.css
        │   │                               │   │   └── AutoCompleteTextField.java
        │   │                               │   ├── basic/
        │   │                               │   │   └── YesNoLabel.java
        │   │                               │   ├── border/
        │   │                               │   │   └── behavior/
        │   │                               │   │       ├── ValidationMsgBehavior.html
        │   │                               │   │       └── ValidationMsgBehavior.java
        │   │                               │   ├── form/
        │   │                               │   │   ├── ValidationForm.java
        │   │                               │   │   ├── ValidationFormVisitor.java
        │   │                               │   │   └── focus/
        │   │                               │   │       └── FocusBehaviour.java
        │   │                               │   ├── modal/
        │   │                               │   │   ├── YesNoModal.html
        │   │                               │   │   ├── YesNoModal.java
        │   │                               │   │   ├── YesNoPanel.html
        │   │                               │   │   └── YesNoPanel.java
        │   │                               │   ├── panel/
        │   │                               │   │   ├── FeedbackPanel.html
        │   │                               │   │   └── FeedbackPanel.java
        │   │                               │   └── repeater/
        │   │                               │       └── data/
        │   │                               │           └── table/
        │   │                               │               └── filter/
        │   │                               │                   ├── AbstractCheckBoxFilter.html
        │   │                               │                   ├── AbstractCheckBoxFilter.java
        │   │                               │                   ├── AbstractTextFieldFilter.html
        │   │                               │                   └── AbstractTextFieldFilter.java
        │   │                               ├── pages/
        │   │                               │   ├── BaseAuthenticatedPage.html
        │   │                               │   ├── BaseAuthenticatedPage.java
        │   │                               │   ├── BaseAuthenticatedPage.properties
        │   │                               │   ├── BasePage.html
        │   │                               │   ├── BasePage.java
        │   │                               │   ├── WicketBootstrapInitializer.java
        │   │                               │   ├── customers/
        │   │                               │   │   ├── CustomerListPage.html
        │   │                               │   │   ├── CustomerListPage.java
        │   │                               │   │   ├── create/
        │   │                               │   │   │   ├── CustomerCreatePage.html
        │   │                               │   │   │   └── CustomerCreatePage.java
        │   │                               │   │   ├── edit/
        │   │                               │   │   │   ├── CustomerEditPage.java
        │   │                               │   │   │   └── CustomerEditPage.properties
        │   │                               │   │   ├── events/
        │   │                               │   │   │   ├── CustomerChangedEvent.java
        │   │                               │   │   │   └── CustomerDeletedEvent.java
        │   │                               │   │   └── model/
        │   │                               │   │       ├── CustomerDataProvider.java
        │   │                               │   │       ├── UsernameSearchTextField.java
        │   │                               │   │       └── UsernameTextField.java
        │   │                               │   ├── errors/
        │   │                               │   │   ├── AccessDeniedPage.html
        │   │                               │   │   ├── AccessDeniedPage.java
        │   │                               │   │   ├── ExpiredPage.html
        │   │                               │   │   ├── ExpiredPage.java
        │   │                               │   │   ├── InternalErrorPage.html
        │   │                               │   │   └── InternalErrorPage.java
        │   │                               │   ├── footer/
        │   │                               │   │   ├── Footer.html
        │   │                               │   │   └── Footer.java
        │   │                               │   ├── login/
        │   │                               │   │   ├── LoginPage.html
        │   │                               │   │   └── LoginPage.java
        │   │                               │   └── websocket/
        │   │                               │       ├── ChatPage.css
        │   │                               │       ├── ChatPage.html
        │   │                               │       ├── ChatPage.java
        │   │                               │       ├── ChatPage.properties
        │   │                               │       ├── ChatParticipant.java
        │   │                               │       ├── ChatService.java
        │   │                               │       └── events/
        │   │                               │           ├── CustomerMessageEvent.java
        │   │                               │           ├── JoinChatEvent.java
        │   │                               │           └── LeftChatEvent.java
        │   │                               ├── security/
        │   │                               │   ├── SpringSecurityWicketSessionResolver.java
        │   │                               │   └── WicketWebSecurityAdapterConfig.java
        │   │                               └── wicket/
        │   │                                   └── dataprovider/
        │   │                                       └── DefaultDataProvider.java
        │   └── resources/
        │       ├── META-INF/
        │       │   └── spring-devtools.properties
        │       ├── application.yml
        │       ├── db/
        │       │   └── changelog/
        │       │       ├── db.changelog-master.xml
        │       │       ├── init.xml
        │       │       ├── table_customer.xml
        │       │       └── test-data.xml
        │       └── logback.xml
        └── test/
            ├── java/
            │   ├── com/
            │   │   └── giffing/
            │   │       └── wicket/
            │   │           └── spring/
            │   │               └── boot/
            │   │                   └── example/
            │   │                       └── web/
            │   │                           ├── WicketBaseIntTest.java
            │   │                           ├── WicketBaseTest.java
            │   │                           ├── WicketMockServletContext.java
            │   │                           ├── pages/
            │   │                           │   └── customers/
            │   │                           │       ├── CustomerListIntTest.java
            │   │                           │       ├── CustomerListPageTest.java
            │   │                           │       ├── create/
            │   │                           │       │   ├── CustomerCreatePageIntTest.java
            │   │                           │       │   └── CustomerCreatePageTest.java
            │   │                           │       └── edit/
            │   │                           │           └── CustomerEditPageTest.java
            │   │                           └── security/
            │   │                               └── WicketWebSecurityAdapterTestConfig.java
            │   └── test/
            │       └── com/
            │           └── giffing/
            │               └── wicket/
            │                   └── spring/
            │                       └── boot/
            │                           └── example/
            │                               └── web/
            │                                   └── WicketWebApplicationConfig.java
            └── resources/
                ├── application.yml
                └── db/
                    └── changelog/
                        └── db.changelog-master-test.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2
updates:
  - package-ecosystem: "maven" # See documentation for possible values
    directory: "/" # Location of package manifests
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/maven.yml
================================================
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Java CI with Maven

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: maven
    - name: Build with Maven
      run: mvn -B package --file pom.xml

    # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
    #- name: Update dependency graph
    #  uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6


================================================
FILE: .gitignore
================================================
/target/
/.settings/
.classpath
.project
.idea/
*.iml

================================================
FILE: README.adoc
================================================
= Wicket autoconfiguration with Spring Boot

Current release version:

* 4.1.x - http://wicket.apache.org/[Wicket 10.6] with Spring Boot 3.5.x - Branch master
* 4.0.x - http://wicket.apache.org/[Wicket 10.0] with Spring Boot 3.2.x - Branch master

NOTE: http://search.maven.org/#search|ga|1|com.giffing.wicket.spring.boot

NOTE: Example projects: https://github.com/MarcGiffing/wicket-spring-boot-examples

* <<introduction>>
* <<getting_started>>
* <<how_does_it_work>>
* <<spring_profile_dev_configuration>>
* <<custom-conditions>>
* <<extension>>
* <<war_deployment>>

[[introduction]]
== Introduction

https://dzone.com/articles/enhance-wicket-with-spring-boot *by Andrea Del Bene*

This project makes it easy to create a new Wicket projects with a minimum
of configuration effort. It uses Spring Boot to autoconfigure Wickets core and
its extension (related projects like wicketstuff, beanvalidation...) with an reasonable default value which can be overridden over property files.

* Core Features

** Configures an embedded Servlet Container by default (Spring Boot Feature).
** Autoconfiguration of the needed link:wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/WicketWebInitializer.java[Wicket Servlet filters].
** Autoconfiguration for Spring/Spring-Security and dependency injection support with @SpringBean.
** Autoconfiguration of Wicket <<extension>>.
** Faster development support with <<extension-springboot-devtools>>

[[getting_started]]
== Getting started

To get started you have to create a new Maven Project (or another preferred dependency/build-management tool)
and add the *wicket-spring-boot-starter* dependency to your configuration. 

[source,xml]
----
<dependency>
  <groupId>com.giffing.wicket.spring.boot.starter</groupId>
  <artifactId>wicket-spring-boot-starter</artifactId>
</dependency>
----

Beside the Maven dependency configuration we need the following steps to do

. Create a class which is marked with @SpringBootApplication - see http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-using-springbootapplication-annotation[Springs documentation]
. Create your HomePage class (with HTML) which will me marked with @WicketHomePage


[source,java]
----
@SpringBootApplication
public class WicketApplication {
  public static void main(String[] args) throws Exception {
    new SpringApplicationBuilder()
      .sources(WicketApplication.class)
      .run(args);
  }

}

@WicketHomePage
public class HomePage extends WebPage {
}

<html xmlns:wicket="http://wicket.apache.org">
	<head></head>
	<body>
		You content
		<wicket:child/>
	</body>
</html>

----

Thats all! When you execute the main method you will get a fully working and configured 
Wicket application. An embedded Tomcat is automatically started.

In a usal Wicket application you would like to provide custom configuration in Wickets WebApplication init() method.
You could create your own 'extension' by creating a bean which implements WicketApplicationInitConfiguration

[source,java]
----
@ApplicationInitExtension
public class YouExtensionConif implements WicketApplicationInitConfiguration {

  @Override
  public void init(WebApplication webApplication) {
  	// your custom configuration
  }

}
----

If this configuration is not enough and you want to override special methods of Wickets WebApplication class you have
to create a bean which extends one of the following two classes

* WicketBootStandardWebApplication - Without Security
* WicketBootSecuredWebApplication  - With Security - You'll need a security provider like <<extension-spring-security>>

[source,java]
----
@Component
public class WicketWebApplication extends WicketBootSecuredWebApplication {
  @Override
  protected void init() {
    super.init();
  }
}
----

The custom WicketWebApplication is automatically picked up instead of the default provided one.
You can also override the getHomePage method() if you don't want to use the special @WicketHomePage annotations
to mark the home page.

To package the application as an executable jar you have to add the spring-boot-maven-plugin.

[source,xml]
----
 <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
----

Resource files (html, css, js, ...) are not copied to the target folder if placed in the *src/main/java*
folder. You have to tell Maven to copy these files:


[source,xml]
----
<resources>
  <resource>
    <directory>src/main/resources</directory>
  </resource>
  <resource>
    <directory>src/main/java</directory>
    <includes>
      <include>**</include>
    </includes>
    <excludes>
      <exclude>**/*.java</exclude>
    </excludes>
  </resource>
</resources>
----

[[how_does_it_work]]
== How does it work?

To fully understand how http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-developing-auto-configuration[Spring Boots autconfiguration] 
and in general Spring Boot works you should read the excellent 
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/[documentation] from this fantastic http://projects.spring.io/spring-boot/[project].

As an an example we will look to the AnnotatedMountScanner configuration. The https://github.com/wicketstuff/core/wiki/Annotation[annotated mount scanner] 
is an project which supports bookmarkable URLs configured by annotations on WebPage classes. If you have this '@MountPath("login")' annotation on a 
WebPage then the Page is mounted to 'http://localhost/login'.

In this project each configuration is separated in two classes to configure this particular feature/extension. The extension
consists of a property and a configuration class.

The property class holds properties to configure the specific feature. In the AnnotatedMountScannerProperties class we
found two properties:

[source,java]
----
@ConfigurationProperties(prefix = AnnotatedMountScannerProperties.PROPERTY_PREFIX)
public class AnnotatedMountScannerProperties {
	public static final String PROPERTY_PREFIX = "wicket.stuff.annotationscan";
	/**
	 * @see AnnotatedMountScannerConfig
	 */
	private boolean enabled = true;

	/**
	 * An alternative package name for scanning for mount path if the
	 * WicketApplication should not used as the root scan package
	 */
	private String packagename;
----

This property file can be imported in the configuration class AnnotatedMountScannerConfig.

[source,java]
----
/**
 * Auto configuration for the {@link AnnotatedMountScanner}.
 * 
 * It uses the user defined {@link WebApplication} as the default package scan
 * root directory.
 * 
 * Enables annotate mount scanner if the following two condition matches:
 * 
 * 1. The {@link AnnotatedMountScanner} is in the classpath.
 * 
 * 2. The property {@link AnnotatedMountScannerProperties#PROPERTY_PREFIX}
 * .enabled is true (default = true)
 * 
 * 
 * @author Marc Giffing
 *
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = AnnotatedMountScannerProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(value = org.wicketstuff.annotation.scan.AnnotatedMountScanner.class)
@EnableConfigurationProperties({ AnnotatedMountScannerProperties.class })
public class AnnotatedMountScannerConfig implements WicketApplicationInitConfiguration {

	@Autowired
	private AnnotatedMountScannerProperties prop;

	@Override
	public void init(WebApplication webApplication) {
		String packagename = webApplication.getClass().getPackage().getName();
		if (prop.getPackagename() != null) {
			packagename = prop.getPackagename();
		}
		new AnnotatedMountScanner().scanPackage(packagename).mount(webApplication);
	}
}
----

If all conditions on the AnnotatedMountScannerConfig matches the configuration class is configured as
a spring bean. All Spring beans which implements the interface WicketApplicationInitConfiguration will
be injected as a list in the default WicketBootWebApplication class.  

In the WicketBootWebApplication class we iterate in Wickets init method over the list and call on each the
init method to configure the application.

[source,java]
----
public class WicketBootWebApplication extends AuthenticatedWebApplication {
  @Autowired(required = false)
  private List<WicketApplicationInitConfiguration> configurations = new ArrayList<>();
  @Override
  protected void init() {
    super.init();
    for (WicketApplicationInitConfiguration configuration : configurations) {
      configuration.init(this);
    }
  }
}
----

[[spring_profile_dev_configuration]]
=== Spring profile configuration

The Wicket Spring Boot Starter project ships with a default development configuration.
It can be activated by activating the 'development' Spring profile in the main class or over
external JVM/Maven arguments.

The default configuration can be overridden with a custom property file. See Spring Boots reference documentation http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config[here].

include::wicket-spring-boot-starter/src/main/resources/application-development.yml[]
[source,yml]
----
wicket:
  core:
    settings:
      general:
        configuration-type: development
      debug:
        enabled: true
        component-use-check: true
        development-utilities-enabled: true
  stuff:
    htmlcompressor:
      enabled: false
      features:
        removeComments: false
        removeMultiSpaces: false
        removeIntertagSpaces: false
        removeQuotes: false
        compressJavaScript: false
        compressCss: false
        simpleDoctype: false
        removeScriptAttributes: false
        removeStyleAttributes: false
        removeLinkAttributes: false
        removeFormAttributes: false
        removeInputAttributes: false
        simpleBooleanAttributes: false
        removeJavaScriptProtocol: false
        removeHttpProtocol: false
        removeHttpsProtocol: false
        preserveLineBreaks: false
  external:
    development:
      devutils:
        statelesschecker:
          enabled: true
        interceptor:
          enable-live-sessions-page: true
        diskstorebrowser:
          enabled: true
      wicketsource:
        enabled: true
----

[[custom-conditions]]
== Custom conditions

This section lists custom conditional configuration like Spring Boot ones. 

=== @ConditionalOnWicket

With the ConditionOnWicket annotation you can check that configuration classes only apply
on a specific Wicket major version. If some functionality is only available on Wicket 7 
you can use this annotation.

[source,java]
----
@ApplicationInitExtension
@ConditionalOnWicket(value=7, range=Range.EQUALS_OR_HIGHER)
public ConditionalConfig implements WicketApplicationInitConfiguration{
	@Override
	public void init(WebApplication webApplication) {
		// configuration option which only apply to Wickets major version 7 or higher
	}
}
----

[[extension]]
== Extensions

The following section describes the current extensions and the
required dependencies. An extension is a custom labeling in this project
which is used to auto-configure a specific part of an Wicket application. An extension
may require an external dependency or is using Wickets core features. See section
<<how_does_it_work>> to get a deeper knowledge.

* <<extension-general>>
** DEPLOYMENT-CONFIGURATIONS
*** <<extension-spring-security>>
*** <<extension-wicket-websocket>>
*** <<extension-beanvalidation>>
*** <<extension-core-csrf-prevention>>
*** <<extension-webjars>>
*** <<extension-wicketstuff-htmlcompressor>>
*** <<extension-wicketstuff-annotationscan>>
*** <<extension-core-serializer-deflated>>
*** <<extension-wicketstuff-serializer-fast2>>
*** <<extension-wicketstuff-serializer-kryo2>>
*** <<extension-wicketstuff-restannotations>>
*** <<extension-datastore-httpsession>>
*** <<extension-datastore-cassandra>>
*** <<extension-datastore-hazelcast>>
*** <<extension-datastore-memcached>>
*** <<extension-datastore-redis>>
*** <<extension-wicketstuff-jamon>>

** DEVELOPMENT-CONFIGURATIONS
*** <<extension-general-debugsettings>>
*** <<extension-devutils-diskstorebrowser>>
*** <<extension-devutils-inspector>>
*** <<extension-devutils-statelesschecker>>
*** <<extension-wicketsource>>
*** <<extension-springboot-devtools>>

[[extension-general]]
=== General

Wicket can be started in DEVELOPMENT and DEPLOYMENT mode. You can change the
configuration type over the following property configuration. The given property
is automatically mapped to Wickets ConfigurationType enumeration. 
 

[source,properties]
----
wicket.core.settings.general.configuration-type=development # development/deployment(default)

wicket.web.servlet.filter-mapping-param=/*
wicket.web.servlet.dispatcher-types=request, error, async # request, error, async, include, forward
wicket.web.servlet.init-parameters.*= # map<string,string> - configuration support for additional servlet init parameters

#exception settings
wicket.core.settings.exceptions.thread-dump-strategy=thread_holding_lock
wicket.core.settings.exceptions.error-handling-strategy-during-ajax-requests=redirect_to_error_page

wicket.core.settings.requestcycle.render-strategy=redirect-to-buffer # redirect-to-buffer / one-pass-render / redirect-to-render
wicket.core.settings.requestcycle.buffer-response=true
wicket.core.settings.requestcycle.gather-extended-browser-info=false
wicket.core.settings.requestcycle.response-request-encoding=UTF-8
wicket.core.settings.requestcycle.timeout-size=1
wicket.core.settings.requestcycle.timeout-unit=minutes
wicket.core.settings.requestcycle.exception-retry-count=10

#Markup - Settings
wicket.core.settings.markup.default-markup-encoding=UTF-8 # if null it uses the system default 
wicket.core.settings.markup.automatic-linking=false
wicket.core.settings.markup.compress-whitespace=false
wicket.core.settings.markup.strip-comments=false
wicket.core.settings.markup.strip-wicket-tags=true
wicket.core.settings.markup.throw-exception-on-missing-xml-declaration=false

#RequestLogger - Settings
wicket.core.settings.requestlogger.enabled=false
wicket.core.settings.requestlogger.record-session-size
wicket.core.settings.requestlogger.requests-window-size


wicket.core.requestmapper.cryptmapper.enabled=false # URL encryption support


wicket.core.settings.pagestore.enabled=false # enables custom store settings
wicket.core.settings.pagestore.session-size=2
wicket.core.settings.pagestore.session-unit=megabytes
wicket.core.settings.pagestore.asynchronous= # overrides wickets default value only when set
wicket.core.settings.pagestore.asynchronous-queue-capacity= # overrides wickets default value only when set
wicket.core.settings.pagestore.file-store-folder= # overrides wickets default value only when set
wicket.core.settings.pagestore.inmemory-cache-size= # overrides wickets default value only when set
	
----
If you insert e.g. developmentx you will get a startup error:
[listing]
Field error in object 'wicket' on field 'configurationType': rejected value [developmentx]; codes [typeMismatch.wicket.configurationType

==== Special Annotations

* @WicketHomePage
** A Page marked with this annotation will be configured as the default home page. If multiple WicketHomePage annotation found an exception is thrown.
* @WicketSignInPage
** A Page marked with this annotation will be configured as the default login page. A security provider like Spring Security is needed. If multiple annotations found an exception is thrown. 
* @WicketAccessDeniedPage
** A Page marked with this annotation will be configured as the default access denied page.  
* @WicketInternalErrorPage
** A Page marked with this annotation will be configured as the default internal error page.
* @WicketExpiredPage  
** A Page marked with this annotation will be configured as the default expired page.

[[extension-spring-security]]
=== Spring Security

This starter detects automatically Spring Security if the Spring Boot Starter Security dependency is added. 
Internally the WicketBootSecuredWebApplication is used instead of the WicketBootStandardWebApplication class.

[source,xml]
----
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
</dependency>
----

If you wan't to disable the Spring Security configuration for Wicket use the following property.

[source,properties]
----
wicket.external.spring.security=false
----


[[extension-wicket-websocket]]
=== Wicket Native WebSockets

https://ci.apache.org/projects/wicket/guide/7.x/guide/single.html#nativewebsockets[Documentation]

This project provides an auto configuration support for native WebSockets. If the required dependencies
are in the classpath a JavaxWebSocketFilter servlet filter is configured instead of the default WicketFilter. 

To simplify the usage of sending WebSocket messages a class named WebSocketMessageBroadcaster is automatically registered as a 
spring bean. You can inject the class anywhere with @SpringBean and use the 'send' method to send WebSocket messages.


[source,properties]
----
wicket.external.websocket=true # enables WebSocket support - dependency required (move documentation to seperated section)
----

[source,xml]
----
<dependency>
  <groupId>org.apache.wicket</groupId>
  <artifactId>wicket-native-websocket-javax</artifactId>
</dependency>
----


[[extension-beanvalidation]]
=== Bean validation

Wicket support for JSR 303 Bean validation.
See Wickets user guide 
https://ci.apache.org/projects/wicket/guide/7.x/guide/single.html[Validation with JSR 303]

To enable Wickets bean validation you have to add the *wicket-bean-validation* dependency to your
project. It will automatically configured and can be used in the project.

[source,properties]
----
wicket.external.beanvalidation.enabled=true # enabled by default if bean validation project is present
----

[source,xml]
----
<dependency>
  <groupId>org.apache.wicket</groupId>
  <artifactId>wicket-bean-validation</artifactId>
</dependency>
----

[[extension-core-csrf-prevention]]
=== Core - Prevention of CSRF Attacks



[source,properties]
----
wicket.core.csrf.enabled=true
wicket.core.csrf.no-origin-action=allow
wicket.core.csrf.conflicting-origin-action=abort
wicket.core.csrf.error-code=400
wicket.core.csrf.error-message=Origin does not correspond to request
wicket.core.csrf.accepted-origins[0]=domain.name.tld        # Just the domain name, no protocol
wicket.core.csrf.accepted-origins[1]=other-domain.name.tld  # Add more origins by increasing the index

#TODO: There are some configuration options which should be added
----

[[extension-webjars]]
=== Webjars

https://github.com/l0rdn1kk0n/wicket-webjars

[source,properties]
----
wicket.external.webjars.enabled=true
----

[source,xml]
----
<dependency>
  <groupId>de.agilecoders.wicket.webjars</groupId>
  <artifactId>wicket-webjars</artifactId>
</dependency>
----

[[extension-wicketstuff-annotationscan]]
=== Wicketstuff - annotationscan

Use wicketstuff-annotation to use Java Annotations and class path searching to mount your Wicket pages.

See https://github.com/wicketstuff/core/wiki/Annotation[documentation]

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-annotation</artifactId>
</dependency>
----

[source,properties]
----
wicket.stuff.annotationscan.enabled=true
wicket.stuff.annotationscan.packagename=
----

[[extension-wicketstuff-htmlcompressor]]
=== Wicketstuff - htmlcompressor

See https://github.com/wicketstuff/core/wiki/Htmlcompressor[documentation]

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-htmlcompressor</artifactId>
</dependency>
<dependency>
  <groupId>com.yahoo.platform.yui</groupId>
  <artifactId>yuicompressor</artifactId>
</dependency>
----

[source,properties]
----
wicket.stuff.htmlcompressor.enabled=true
wicket.stuff.htmlcompressor.features.*=
----

[[extension-core-serializer-deflated]]
=== Core - serializer-deflated

[source,properties]
----
wicket.core.serializer.deflated.enabled=false # has to be explicit enabled. deflates the outputstream, reducing page store size by up to a factor 8 at a price of about 2-20ms
----

[[extension-wicketstuff-serializer-fast2]]
=== Wicketstuff - serializer-fast2

See https://github.com/wicketstuff/core/wiki/FastSerializer2[documentation]

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-serializer-fast2</artifactId>
</dependency>
----


[source,properties]
----
wicket.stuff.serializer.fast2.enabled=true
----

[[extension-wicketstuff-serializer-kryo2]]
=== Wicketstuff - serializer-kryo2

See https://github.com/wicketstuff/core/wiki/Kryo-Serializer[documentation]

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-serializer-kryo2</artifactId>
</dependency>
----

[source,properties]
----
wicket.stuff.serializer.fast2.enabled=true
----


[[extension-wicketstuff-restannotations]]
=== Wicketstuff - restannotations

See https://github.com/wicketstuff/core/tree/master/wicketstuff-restannotations-parent[documentation]

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-restannotations</artifactId>
</dependency>
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-restannotations-json</artifactId>
</dependency>
----

[source,properties]
----
wicket.stuff.restannotations.enabled=true
wicket.stuff.restannotations.packagename= # the package name to scan for project specific annotations
----


[[extension-general-debugsettings]]
=== General - debugsettings

Wicket provides some debug settings which could be 

[source,properties]
----
wicket.core.settings.debug.enabled=false
wicket.core.settings.debug.developmentUtilitiesEnabled=true # Enables all of the panels and pages, etc, from wicket-devutils package.
wicket.core.settings.debug.ajaxDebugModeEnabled=true # if true: wicket-ajax-debug.js is added to header
wicket.core.settings.debug.componentUseCheck=true
wicket.core.settings.debug.outputMarkupContainerClassName=false
wicket.core.settings.debug.componentPathAttributeName=
----



[[extension-datastore]]
== Datastore

[[extension-datastore-httpsession]]
=== Datastore HttpSession

[source,properties]
----
wicket.core.datastore.httpsession.enabled=false
wicket.core.datastore.httpsession.pagesNumber=20 # the maximum number of pages the data store can hold
----


[[extension-datastore-cassandra]]
=== Datastore cassandra

See https://github.com/wicketstuff/core/wiki/DataStores[Documentation]

[source,properties]
----
wicket.stuff.datastore.cassandra.enabled=true
wicket.stuff.datastore.cassandra.contact-points= #comma-separated list 
wicket.stuff.datastore.cassandra.table-name=pagestore
wicket.stuff.datastore.cassandra.keyspace-name=wicket
wicket.stuff.datastore.cassandra.record-ttl=30
wicket.stuff.datastore.cassandra.record-ttl-unit=minutes
wicket.stuff.datastore.cassandra.session-size=2
wicket.stuff.datastore.cassandra.session-unit=megabytes
----

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-datastore-cassandra</artifactId>
</dependency>
----

[[extension-datastore-hazelcast]]
=== Datastore hazelcast

See https://github.com/wicketstuff/core/wiki/DataStores[Documentation]

[source,properties]
----
wicket.stuff.datastore.hazelcast.enabled=true
wicket.stuff.datastore.hazelcast.session-size=2L 
wicket.stuff.datastore.hazelcast.session-unit=megabytes
----

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-datastore-hazelcast</artifactId>
</dependency>
<dependency>
  <groupId>com.hazelcast</groupId>
  <artifactId>hazelcast</artifactId>
</dependency>
----

[[extension-datastore-memcached]]
=== Datastore memcached

See https://github.com/wicketstuff/core/wiki/DataStores[Documentation]

[source,properties]
----
wicket.stuff.datastore.memcached.enabled=true
wicket.stuff.datastore.memcached.session-size=2L 
wicket.stuff.datastore.memcached.session-unit=megabytes
wicket.stuff.datastore.memcached.expiration-time=30
wicket.stuff.datastore.memcached.port=11211
wicket.stuff.datastore.memcached.server-names=
wicket.stuff.datastore.memcached.shutdown-timeout=30
wicket.stuff.datastore.memcached.shutdown-timeout-unit=minutes
----

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-datastore-memcached</artifactId>
</dependency>
----

[[extension-datastore-redis]]
=== Datastore redis

See https://github.com/wicketstuff/core/wiki/DataStores[Documentation]

[source,properties]
----
wicket.stuff.datastore.redis.enabled=true
wicket.stuff.datastore.redis.session-size=2L 
wicket.stuff.datastore.redis.session-unit=megabytes
wicket.stuff.datastore.redis.expiration-time=30
wicket.stuff.datastore.redis.port=11211
wicket.stuff.datastore.redis.server-names=
wicket.stuff.datastore.redis.shutdown-timeout=30
wicket.stuff.datastore.redis.shutdown-timeout-unit=minutes
----

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-datastore-redis</artifactId>
</dependency>
----


[[extension-wicketstuff-jamon]]
=== Wicketstuff - JAMon

Used to monitor page requests. Provides a statistic page.

See https://github.com/wicketstuff/core/blob/master/jamon-parent/[Github]

[source,properties]
----
wicket.stuff.monitoring.jamon.enabled=true
wicket.stuff.monitoring.jamon.include-source-name-in-monitor-label=true
wicket.stuff.monitoring.jamon.mountPage=/monitoring/jamon # the url to which the statistic page is mounted
----

[source,xml]
----
<dependency>
  <groupId>org.wicketstuff</groupId>
  <artifactId>wicketstuff-jamon</artifactId>
</dependency>
----

NOTE: JAMon includes hazelcast to gather statistics. You may need to disable the datastore hazelcast support: <<extension-datastore-hazelcast>>

[[extension-devutils]]
=== Devutils

[source,xml]
----
<dependency>
  <groupId>org.apache.wicket</groupId>
  <artifactId>wicket-devutils</artifactId>
</dependency>
----

[[extension-devutils-diskstorebrowser]]
==== Devutils - diskstorebrowser

[source,properties]
----
wicket.external.development.devutils.diskstorebrowser.enabled=false
wicket.external.development.devutils.diskstorebrowser.mountPage=devutils/diskstore/browser
----

[[extension-devutils-inspector]]
==== Devutils - inspector

[source,properties]
----
wicket.external.development.devutils.diskstorebrowser.enabled=false
wicket.external.development.devutils.diskstorebrowser.mountPage=devutils/diskstore/browser
----

[[extension-devutils-statelesschecker]]
==== Devutils - statelesschecker

[source,properties]
----
wicket.external.development.devutils.interceptor.enableLiveSessionsPage=false
wicket.external.development.devutils.interceptor.liveSessionPageMount=devutils/inspector/live-session-page
----

[[extension-wicketsource]]
=== Wicket-Source

See https://github.com/jennybrown8/wicket-source/wiki[documentation]

[source,xml]
----
<dependency>
	<groupId>com.github.jennybrown8.wicket-source</groupId>
	<artifactId>wicket-source</artifactId>
</dependency>
----

[source,properties]
----
wicket.external.development.wicketsource.enabled=false
----

[[extension-springboot-devtools]]
==== Spring Boot - DevTools

See https://spring.io/blog/2015/06/17/devtools-in-spring-boot-1-3[Spring Boot DevTools]

The project tries to improve the development-time experience when working with Spring Boot. 
There is a problem with Wickets default and other serializer (fast2, kryo2...). See https://github.com/MarcGiffing/wicket-spring-boot/issues/29[Issue 29]
If the spring-boot-devtools dependency is in the classpath a 
link:/wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevToolsSerializer.java[special Spring serializer]
will be activated. 

All other serializer will only be activated if the Spring Boot DevTools dependency is not in the classpath.

[source,xml]
----
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>
----

[[war_deployment]]
== Configure as WAR for deploy on Servlet Container

#115

To run the application as a *war* file in the Servlet Container like Tomcat you have to do the following steps.

* Set the packaging to war in your build system (maven, gradle)
* Mark the *spring-boot-starter-tomcat* dependency as provided
* Use the Spring provided plugins to repackage the project
* Extend from SpringBootServletInitializer
** Here you can optionally set configurations which only apply when deployed as a war in a Servlet Container  
** http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging[maven]
** http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-gradle-repackage-configuration[gradle] 


[source,java]
----
@SpringBootApplication
public class WicketApplication extends SpringBootServletInitializer  {

//Can be used while developing
public static void main(String[] args) throws Exception {
	new SpringApplicationBuilder()
		.sources(WicketApplication.class)
		.run(args);
}

//Executed when deployed as a WAR in a Servlet container.
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
	builder.properties( WebSocketWicketWebInitializerAutoConfiguration.REGISTER_SERVER_ENDPOINT_ENABLED + "=false" );
	return super.configure( builder );
}

}
----

If you already extend from a Wicket specific class you can create a separated class which extends from SpringBootServletInitializer (https://github.com/MarcGiffing/wicket-spring-boot/issues/115#issuecomment-311712298).


================================================
FILE: pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.giffing.wicket.spring.boot.starter</groupId>
	<artifactId>wicket-spring-boot-starter-parent</artifactId>
	<version>4.1.1</version>
	<packaging>pom</packaging>

	<name>Wicket Spring Boot Starter Parent</name>
	<description>
		This project (should) makes it easy to create 
		Wicket projects with a minimum of configuration effort. 
		Is uses Spring Boot to autoconfigure Wickets core and extension 
		with an reasonable default value which can be overridden 
		over property files.
		
		This parent project holds default configuration for the underlying 
		sub modules 
	</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.5.5</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<url>https://github.com/MarcGiffing/wicket-spring-boot</url>
	<licenses>
		<license>
			<name>Apache License, Version 2.0</name>
			<url>http://www.apache.org/licenses/LICENSE-2.0</url>
		</license>
	</licenses>
	<scm>
		<url>https://github.com/MarcGiffing/wicket-spring-boot/</url>
		<connection>scm:git:https://github.com/MarcGiffing/wicket-spring-boot.git</connection>
		<tag>wicket-spring-boot-starter-parent-3.1.2</tag>
	</scm>

	<developers>
		<developer>
			<id>mgiffing</id>
			<name>Marc Giffing</name>
			<roles>
				<role>Project lead</role>
			</roles>
		</developer>
	</developers>


	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>17</java.version>
		<apache-shiro.version>2.0.5</apache-shiro.version>
		<wicket.version>10.6.0</wicket.version>
		<wicketstuff.version>10.6.0</wicketstuff.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<!-- internal dependencies -->
			<dependency>
				<groupId>com.giffing.wicket.spring.boot.starter</groupId>
				<artifactId>wicket-spring-boot-context</artifactId>
				<version>${project.version}</version>
			</dependency>
			<dependency>
				<groupId>com.giffing.wicket.spring.boot.starter</groupId>
				<artifactId>wicket-spring-boot-starter</artifactId>
				<version>${project.version}</version>
			</dependency>
			<!-- Wicket dependencies -->
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-core</artifactId>
				<version>${wicket.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-auth-roles</artifactId>
				<version>${wicket.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-ioc</artifactId>
				<version>${wicket.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-extensions</artifactId>
				<version>${wicket.version}</version>
			</dependency>
            <dependency>
                <groupId>org.apache.wicket</groupId>
                <artifactId>wicket-request</artifactId>
                <version>${wicket.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.wicket</groupId>
                <artifactId>wicket-spring</artifactId>
                <version>${wicket.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.wicket</groupId>
                <artifactId>wicket-util</artifactId>
                <version>${wicket.version}</version>
            </dependency>
			<!-- Wicketstuff dependencies -->
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-annotation</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-htmlcompressor</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency> <!-- required for the wicketstuff-htmlcompressor -->
				<groupId>com.yahoo.platform.yui</groupId>
				<artifactId>yuicompressor</artifactId>
				<version>2.4.8</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-serializer-kryo2</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-serializer-fast2</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-restannotations</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-restannotations-json</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-springreference</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff.htmlvalidator</groupId>
				<artifactId>wicketstuff-htmlvalidator</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-jamon</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>

			<!-- Wicket other dependencies -->
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-bean-validation</artifactId>
				<version>${wicket.version}</version>
			</dependency>
			<dependency>
				<groupId>de.agilecoders.wicket.webjars</groupId>
				<artifactId>wicket-webjars</artifactId>
				<version>4.0.11</version>
			</dependency>
			<!-- Wicket datastore dependencies -->
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-datastore-common</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-datastore-cassandra</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-datastore-hazelcast</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-datastore-memcached</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-datastore-redis</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<!-- Wicket websockets -->
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-native-websocket-javax</artifactId>
				<version>${wicket.version}</version>
			</dependency>
			<!-- Wicket development dependencies -->
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-devutils</artifactId>
				<version>${wicket.version}</version>
			</dependency>
			<dependency>
				<groupId>com.github.jennybrown8.wicket-source</groupId>
				<artifactId>wicket-source</artifactId>
				<version>9.0.0</version>
			</dependency>
			<dependency>
				<groupId>org.apache.wicket</groupId>
				<artifactId>wicket-tester</artifactId>
				<version>${wicket.version}</version>
			</dependency>
			<!-- Security - Apache Shiro -->
			<dependency>
				<groupId>org.wicketstuff</groupId>
				<artifactId>wicketstuff-shiro</artifactId>
				<version>${wicketstuff.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.shiro</groupId>
				<artifactId>shiro-spring-boot-web-starter</artifactId>
				<version>${apache-shiro.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<distributionManagement>
		<snapshotRepository>
			<id>ossrh</id>
			<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
		</snapshotRepository>
		<repository>
			<id>ossrh</id>
			<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
		</repository>
	</distributionManagement>
	<profiles>
		<profile>
			<id>release</id>
			<modules>
				<module>wicket-spring-boot-context</module>
				<module>wicket-spring-boot-starter</module>
				<module>wicket-spring-boot-starter-example</module>
			</modules>
			<build>
				<plugins>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-gpg-plugin</artifactId>
						<version>3.2.8</version>
						<executions>
							<execution>
								<id>sign-artifacts</id>
								<phase>verify</phase>
								<goals>
									<goal>sign</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-source-plugin</artifactId>
                        <version>3.3.1</version>
						<executions>
							<execution>
								<id>attach-sources</id>
								<goals>
									<goal>jar-no-fork</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
					<plugin>
						<groupId>org.apache.maven.plugins</groupId>
						<artifactId>maven-javadoc-plugin</artifactId>
                        <version>3.11.3</version>
						<executions>
							<execution>
								<id>attach-javadocs</id>
								<goals>
									<goal>jar</goal>
								</goals>
							</execution>
						</executions>
						<configuration>
							<source>${java.version}</source>
						</configuration>
					</plugin>
                    <plugin>
                        <groupId>org.sonatype.plugins</groupId>
                        <artifactId>nexus-staging-maven-plugin</artifactId>
                        <version>1.7.0</version>
                        <extensions>true</extensions>
                        <configuration>
                            <serverId>ossrh</serverId>
                            <nexusUrl>https://ossrh-staging-api.central.sonatype.com</nexusUrl>
                            <autoReleaseAfterClose>true</autoReleaseAfterClose>
                        </configuration>
                    </plugin>
				</plugins>
			</build>
		</profile>
		<profile>
			<id>default</id>
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
			<modules>
				<module>wicket-spring-boot-context</module>
				<module>wicket-spring-boot-starter</module>
				<module>wicket-spring-boot-starter-example</module>
			</modules>
		</profile>
	</profiles>
	<build>
		<plugins>
			<plugin>
				<groupId>org.sonatype.plugins</groupId>
				<artifactId>nexus-staging-maven-plugin</artifactId>
				<version>1.7.0</version>
				<extensions>true</extensions>
				<configuration>
					<serverId>ossrh</serverId>
					<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
					<autoReleaseAfterClose>true</autoReleaseAfterClose>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<repositories>
		<repository>
			<id>apache.snapshots.https</id>
			<url>https://repository.apache.org/content/repositories/snapshots</url>
			<releases>
				<enabled>false</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>sonatype</id>
			<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
			<releases>
				<enabled>false</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
	</repositories>
</project>


================================================
FILE: wicket-spring-boot-context/.gitignore
================================================
/target/
/.settings/
.classpath
.project

================================================
FILE: wicket-spring-boot-context/README.md
================================================
# wicket-spring-boot-context

Advanced Level, a typical spring-boot user does not need this module.

###Description

This module is used to create **custom auto configuration classes**. All necessary code
is decoupled, thus a developer does not depend on the wicket-spring-boot-starter module
itself.

All dependencies in the wicket-spring-boot-context module are scoped as `provided` so the
user of the context module is not forced to use any spring/wicket dependencies.

Each configuration class should be marked with the annotation **@ApplicationInitExtension** 
and has to implement `WicketApplicationInitConfiguration`.

The module contains also common exceptions which should be used on e.g. configuration errors.

Here is also the place for common configuration checks which can be used by other projects.
The annotation **@ConditionalOnWicket**  can be used to activate a configuration only on a 
specific version of `Apache Wicket`.


================================================
FILE: wicket-spring-boot-context/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>com.giffing.wicket.spring.boot.starter</groupId>
		<artifactId>wicket-spring-boot-starter-parent</artifactId>
		<version>4.1.1</version>
	</parent>

	<artifactId>wicket-spring-boot-context</artifactId>
	<name>Context</name>
	<description>
		Provides several constructs which allow developers to build
                custom auto-configuration classes.
	</description>

	<dependencies>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-core</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-auth-roles</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
			<scope>provided</scope>
		</dependency>
	</dependencies>

</project>

================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/condition/ConditionalOnWicket.java
================================================
package com.giffing.wicket.spring.boot.context.condition;

import org.springframework.context.annotation.Conditional;

import java.lang.annotation.*;

/**
 * Conditional annotation to pre-check if an extension should be picked for autoconfiguration.
 * <p>
 * You can define the major Wicket version on which the extension
 * should or should not be executed.
 *
 * @author Marc Giffing
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(WicketSettingsCondition.class)
public @interface ConditionalOnWicket {

    /**
     * @return The major java version to check with the current value
     */
    int value();

    /**
     * @return Defines how the given major version should be checked with the current version
     */
    Range range() default Range.EQUALS_OR_HIGHER;


    enum Range {
        /**
         * The Wicket major version equals the
         */
        EQUALS,
        /**
         * The Wicket major version equals or is newer
         */
        EQUALS_OR_HIGHER,

        /**
         * The Wicket major version equals or is lower
         */
        EQUALS_OR_LOWER,

    }
}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/condition/WicketSettingsCondition.java
================================================
package com.giffing.wicket.spring.boot.context.condition;

import com.giffing.wicket.spring.boot.context.condition.ConditionalOnWicket.Range;
import org.apache.wicket.settings.FrameworkSettings;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 * Retrieves the current major Wicket Version from the classpath and matches it against
 * the given conditional value in the {@link ConditionalOnWicket} annotation.
 *
 * @author Marc Giffing
 */
public class WicketSettingsCondition extends SpringBootCondition {

    @Override
    public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String wicketVersion = retrieveWicketVersion();

        Map<String, Object> attributes = metadata
                .getAnnotationAttributes(ConditionalOnWicket.class.getName());
        Range range = (Range) attributes.get("range");
        int expectedVersion = (int) attributes.get("value");
        String[] splittedWicketVersion = wicketVersion.split("\\.");
        int majorWicketVersion = Integer.parseInt(splittedWicketVersion[0]);
        return getMatchOutcome(range, majorWicketVersion, expectedVersion);
    }

    protected ConditionOutcome getMatchOutcome(Range range, int runningVersion,
                                               int expectedVersion) {
        boolean match = matches(range, expectedVersion, runningVersion);
        return new ConditionOutcome(match, getMessage(match, range, runningVersion, expectedVersion));
    }

    private boolean matches(Range range, int expectedVersion, int runningVersion) {
        return switch (range) {
            case EQUALS -> runningVersion == expectedVersion;
            case EQUALS_OR_LOWER -> runningVersion <= expectedVersion;
            case EQUALS_OR_HIGHER -> runningVersion >= expectedVersion;
        };
    }

    private String getMessage(boolean matches, Range range, int runningVersion,
                              int expectedVersion) {
        if (matches) {
            return "Wicket version matches current: " + runningVersion + " " + range + " expected: " + expectedVersion;
        } else {
            return "Wicket version does not match current: " + runningVersion + " " + range + " expected: " + expectedVersion;
        }
    }

    private String retrieveWicketVersion() {

        String implVersion = null;
        var pkg = FrameworkSettings.class.getPackage();
        if (pkg != null) {
            implVersion = pkg.getImplementationVersion();
        }
        return StringUtils.hasLength(implVersion) ? implVersion : "0";
    }


}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/exceptions/WicketSpringBootException.java
================================================
package com.giffing.wicket.spring.boot.context.exceptions;

/**
 * General extension from which all exception should extend
 *
 * @author Marc Giffing
 */
public class WicketSpringBootException extends RuntimeException {

    public WicketSpringBootException() {
        super();
    }

    public WicketSpringBootException(String message,
                                     Throwable cause,
                                     boolean enableSuppression,
                                     boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

    public WicketSpringBootException(String message, Throwable cause) {
        super(message, cause);
    }

    public WicketSpringBootException(String message) {
        super(message);
    }

    public WicketSpringBootException(Throwable cause) {
        super(cause);
    }

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/exceptions/extensions/ExtensionMisconfigurationException.java
================================================
package com.giffing.wicket.spring.boot.context.exceptions.extensions;

import com.giffing.wicket.spring.boot.context.exceptions.WicketSpringBootException;

/**
 * This exception should be thrown if a extension misconfiguration is detected.
 * <p>
 * It can e.g. thrown if you detect an extension which configures the same aspect
 * as two serializers
 *
 * @author Marc Giffing
 */
public class ExtensionMisconfigurationException extends WicketSpringBootException {

    public ExtensionMisconfigurationException(String message) {
        super(message);
    }

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/ApplicationInitExtension.java
================================================
package com.giffing.wicket.spring.boot.context.extensions;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * To be independent of Springs annotation this annotation was introduced
 * which is a replacement for the {@link Component} annotation.
 * <p>
 * In the future, you may introduce different configuration options.
 *
 * @author Marc Giffing
 */
@Configuration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Order(ApplicationInitExtension.DEFAULT_PRECEDENCE)
public @interface ApplicationInitExtension {

    int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;

    int DEFAULT_PRECEDENCE = Integer.MAX_VALUE / 2;

    int LOWEST_PRECEDENCE = Integer.MAX_VALUE;

    String value() default "";
}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/WicketApplicationInitConfiguration.java
================================================
package com.giffing.wicket.spring.boot.context.extensions;

import org.apache.wicket.protocol.http.WebApplication;

/**
 * To provide custom modification of the init Method of Wickets {@link WebApplication}
 * class. An extension class should implement this interface. All classes implementing
 * this interface are injected in Wickets starter WicketBootWebApplication class as a list and on
 * each implementation the init method is called with the current {@link WebApplication}.
 * <p>
 * Every Spring Bean regardless to the package location which implements this interface
 * will be considered as an extension. This means that you can write your own extension
 * in a different project. You only have to ensure that the class will picked up by Springs
 * component scan (or other bean configuration possibilities.
 *
 * @author Marc Giffing
 */
public interface WicketApplicationInitConfiguration {

    /**
     * With the given {@link WebApplication} the
     * {@link WicketApplicationInitConfiguration}s can modify/extend the init()
     * method of the {@link WebApplication}.
     *
     * @param webApplication the current {@link WebApplication}
     */
    void init(WebApplication webApplication);
}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/boot/actuator/WicketAutoConfig.java
================================================
package com.giffing.wicket.spring.boot.context.extensions.boot.actuator;

import java.io.Serializable;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

import lombok.Getter;
import org.springframework.util.Assert;

@Getter
public class WicketAutoConfig implements Serializable {

	private final String key;

	private final Map<String, Object> details;

	private WicketAutoConfig(Builder builder) {
		Assert.notNull(builder, "Builder must not be null");
		this.key = builder.configurationClass != null ? builder.configurationClass.getSimpleName() : null;
		this.details = Collections.unmodifiableMap(builder.details);
	}

	public static class Builder {

		private final Class<?> configurationClass;

		private Map<String, Object> details;

		public Builder() {
			this.configurationClass = null;
			this.details = new LinkedHashMap<>();
		}

		public Builder(Class<?> configurationClass) {
			Assert.notNull(configurationClass, "ConfigurationClass must not be null");
			this.configurationClass = configurationClass;
			this.details = new LinkedHashMap<>();
		}

		public Builder(Class<?> configurationClass, Map<String, ?> details) {
			Assert.notNull(configurationClass, "ConfigurationClass must not be null");
			Assert.notNull(details, "Details must not be null");
			this.configurationClass = configurationClass;
			this.details = new LinkedHashMap<>(details);
		}

		public Builder withDetail(String key, Object value) {
			Assert.notNull(key, "Key must not be null");
			this.details.put(key, value);
			return this;
		}

		public WicketAutoConfig build() {
			return new WicketAutoConfig(this);
		}

	}
	
}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/boot/actuator/WicketEndpointRepository.java
================================================
package com.giffing.wicket.spring.boot.context.extensions.boot.actuator;

import java.util.List;

/**
 * This repository can be used to collect Wicket configuration information which can (e.g.) be displayed in
 * a Spring Boot Actuator Wicket endpoint.
 *
 * @author Marc Giffing
 */
public interface WicketEndpointRepository {

    void add(WicketAutoConfig autoconfig);

    List<WicketAutoConfig> getConfigs();

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/DurationUnit.java
================================================
package com.giffing.wicket.spring.boot.context.extensions.types;

public enum DurationUnit {

    MILLISECONDS,
    SECONDS,
    MINUTES,
    HOURS,
    DAYS,

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/SessionUnit.java
================================================
package com.giffing.wicket.spring.boot.context.extensions.types;

public enum SessionUnit {
    BYTES,
    KILOBYTES,
    MEGABYTES,
    TERABYTES
}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/TypeParser.java
================================================
package com.giffing.wicket.spring.boot.context.extensions.types;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.wicket.util.lang.Bytes;

import com.giffing.wicket.spring.boot.context.exceptions.WicketSpringBootException;
import java.time.Duration;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class TypeParser {

	public static Bytes parse(Long size, SessionUnit sessionUnit){
        return switch (sessionUnit) {
            case BYTES -> Bytes.bytes(size);
            case KILOBYTES -> Bytes.kilobytes(size);
            case MEGABYTES -> Bytes.megabytes(size);
            case TERABYTES -> Bytes.terabytes(size);
        };
    }
	
	public static Duration parse(Long time, DurationUnit durationUnit){
        return switch (durationUnit) {
            case DAYS -> Duration.ofDays(time);
            case HOURS -> Duration.ofHours(time);
            case MILLISECONDS -> Duration.ofMillis(time);
            case MINUTES -> Duration.ofMinutes(time);
            case SECONDS -> Duration.ofSeconds(time);
        };

    }
	
	
}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketAccessDeniedPage.java
================================================
package com.giffing.wicket.spring.boot.context.scan;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.apache.wicket.Page;
import org.apache.wicket.settings.ApplicationSettings;

/**
 * This annotation can be used to mark a {@link Page} which will automatically configured
 * as the access denied page in the {@link ApplicationSettings}.
 *
 * @author Marc Giffing
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface WicketAccessDeniedPage {

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketExpiredPage.java
================================================
package com.giffing.wicket.spring.boot.context.scan;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.apache.wicket.Page;
import org.apache.wicket.settings.ApplicationSettings;

/**
 * This annotation can be used to mark a {@link Page} which will automatically configured
 * as the page expired error page in the {@link ApplicationSettings}.
 *
 * @author Marc Giffing
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface WicketExpiredPage {

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketHomePage.java
================================================
package com.giffing.wicket.spring.boot.context.scan;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;

/**
 * Should be used to mark the home page which should automatically configures in the {@link WebApplication}.
 * Only one {@link Page} should be marked with this annotation.
 *
 * @author Marc Giffing
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface WicketHomePage {

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketInternalErrorPage.java
================================================
package com.giffing.wicket.spring.boot.context.scan;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.apache.wicket.Page;
import org.apache.wicket.settings.ApplicationSettings;

/**
 * This annotation can be used to mark a {@link Page} which will automatically configured
 * as the internal error page in the {@link ApplicationSettings}.
 *
 * @author Marc Giffing
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface WicketInternalErrorPage {

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketSignInPage.java
================================================
package com.giffing.wicket.spring.boot.context.scan;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;

/**
 * Should be used to mark the sign-in page which should be automatically configured in the {@link WebApplication} class.
 * Only one {@link Page} should be marked with this annotation.
 *
 * @author Marc Giffing
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface WicketSignInPage {

}


================================================
FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/security/AuthenticatedWebSessionConfig.java
================================================
package com.giffing.wicket.spring.boot.context.security;

import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession;
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;

/**
 * Enables the dynamic configuration of the {@link AbstractAuthenticatedWebSession} for the
 * {@link AuthenticatedWebApplication}. E.g. if spring security is present it provides a default WebSession
 * configuration.
 * <p>
 * Security providers should provide different implementations.
 *
 * @author Marc Giffing
 */
public interface AuthenticatedWebSessionConfig {

    Class<? extends AbstractAuthenticatedWebSession> getAuthenticatedWebSessionClass();

}


================================================
FILE: wicket-spring-boot-starter/.gitignore
================================================
/target/
/.settings/
/.classpath
.project
/.apt_generated/
.factorypath

================================================
FILE: wicket-spring-boot-starter/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>com.giffing.wicket.spring.boot.starter</groupId>
		<artifactId>wicket-spring-boot-starter-parent</artifactId>
		<version>4.1.1</version>
		<relativePath>..</relativePath>
	</parent>

	<artifactId>wicket-spring-boot-starter</artifactId>
	<name>Wicket Spring Boot Starter</name>
	<description>
                Enables and configures Apache Wicket from within a Spring Boot
                Application. Used **only** in combination with Spring Boot.
	</description>

	<dependencies>

		<!-- Internal -->

		<dependency>
			<groupId>com.giffing.wicket.spring.boot.starter</groupId>
			<artifactId>wicket-spring-boot-context</artifactId>
		</dependency>

		<!-- Spring -->

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-actuator</artifactId>
			<scope>provided</scope>
		</dependency>
		<!-- Wicket -->

		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-auth-roles</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-ioc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-spring</artifactId>
		</dependency>

		<!-- The following modules are *not* linked. They are used from the starters 
			conditional configuration (if a module exists, then some comfiguration is 
			applied). -->

		<!-- Wicketstuff -->

		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-annotation</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-htmlcompressor</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-serializer-kryo2</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-serializer-fast2</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-bean-validation</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-restannotations</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-springreference</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-shiro</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring-boot-web-starter</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-jamon</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- Wicket Deployment -->

		<dependency>
			<groupId>de.agilecoders.wicket.webjars</groupId>
			<artifactId>wicket-webjars</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- Wicket Datastore -->

		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-datastore-cassandra</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-datastore-hazelcast</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-datastore-memcached</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.wicketstuff</groupId>
			<artifactId>wicketstuff-datastore-redis</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- Wicket Websockets -->

		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-native-websocket-javax</artifactId>
			<scope>provided</scope>
		</dependency>

		<!-- Wicket / Spring Development -->

		<dependency>
			<groupId>com.github.jennybrown8.wicket-source</groupId>
			<artifactId>wicket-source</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-devutils</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
	</dependencies>

	<build>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**</include>
				</includes>
				<excludes>
					<exclude>**/*.java</exclude>
				</excludes>
			</resource>
		</resources>

	</build>

</project>


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/WicketAutoConfiguration.java
================================================
package com.giffing.wicket.spring.boot.starter;

import com.giffing.wicket.spring.boot.starter.app.classscanner.ClassCandidateScannerConfiguration;
import com.giffing.wicket.spring.boot.starter.app.verifier.WicketDependencyVersionChecker;
import com.giffing.wicket.spring.boot.starter.configuration.CustomAnnotationBeanNameGenerator;
import com.giffing.wicket.spring.boot.starter.configuration.extensions.WicketExtensionLocation;
import com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.general.GeneralSettingsProperties;
import com.giffing.wicket.spring.boot.starter.web.WicketWebInitializer;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * The main starter configuration class which will be called by spring.
 * The class is configured in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
 *
 * @author Marc Giffing
 */
@Configuration
@Import({
        WicketDependencyVersionChecker.class,
        ClassCandidateScannerConfiguration.class,
        WicketBootWebApplicationAutoConfiguration.class,
        WicketWebInitializer.class
})
@EnableConfigurationProperties({GeneralSettingsProperties.class})
@ComponentScan(basePackageClasses = WicketExtensionLocation.class, nameGenerator = CustomAnnotationBeanNameGenerator.class)
public class WicketAutoConfiguration {

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/WicketBootWebApplicationAutoConfiguration.java
================================================
package com.giffing.wicket.spring.boot.starter;

import com.giffing.wicket.spring.boot.starter.app.WicketBootSecuredWebApplication;
import com.giffing.wicket.spring.boot.starter.app.WicketBootStandardWebApplication;
import com.giffing.wicket.spring.boot.starter.app.WicketBootWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Configures the standard {@link WicketBootWebApplication} configuration
 * without security options.
 * <p>
 * The {@link WicketBootStandardWebApplication} will only be activated if there
 * is no other {@link WicketBootWebApplication} present and if there is not
 * {@link WicketBootSecuredWebApplication} present.
 *
 * @author Marc Giffing
 */
@Configuration
@ConditionalOnMissingBean({WicketBootSecuredWebApplication.class, WicketBootWebApplication.class})
public class WicketBootWebApplicationAutoConfiguration {

    @Bean
    public WicketBootStandardWebApplication wicketBootWebApplication() {
        return new WicketBootStandardWebApplication();
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootSecuredWebApplication.java
================================================
package com.giffing.wicket.spring.boot.starter.app;

import java.util.ArrayList;
import java.util.List;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.wicket.Page;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession;
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.context.scan.WicketHomePage;
import com.giffing.wicket.spring.boot.context.scan.WicketSignInPage;
import com.giffing.wicket.spring.boot.context.security.AuthenticatedWebSessionConfig;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidate;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidatesHolder;
import com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.general.GeneralSettingsProperties;

/**
 * Default Wicket Application which should be subclassed by framework clients to
 * enable autoconfiguration with help of Spring Boot.
 * 
 * It automatically configures the {@link SpringComponentInjector} to 
 * enable injection of Spring components via the {@link SpringBean} annotation.
 * 
 * Beside Springs injection support it also automatically enables security support.
 * You also have to add a security provider like Spring Security (@link SpringSecurityConfig)
 * or Apache shiro. 
 * 
 * To initialize the application in an decoupled way a list of {@link WicketApplicationInitConfiguration}
 * is injected as a list in this class. Each configuration item will be called in the init method.
 * 
 * @author Marc Giffing
 *
 */
@RequiredArgsConstructor
@Slf4j
public class WicketBootSecuredWebApplication extends AuthenticatedWebApplication implements WicketBootWebApplication {

	@Autowired
	@Getter
	private ApplicationContext applicationContext;
	
	@Autowired
	@Getter
	private GeneralSettingsProperties generalSettingsProperties;

	/**
	 * Injects all active extension which matches the predefined conditions. May be empty
	 * if no extension matches the given preconditions.
	 */
	@Autowired
	@Getter
	private List<WicketApplicationInitConfiguration> configurations = new ArrayList<>();
	
	@Autowired
	private WicketClassCandidatesHolder classCandidates;
	
	@Autowired
	private WicketEndpointRepository wicketEndpointRepository;
	
	@Override
	protected void init() {
		super.init();
	    
		getComponentInstantiationListeners().add(new SpringComponentInjector(this, applicationContext));
		
		WicketAutoConfig.Builder builder = new WicketAutoConfig.Builder(this.getClass());
		wicketEndpointRepository.add(builder
				.withDetail("signInPages", classCandidates.getSignInPageCandidates())
				.withDetail("homePages", classCandidates.getHomePageCandidates())
				.build());
		
		for (WicketApplicationInitConfiguration configuration : configurations) {
			log.info("init-config: {}", configuration.getClass().getName());
			configuration.init(this);
		}
		
	}
	
	@Override
	public RuntimeConfigurationType getConfigurationType() {
		return generalSettingsProperties.getConfigurationType();
	}
	
	@Override
	protected Class<? extends AbstractAuthenticatedWebSession> getWebSessionClass() {
		return applicationContext.getBean(AuthenticatedWebSessionConfig.class).getAuthenticatedWebSessionClass();
	}

	@SuppressWarnings("unchecked")
	@Override
	protected Class<? extends WebPage> getSignInPageClass() {
		if(classCandidates.getSignInPageCandidates().isEmpty()){
			throw new IllegalStateException("Couldn't find sign in page - please annotate the sign in page with @" + WicketSignInPage.class.getName());
		}
		if(classCandidates.getSignInPageCandidates().size() > 1 ){
			String message = "Multiple sign in pages found - please annotate exactly one class with @" + WicketSignInPage.class.getName();
			message += "\n";
			for (WicketClassCandidate<WebPage> classCandidate : classCandidates.getSignInPageCandidates()) {
				message += "\t" + classCandidate.getCandidate() + "\n";
			}
			throw new IllegalStateException(message);
		}

		return classCandidates.getSignInPageCandidates().iterator().next().getCandidate();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Class<? extends Page> getHomePage() {
		if(classCandidates.getHomePageCandidates().isEmpty()){
			throw new IllegalStateException("Couldn't find home page - please annotate the home page with @" + WicketHomePage.class.getName());
		}
		if(classCandidates.getHomePageCandidates().size() > 1 ){
			String message = "Multiple home pages found - please annotate exactly one class with @" + WicketHomePage.class.getName();
			message += "\n";
			for(WicketClassCandidate<Page> classCandidate : classCandidates.getHomePageCandidates()) {
				message += "\t" + classCandidate.getCandidate() + "\n";
			}
			throw new IllegalStateException(message);
		}

		return classCandidates.getHomePageCandidates().iterator().next().getCandidate();
	}

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootStandardWebApplication.java
================================================
package com.giffing.wicket.spring.boot.starter.app;

import java.util.ArrayList;
import java.util.List;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.wicket.Page;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Lazy;

import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.context.scan.WicketHomePage;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidate;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidatesHolder;
import com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.general.GeneralSettingsProperties;

/**
 * Default Wicket Application which should be subclassed by framework clients to
 * enable autoconfiguration with help of Spring Boot.
 * 
 * It automatically configures the {@link SpringComponentInjector} to 
 * enable injection of Spring components via the {@link SpringBean} annotation.
 * 
 * To initialize the application in an decoupled way a list of {@link WicketApplicationInitConfiguration}
 * is injected as a list in this class. Each configuration item will be called in the init method.
 * 
 * @author Marc Giffing
 *
 */
@Lazy
@Slf4j
public class WicketBootStandardWebApplication extends WebApplication implements WicketBootWebApplication {

	@Autowired
	@Getter
	private ApplicationContext applicationContext;
	
	@Autowired
	@Getter
	private GeneralSettingsProperties generalSettingsProperties;
	
	/**
	 * Injects all active extension which matches the predefined conditions. May be empty
	 * if no extension matches the given preconditions.
	 */
	@Autowired(required = false)
	@Getter
	private List<WicketApplicationInitConfiguration> configurations = new ArrayList<>();
	
	@Autowired
	@Getter
	private WicketClassCandidatesHolder classCandidates;
	
	@Autowired
	private WicketEndpointRepository wicketEndpointRepository;
	
	@Override
	protected void init() {
		super.init();
	    
		getComponentInstantiationListeners().add(new SpringComponentInjector(this, applicationContext));
		
		WicketAutoConfig.Builder builder = new WicketAutoConfig.Builder(this.getClass());
		wicketEndpointRepository.add(builder
				.withDetail("signInPages", classCandidates.getSignInPageCandidates())
				.withDetail("homePages", classCandidates.getHomePageCandidates())
				.build());
		
		for (WicketApplicationInitConfiguration configuration : configurations) {
			log.info("init-config: {}", configuration.getClass().getName());
			configuration.init(this);
		}
		
	}
	
	@Override
	public RuntimeConfigurationType getConfigurationType() {
		return generalSettingsProperties.getConfigurationType();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Class<? extends Page> getHomePage() {
		if(classCandidates.getHomePageCandidates().isEmpty()){
			throw new IllegalStateException("Couldn't find home page - please annotate the home page with @" + WicketHomePage.class.getName());
		}
		if(classCandidates.getHomePageCandidates().size() > 1 ){
			StringBuilder message = new StringBuilder("Multiple home pages found - please annotate exactly one class with @" + WicketHomePage.class.getName());
			message.append("\n");
			for(var classCandidate : classCandidates.getHomePageCandidates()) {
				message.append("\t").append(classCandidate.getCandidate()).append("\n");
			}
			throw new IllegalStateException(message.toString());
		}

		return classCandidates.getHomePageCandidates().iterator().next().getCandidate();
	}


}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootWebApplication.java
================================================
package com.giffing.wicket.spring.boot.starter.app;

import org.apache.wicket.protocol.http.WebApplication;

import com.giffing.wicket.spring.boot.starter.web.WicketWebInitializer;

/**
 * All Wicket Spring Boot Starter {@link WebApplication} classes should
 * implement this interface to access the current configures
 * {@link WebApplication} bean within spring.
 * <p>
 * Look at {@link WicketWebInitializer} to see the dynamical retrieval of the
 * bean name with use of this interface.
 *
 * @author Marc Giffing
 */
public interface WicketBootWebApplication {

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/ClassCandidateScanner.java
================================================
package com.giffing.wicket.spring.boot.starter.app.classscanner;

import com.giffing.wicket.spring.boot.context.scan.*;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidate;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidatesHolder;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.WebPage;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;

import java.util.Collection;
import java.util.Collections;

/**
 * The candidate class scanner is used to find class with special annotations.
 *
 * @author Marc Giffing
 */
@RequiredArgsConstructor
public class ClassCandidateScanner {

    private final Environment environment;
    private final ResourceLoader resourceLoader;
    private final BeanFactory beanFactory;
    private final ClassLoader classLoader;
    private final WicketClassCandidatesHolder classCandidates;

    public void postConstruct() {
        var scanner = new ClassPathScanningCandidateComponentProvider(false);
        scanner.setEnvironment(this.environment);
        scanner.setResourceLoader(this.resourceLoader);
        scanner.addIncludeFilter(new AnnotationTypeFilter(SpringBootApplication.class));
        scanner.addIncludeFilter(new AnnotationTypeFilter(WicketHomePage.class));
        scanner.addIncludeFilter(new AnnotationTypeFilter(WicketSignInPage.class));
        scanner.addIncludeFilter(new AnnotationTypeFilter(WicketAccessDeniedPage.class));
        scanner.addIncludeFilter(new AnnotationTypeFilter(WicketExpiredPage.class));
        scanner.addIncludeFilter(new AnnotationTypeFilter(WicketInternalErrorPage.class));
        for (var basePackage : getMappingBasePackages(beanFactory)) {
            if (StringUtils.hasText(basePackage)) {
                classCandidates.getBasePackages().add(basePackage);
                var beanDefinitions = scanner.findCandidateComponents(basePackage);
                for (var beanDefinition : beanDefinitions) {
                    Class<?> beanClass;
                    try {
                        beanClass = ClassUtils.forName(beanDefinition.getBeanClassName(), classLoader);
                    } catch (ClassNotFoundException e) {
                        throw new IllegalStateException(e);
                    }
                    if (beanClass.isAnnotationPresent(WicketHomePage.class)) {
                        classCandidates.getHomePageCandidates()
                                .add(new WicketClassCandidate<>((Class<Page>) beanClass));
                    }
                    if (beanClass.isAnnotationPresent(WicketSignInPage.class)) {
                        classCandidates.getSignInPageCandidates()
                                .add(new WicketClassCandidate<>((Class<WebPage>) beanClass));
                    }
                    if (beanClass.isAnnotationPresent(WicketAccessDeniedPage.class)) {
                        classCandidates.getAccessDeniedPageCandidates()
                                .add(new WicketClassCandidate<>((Class<Page>) beanClass));
                    }
                    if (beanClass.isAnnotationPresent(WicketExpiredPage.class)) {
                        classCandidates.getExpiredPageCandidates()
                                .add(new WicketClassCandidate<>((Class<Page>) beanClass));
                    }
                    if (beanClass.isAnnotationPresent(WicketInternalErrorPage.class)) {
                        classCandidates.getInternalErrorPageCandidates()
                                .add(new WicketClassCandidate<>((Class<Page>) beanClass));
                    }
                    if (beanClass.isAnnotationPresent(SpringBootApplication.class)) {
                        classCandidates.setSpringBootMainClass(beanClass);
                    }
                }

            }
        }
    }

    private static Collection<String> getMappingBasePackages(BeanFactory beanFactory) {
        try {
            return AutoConfigurationPackages.get(beanFactory);
        } catch (IllegalStateException ex) {
            // no auto-configuration package registered yet
            return Collections.emptyList();
        }
    }

}

================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/ClassCandidateScannerConfiguration.java
================================================
package com.giffing.wicket.spring.boot.starter.app.classscanner;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;

import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidatesHolder;

@Configuration
@RequiredArgsConstructor
public class ClassCandidateScannerConfiguration {

    private final Environment environment;

    private final ResourceLoader resourceLoader;

    private final BeanFactory beanFactory;

    @Bean
    public WicketClassCandidatesHolder pageCandidates() {
        var result = new WicketClassCandidatesHolder();
        // TODO Why is the ClassCandidateScanner initialized?
        new ClassCandidateScanner(environment,
                resourceLoader,
                beanFactory,
                getClass().getClassLoader(),
                result)
                .postConstruct();
        return result;
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/candidates/WicketClassCandidate.java
================================================
package com.giffing.wicket.spring.boot.starter.app.classscanner.candidates;

import java.lang.ref.WeakReference;

/**
 * @param <T> candidate class type
 * @author Marc Giffing
 */
public class WicketClassCandidate<T> {

    private WeakReference<Class<T>> candidate;

    public WicketClassCandidate(Class<T> candidate) {
        this.candidate = new WeakReference<>(candidate);
    }

    public Class<T> getCandidate() {
        return candidate.get();
    }


}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/candidates/WicketClassCandidatesHolder.java
================================================
package com.giffing.wicket.spring.boot.starter.app.classscanner.candidates;

import java.util.HashSet;
import java.util.Set;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.WebPage;

/**
 * Holds class candidates which should be configured in Wicket.
 * It holds e.g. home page classes which should be configured in Wicket.
 * 
 * @author Marc Giffing
 *
 */
@Getter
@Setter
public class WicketClassCandidatesHolder {
	
	private Set<String> basePackages = new HashSet<>();
	
	private Class<?> springBootMainClass = null;
	
	private Set<WicketClassCandidate<Page>> homePageCandidates = new HashSet<>();
	
	private Set<WicketClassCandidate<WebPage>> signInPageCandidates = new HashSet<>();
	
	private Set<WicketClassCandidate<Page>> accessDeniedPageCandidates = new HashSet<>();
	
	private Set<WicketClassCandidate<Page>> expiredPageCandidates = new HashSet<>();
	
	private Set<WicketClassCandidate<Page>> internalErrorPageCandidates = new HashSet<>();

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyMismatchDetectedException.java
================================================
package com.giffing.wicket.spring.boot.starter.app.verifier;

import com.giffing.wicket.spring.boot.starter.app.verifier.WicketDependencyVersionChecker.MavenDependency;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.List;

/**
 * Should  be thrown if the version of wicket dependencies doesn't match the core dependency version
 *
 * @author Marc Giffing
 */
@Getter
@RequiredArgsConstructor
public class WicketDependencyMismatchDetectedException extends RuntimeException {

    private final String wicketCoreVersion;

    private final List<MavenDependency> dependencies;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionChecker.java
================================================
package com.giffing.wicket.spring.boot.starter.app.verifier;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;

import jakarta.annotation.PostConstruct;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternUtils;

@Configuration
@ConditionalOnProperty(prefix = WicketDependencyVersionCheckerProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@EnableConfigurationProperties({WicketDependencyVersionCheckerProperties.class})
@Slf4j
public class WicketDependencyVersionChecker implements ResourceLoaderAware {

    private static final String DEFAULT_RESOURCE_PATTERN = "/META-INF/maven/**/pom.properties";

    private static final String WICKETSTUFF_GROUPID = "org.wicketstuff";

    private static final String WICKET_JQUERYUI_GROUPID = "com.googlecode.wicket-jquery-ui";

    private static final String WICKET_CORE_GROUPID = "org.apache.wicket";

    private ResourcePatternResolver resourcePatternResolver;

    private final WicketDependencyVersionCheckerProperties props;

    @Autowired
    public WicketDependencyVersionChecker(WicketDependencyVersionCheckerProperties props) {
        this.props = props;
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
    }

    @PostConstruct
    public void detectWicketDependencyVersionMismatch() {
        var wicketMavenDependencies = collectWicketMavenDependencies();

        List<MavenDependency> mismatchVersionDependencies = new ArrayList<>();
        var versionMismatchFound = new AtomicBoolean(false);
        Optional<String> wicketCoreVersionOpt = findWicketCoreVersion(wicketMavenDependencies);
        wicketCoreVersionOpt.ifPresent(wicketCoreVersion -> {
            for (var mavenDependency : wicketMavenDependencies) {
                if (mavenDependency.groupId.equals(WICKET_CORE_GROUPID)
                        && !mavenDependency.version.equals(wicketCoreVersion)) {
                    log.error("########## INVALID WICKET VERSION DETECTED - CORE: {} - DEPENDENCY: {}",
                            wicketCoreVersion, mavenDependency);
                    versionMismatchFound.set(true);
                    mismatchVersionDependencies.add(mavenDependency);
                } else if (mavenDependency.groupId.equals(WICKETSTUFF_GROUPID) || mavenDependency.groupId.equals(WICKET_JQUERYUI_GROUPID)) {
                    var majorWicketCoreVersion = wicketCoreVersion.substring(0, wicketCoreVersion.indexOf('.'));
                    var majorMavenDependencyVersion = mavenDependency.version.substring(0, mavenDependency.version.indexOf('.'));
                    if (!majorWicketCoreVersion.equals(majorMavenDependencyVersion)) {
                        log.error("########## INVALID {} MAJOR VERSION DETECTED - WICKET: {} - DEPENDENCY: {}",
                                mavenDependency.groupId, majorWicketCoreVersion, majorMavenDependencyVersion);
                        versionMismatchFound.set(true);
                        mismatchVersionDependencies.add(mavenDependency);
                    }
                }

            }
        });


        if (versionMismatchFound.get() && props.isThrowExceptionOnDependencyVersionMismatch()) {
            throw new WicketDependencyMismatchDetectedException(wicketCoreVersionOpt.orElse("unknown"), mismatchVersionDependencies);
        }

    }

    private Optional<String> findWicketCoreVersion(List<MavenDependency> wicketMavenDependencies) {
        for (var wicketMavenDependency : wicketMavenDependencies) {
            if (wicketMavenDependency.groupId.equals(WICKET_CORE_GROUPID) && wicketMavenDependency.artifactId.equals("wicket-core")) {
                return Optional.of(wicketMavenDependency.version);
            }
        }
        return Optional.empty();
    }

    private List<MavenDependency> collectWicketMavenDependencies() {
        var packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + DEFAULT_RESOURCE_PATTERN;
        try {
            var resources = this.resourcePatternResolver.getResources(packageSearchPath);
            return collectWicketMavenDependencies(resources);
        } catch (IOException e) {
            // do not throw checked exception in @PostConstruct method to provide better JavaEE compatibility
            throw new IllegalStateException(e);
        }
    }

    private List<MavenDependency> collectWicketMavenDependencies(Resource[] resources) throws IOException {
        List<MavenDependency> wicketMavenDependencies = new ArrayList<>();
        for (var resource : resources) {
            if (resource.isReadable()
                    && resource.getURL().getPath().contains("wicket")) {

                var props = new Properties();
                props.load(resource.getInputStream());
                var groupId = (String) props.get("groupId");
                var artifactId = (String) props.get("artifactId");
                var version = (String) props.get("version");

                wicketMavenDependencies.add(new MavenDependency(groupId, artifactId, version));
            }
        }
        return wicketMavenDependencies;
    }

    @RequiredArgsConstructor
    public static class MavenDependency {
        public final String groupId;
        public final String artifactId;
        public final String version;

        @Override
        public String toString() {
            return groupId + ":" + artifactId + ":" + version;
        }
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionCheckerFailureAnalyzer.java
================================================
package com.giffing.wicket.spring.boot.starter.app.verifier;

import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
import org.springframework.boot.diagnostics.FailureAnalysis;

import com.giffing.wicket.spring.boot.starter.app.verifier.WicketDependencyVersionChecker.MavenDependency;

public class WicketDependencyVersionCheckerFailureAnalyzer extends AbstractFailureAnalyzer<WicketDependencyMismatchDetectedException> {

    @Override
    protected FailureAnalysis analyze(Throwable rootFailure, WicketDependencyMismatchDetectedException cause) {
        var descriptionMessage = new StringBuilder("One or more Wicket dependencies (jars) doesn't match the wicket-core dependency.\n\r"
                + "Wicket Core Version: %s%s".formatted(cause.getWicketCoreVersion(), System.lineSeparator()));
        for (MavenDependency dependency : cause.getDependencies()) {
            descriptionMessage.append("\t").append(dependency).append(System.lineSeparator());
        }

        String actionMessage = """
                Please check the Wicket versions configured in your dependency management system (Maven, Gradle, ...)
                You can disable this check via the property:
                \twicket.verifier.dependencies.enabled=false.
                You can prevent throwing the exception but still log the detected problems via the property:
                \twicket.verifier.dependencies.throw-exception-on-dependency-version-mismatch=false""";

        return new FailureAnalysis(descriptionMessage.toString(), actionMessage, cause);
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionCheckerProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.app.verifier;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;


@ConfigurationProperties(prefix = WicketDependencyVersionCheckerProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class WicketDependencyVersionCheckerProperties {

    public static final String PROPERTY_PREFIX = "wicket.verifier.dependencies";

    private boolean enabled = true;

    private boolean throwExceptionOnDependencyVersionMismatch = true;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/CustomAnnotationBeanNameGenerator.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.util.StringUtils;

/**
 * To prevent spring bean naming clashes with user defined beans we will
 * prefix each bean name with wicketextension and capitalize the from spring
 * generated bean name.
 *
 * @author Marc Giffing
 */
public class CustomAnnotationBeanNameGenerator extends AnnotationBeanNameGenerator {

    @Override
    public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
        return "wicketextension" + StringUtils.capitalize(super.generateBeanName(definition, registry));
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/WicketExtensionLocation.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions;

/**
 * Marker interface to locate the Wicket Extensions.
 * This class is used for Springs component scanning.
 *
 * @author Marc Giffing
 */
public interface WicketExtensionLocation {

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/csrf/CsrfAttacksPreventionConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.csrf;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.FetchMetadataResourceIsolationPolicy;
import org.apache.wicket.protocol.http.OriginResourceIsolationPolicy;
import org.apache.wicket.protocol.http.ResourceIsolationRequestCycleListener;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;


/**
 * Enables CSRF protection if the following condition matches.
 * <p>
 * 1. The {@link ResourceIsolationRequestCycleListener} class is in the classpath.
 * <p>
 * 2. The property {@link CsrfAttacksPreventionProperties#PROPERTY_PREFIX}.enabled has to be true (default = true)
 * <p>
 * The protection should be enabled by default cause the {@link ResourceIsolationRequestCycleListener} is located
 * in Wickets core project.
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = CsrfAttacksPreventionProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(value = org.apache.wicket.protocol.http.ResourceIsolationRequestCycleListener.class)
@EnableConfigurationProperties({CsrfAttacksPreventionProperties.class})
@RequiredArgsConstructor
public class CsrfAttacksPreventionConfig implements WicketApplicationInitConfiguration {

    private final CsrfAttacksPreventionProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var originResourceIsolationPolicy = new OriginResourceIsolationPolicy();
        props.getAcceptedOrigins().forEach(originResourceIsolationPolicy::addAcceptedOrigin);

        var listener = new ResourceIsolationRequestCycleListener(
                new FetchMetadataResourceIsolationPolicy(),
                originResourceIsolationPolicy);
        listener.setUnknownOutcomeAction(props.getUnknownOutcomeAction());
        listener.setDisallowedOutcomeAction(props.getDisallowedOutcomeAction());
        listener.setErrorCode(props.getErrorCode());
        listener.setErrorMessage(props.getErrorMessage());
        webApplication.getRequestCycleListeners().add(listener);

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/csrf/CsrfAttacksPreventionProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.csrf;

import java.util.ArrayList;
import java.util.List;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.protocol.http.ResourceIsolationRequestCycleListener.CsrfAction;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = CsrfAttacksPreventionProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class CsrfAttacksPreventionProperties {
	
	public static final String PROPERTY_PREFIX = "wicket.core.csrf";
	
	/**
	 * Action to perform when a request is disallowed by a resource isolation policy.
	 * Default is {@link CsrfAction#ABORT}.
	 */
	private CsrfAction disallowedOutcomeAction = CsrfAction.ABORT;

	/**
	 * Action to perform when none of the resource isolation policies can come to an outcome.
	 * Default is {@link CsrfAction#ABORT}.
	 */
	private CsrfAction unknownOutcomeAction = CsrfAction.ABORT;

	/**
	 * The error code to report when the action to take for a CSRF request is
	 * {@link CsrfAction#ABORT}. Default {@code 400 BAD REQUEST}.
	 */
	private int errorCode = jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST;

	/**
	 * The error message to report when the action to take for a CSRF request is {@code ERROR}.
	 * Default {@code "Origin does not correspond to request"}.
	 */
	private String errorMessage = "Origin does not correspond to request";

	/**
	 * A white list of accepted origins (host names/domain names) presented as
	 * &lt;domainname&gt;.&lt;TLD&gt;. The domain part can contain subdomains.
	 */
	private List<String> acceptedOrigins = new ArrayList<>();
	
	/**
	 * Enables Wickets CSRF protection
	 */
	private boolean enabled = true;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/datastore/DataStoreHttpSessionConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.datastore;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.DefaultPageManagerProvider;
import org.apache.wicket.pageStore.IPageStore;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.wicketstuff.shiro.wicket.page.store.SessionPageStore;

@ApplicationInitExtension
@ConditionalOnProperty(prefix = DataStoreHttpSessionProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@EnableConfigurationProperties({DataStoreHttpSessionProperties.class})
@RequiredArgsConstructor
public class DataStoreHttpSessionConfig implements WicketApplicationInitConfiguration {

    private final DataStoreHttpSessionProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {

        webApplication.setPageManagerProvider(new DefaultPageManagerProvider(webApplication) {
            @Override
            protected IPageStore newPersistentStore() {
                return new SessionPageStore(webApplication.getName(), props.getPagesNumber());
            }
        });

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());

    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/datastore/DataStoreHttpSessionProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.datastore;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = DataStoreHttpSessionProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class DataStoreHttpSessionProperties {

    public static final String PROPERTY_PREFIX = "wicket.core.datastore.httpsession";

    private boolean enabled = true;

    /**
     * the maximum number of pages the data store can hold
     */
    private int pagesNumber = 20;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/requestmapper/CryptMapperConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.requestmapper;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.core.request.mapper.CryptoMapper;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.core.annotation.Order;

@ApplicationInitExtension
@ConditionalOnProperty(prefix = CryptMapperProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@EnableConfigurationProperties({ CryptMapperProperties.class })
@Order(ApplicationInitExtension.DEFAULT_PRECEDENCE + 100)
@RequiredArgsConstructor
public class CryptMapperConfig implements WicketApplicationInitConfiguration {
	
	private final CryptMapperProperties props;

	private final WicketEndpointRepository wicketEndpointRepository;
	
	@Override
	public void init(WebApplication webApplication) {
		webApplication.setRootRequestMapper(new CryptoMapper(webApplication.getRootRequestMapper(), webApplication));
		wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
				.withDetail("properties", props)
				.build());
	}

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/requestmapper/CryptMapperProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.requestmapper;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(CryptMapperProperties.PROPERTY_PREFIX)
public class CryptMapperProperties {

    public static final String PROPERTY_PREFIX = "wicket.core.requestmapper.cryptmapper";
}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resources/SpringBootMainClassResourceRegistration.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.resources;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidatesHolder;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.resource.loader.ClassStringResourceLoader;

@ApplicationInitExtension
@RequiredArgsConstructor
public class SpringBootMainClassResourceRegistration implements WicketApplicationInitConfiguration {

    private final WicketClassCandidatesHolder classCandidates;

    @Override
    public void init(WebApplication webApplication) {
        if (classCandidates.getSpringBootMainClass() != null) {
            webApplication.getResourceSettings().getStringResourceLoaders().add(new ClassStringResourceLoader(classCandidates.getSpringBootMainClass()));
        }

    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resourcesettings/packageresourceguard/PackageResourceGuardConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.resourcesettings.packageresourceguard;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.markup.html.SecurePackageResourceGuard;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@ApplicationInitExtension
@EnableConfigurationProperties({PackageResourceGuardProperties.class})
@RequiredArgsConstructor
public class PackageResourceGuardConfig implements WicketApplicationInitConfiguration {

    private final PackageResourceGuardProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var packageResourceGuard = webApplication.getResourceSettings().getPackageResourceGuard();
        if (packageResourceGuard instanceof SecurePackageResourceGuard guard) {
            for (String pattern : props.getPattern()) {
                guard.addPattern(pattern);
            }
        }

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}

================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resourcesettings/packageresourceguard/PackageResourceGuardProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.resourcesettings.packageresourceguard;

import java.util.ArrayList;
import java.util.List;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(PackageResourceGuardProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class PackageResourceGuardProperties {

	public static final String PROPERTY_PREFIX = "wicket.core.resourcesettings.packageresourceguard";
	
	private List<String> pattern = new ArrayList<>();

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/serializer/deflated/DeflatedJavaSerializerConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.serializer.deflated;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.serialize.ISerializer;
import org.apache.wicket.serialize.java.DeflatedJavaSerializer;
import org.apache.wicket.serialize.java.JavaSerializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.exceptions.extensions.ExtensionMisconfigurationException;
import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;


/**
 * Enables the deflated java serializer if the following condition matches.
 * <p>
 * 1. The property {@link DeflatedJavaSerializerProperties#PROPERTY_PREFIX}.enabled has to be true (default = false)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = DeflatedJavaSerializerProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@EnableConfigurationProperties({DeflatedJavaSerializerProperties.class})
@RequiredArgsConstructor
public class DeflatedJavaSerializerConfig implements WicketApplicationInitConfiguration {

    private final DeflatedJavaSerializerProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var currentSerializer = webApplication.getFrameworkSettings().getSerializer();
        if (currentSerializer instanceof JavaSerializer) {
            webApplication.getFrameworkSettings().setSerializer(new DeflatedJavaSerializer(webApplication.getApplicationKey()));
        } else {
            throw new ExtensionMisconfigurationException("DeflatedJavaSerializer: There is already another serializer configured " + currentSerializer);
        }

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/serializer/deflated/DeflatedJavaSerializerProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.serializer.deflated;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(DeflatedJavaSerializerProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class DeflatedJavaSerializerProperties {

	public static final String PROPERTY_PREFIX = "wicket.core.serializer.deflated";
	
	/**
	 * Toggle debug settings
	 */
	private boolean enabled = false;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/application/ApplicationSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.application;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig.Builder;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.context.scan.WicketAccessDeniedPage;
import com.giffing.wicket.spring.boot.context.scan.WicketExpiredPage;
import com.giffing.wicket.spring.boot.context.scan.WicketInternalErrorPage;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidate;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidatesHolder;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.settings.ApplicationSettings;

import java.util.ArrayList;
import java.util.List;

@ApplicationInitExtension
@RequiredArgsConstructor
public class ApplicationSettingsConfig implements WicketApplicationInitConfiguration {

    private final WicketClassCandidatesHolder holder;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var applicationSettings = webApplication.getApplicationSettings();

        var builder = new WicketAutoConfig.Builder(this.getClass());

        configureExpiredPage(applicationSettings, new ArrayList<>(holder.getExpiredPageCandidates()), builder);
        configureAccessDeniedPage(applicationSettings, new ArrayList<>(holder.getAccessDeniedPageCandidates()), builder);
        configureInternalErrorPage(applicationSettings, new ArrayList<>(holder.getInternalErrorPageCandidates()), builder);

        wicketEndpointRepository.add(builder.build());

    }

    private void configureInternalErrorPage(ApplicationSettings applicationSettings, List<WicketClassCandidate<Page>> internalErrorPageCandidates, Builder builder) {
        Class<Page> candidate = null;
        if (!internalErrorPageCandidates.isEmpty()) {
            if (internalErrorPageCandidates.size() == 1) {
                WicketClassCandidate<Page> internalErrorPage = internalErrorPageCandidates.get(0);
                candidate = internalErrorPage.getCandidate();
                applicationSettings.setInternalErrorPage(internalErrorPage.getCandidate());


            } else {
                throwExceptionOnMultipleAnnotations(WicketInternalErrorPage.class, internalErrorPageCandidates);
            }
        }
        builder.withDetail("internalErrorPage", candidate);
    }

    private void configureAccessDeniedPage(ApplicationSettings applicationSettings, List<WicketClassCandidate<Page>> accessDeniedPageCandidates, Builder builder) {
        Class<Page> candidate = null;
        if (!accessDeniedPageCandidates.isEmpty()) {
            if (accessDeniedPageCandidates.size() == 1) {
                WicketClassCandidate<Page> accessDeniedPage = accessDeniedPageCandidates.get(0);
                candidate = accessDeniedPage.getCandidate();
                applicationSettings.setAccessDeniedPage(accessDeniedPage.getCandidate());
            } else {
                throwExceptionOnMultipleAnnotations(WicketAccessDeniedPage.class, accessDeniedPageCandidates);
            }
        }
        builder.withDetail("accessDeniedPage", candidate);
    }

    private void configureExpiredPage(ApplicationSettings applicationSettings, List<WicketClassCandidate<Page>> expiredPageCandidates, Builder builder) {
        Class<Page> candidate = null;
        if (!expiredPageCandidates.isEmpty()) {
            if (expiredPageCandidates.size() == 1) {
                WicketClassCandidate<Page> expiredPageCandidate = expiredPageCandidates.get(0);
                applicationSettings.setPageExpiredErrorPage(expiredPageCandidate.getCandidate());
                candidate = expiredPageCandidate.getCandidate();
                builder.withDetail("expiredPage", expiredPageCandidate.getCandidate().getName());
            } else {
                throwExceptionOnMultipleAnnotations(WicketExpiredPage.class, expiredPageCandidates);
            }
        }
        builder.withDetail("expiredPage", candidate);
    }

    private void throwExceptionOnMultipleAnnotations(Class<?> pageClass, List<WicketClassCandidate<Page>> expiredPageCandidates) throws IllegalAccessError {
        var message = new StringBuilder("Multiple annotation of %s found%n".formatted(pageClass.getName()));
        for (WicketClassCandidate<Page> classCandidate : expiredPageCandidates) {
            message.append("\t").append(classCandidate.getCandidate()).append("\n");
        }
        throw new IllegalAccessError(message.toString());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/debug/DebugSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.debug;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.settings.DebugSettings;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

/**
 * Enables debug settings if the following condition matches.
 * <p>
 * 1. The property {@link DebugSettingsProperties#PROPERTY_PREFIX}.enabled has to be true (default = false)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = DebugSettingsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@EnableConfigurationProperties({DebugSettingsProperties.class})
@RequiredArgsConstructor
public class DebugSettingsConfig implements WicketApplicationInitConfiguration {

    private final DebugSettingsProperties properties;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        if (properties.isEnabled()) {
            DebugSettings debugSettings = webApplication.getDebugSettings();
            debugSettings.setDevelopmentUtilitiesEnabled(properties.isDevelopmentUtilitiesEnabled());
            debugSettings.setAjaxDebugModeEnabled(properties.isAjaxDebugModeEnabled());
            debugSettings.setComponentUseCheck(properties.isComponentUseCheck());
            debugSettings.setLinePreciseReportingOnAddComponentEnabled(properties.isLinePreciseReportingOnAddComponentEnabled());
            debugSettings.setLinePreciseReportingOnNewComponentEnabled(properties.isLinePreciseReportingOnNewComponentEnabled());
            debugSettings.setOutputMarkupContainerClassName(properties.isOutputMarkupContainerClassName());
            debugSettings.setComponentPathAttributeName(properties.getComponentPathAttributeName());
        }

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", properties)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/debug/DebugSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.debug;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(DebugSettingsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class DebugSettingsProperties {

    public static final String PROPERTY_PREFIX = "wicket.core.settings.debug";

    /**
     * Toggle debug settings
     */
    private boolean enabled;

    private boolean developmentUtilitiesEnabled = true;

    private boolean ajaxDebugModeEnabled = true;

    private boolean componentUseCheck = true;

    private boolean outputMarkupContainerClassName = false;

    private String componentPathAttributeName;

    private boolean linePreciseReportingOnNewComponentEnabled;

    private boolean linePreciseReportingOnAddComponentEnabled;

}

================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/exceptions/ExceptionSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.exceptions;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.settings.ExceptionSettings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;

/**
 * Configuration options for Wickets exception settings. I don't know if someone needs this
 * settings and when they don't need my javadoc :-)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = ExceptionSettingsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@EnableConfigurationProperties({ExceptionSettingsProperties.class})
@RequiredArgsConstructor
public class ExceptionSettingsConfig implements WicketApplicationInitConfiguration {

    private final ExceptionSettingsProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var exceptionSettings = webApplication.getExceptionSettings();

        exceptionSettings.setAjaxErrorHandlingStrategy(props.getErrorHandlingStrategyDuringAjaxRequests());
        exceptionSettings.setThreadDumpStrategy(props.getThreadDumpStrategy());

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/exceptions/ExceptionSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.exceptions;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.settings.ExceptionSettings.AjaxErrorStrategy;
import org.apache.wicket.settings.ExceptionSettings.ThreadDumpStrategy;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(ExceptionSettingsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class ExceptionSettingsProperties {

	public static final String PROPERTY_PREFIX = "wicket.core.settings.exceptions";
	
	private ThreadDumpStrategy threadDumpStrategy = ThreadDumpStrategy.THREAD_HOLDING_LOCK;
	
	private AjaxErrorStrategy errorHandlingStrategyDuringAjaxRequests = AjaxErrorStrategy.REDIRECT_TO_ERROR_PAGE;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/general/GeneralSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.general;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.RuntimeConfigurationType;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "wicket.core.settings.general")
@Getter
@Setter
public class GeneralSettingsProperties {

    /**
     * Defines the configuration startup mode. It uses Wickets
     * {@link RuntimeConfigurationType}
     */
    private RuntimeConfigurationType configurationType = RuntimeConfigurationType.DEPLOYMENT;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/markup/MarkupSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.markup;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.settings.MarkupSettings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;

/**
 * Configuration for the markup settings.
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@EnableConfigurationProperties({MarkupSettingsProperties.class})
@RequiredArgsConstructor
public class MarkupSettingsConfig implements WicketApplicationInitConfiguration {

    private final MarkupSettingsProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var markupSettings = webApplication.getMarkupSettings();

        if (props.getDefaultMarkupEncoding() != null) {
            markupSettings.setDefaultMarkupEncoding(props.getDefaultMarkupEncoding());
        }

        markupSettings.setAutomaticLinking(props.isAutomaticLinking());
        markupSettings.setCompressWhitespace(props.isCompressWhitespace());
        markupSettings.setStripComments(props.isStripComments());
        markupSettings.setStripWicketTags(props.isStripWicketTags());
        markupSettings.setThrowExceptionOnMissingXmlDeclaration(props.isThrowExceptionOnMissingXmlDeclaration());

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());

    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/markup/MarkupSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.markup;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.markup.MarkupFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = MarkupSettingsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class MarkupSettingsProperties {

    public static final String PROPERTY_PREFIX = "wicket.core.settings.markup";

    /**
     * Application default for automatically resolving hrefs
     */
    private boolean automaticLinking = false;

    /**
     * True if multiple tabs/spaces should be compressed to a single space
     */
    private boolean compressWhitespace = false;

    /**
     * Default markup encoding. If null, the OS default will be used
     */
    private String defaultMarkupEncoding;

    /**
     * Factory for creating markup parsers
     */
    private MarkupFactory markupFactory;

    /**
     * if true than throw an exception if the xml declaration is missing from the markup file
     */
    private boolean throwExceptionOnMissingXmlDeclaration = false;

    /**
     * Should HTML comments be stripped during rendering?
     */
    private boolean stripComments = false;

    /**
     * If true, wicket tags ( <wicket: ..>) and wicket:id attributes we be removed from output
     */
    private boolean stripWicketTags = true;
}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/pagestore/StoreSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.pagestore;

import java.io.File;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.settings.StoreSettings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.context.extensions.types.TypeParser;

@ApplicationInitExtension
@ConditionalOnProperty(prefix = StoreSettingsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@EnableConfigurationProperties({StoreSettingsProperties.class})
@RequiredArgsConstructor
public class StoreSettingsConfig implements WicketApplicationInitConfiguration {

    private final StoreSettingsProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var storeSettings = webApplication.getStoreSettings();
        if (props.getAsynchronous() != null) {
            storeSettings.setAsynchronous(props.getAsynchronous());
        }
        if (props.getAsynchronousQueueCapacity() != null) {
            storeSettings.setAsynchronousQueueCapacity(props.getAsynchronousQueueCapacity());
        }
        if (props.getFileStoreFolder() != null) {
            storeSettings.setFileStoreFolder(new File(props.getFileStoreFolder()));
        }
        storeSettings.setMaxSizePerSession(TypeParser.parse(props.getSessionSize(), props.getSessionUnit()));

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/pagestore/StoreSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.pagestore;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.types.SessionUnit;

@ConfigurationProperties(StoreSettingsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class StoreSettingsProperties {

	public static final String PROPERTY_PREFIX = "wicket.core.settings.pagestore";
	
	/**
	 * Toggle debug settings
	 */
	private boolean enabled;
	
	private Long sessionSize = 2L;

	private SessionUnit sessionUnit = SessionUnit.MEGABYTES;
	
	private Boolean asynchronous;
	
	private Integer asynchronousQueueCapacity;
	
	private String fileStoreFolder;
	
}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requestlogger/RequestLoggerSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requestlogger;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

/**
 * Configuration options for Wickets exception settings. I don't know if someone needs this
 * settings and when they don't need my javadoc :-)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = RequestLoggerSettingsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@EnableConfigurationProperties({RequestLoggerSettingsProperties.class})
@RequiredArgsConstructor
public class RequestLoggerSettingsConfig implements WicketApplicationInitConfiguration {

    private final RequestLoggerSettingsProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var wicketsRequestLoggerSettings = webApplication.getRequestLoggerSettings();

        wicketsRequestLoggerSettings.setRequestLoggerEnabled(props.isEnabled());
        wicketsRequestLoggerSettings.setRecordSessionSize(props.isRecordSessionSize());
        wicketsRequestLoggerSettings.setRequestsWindowSize(props.getRequestsWindowSize());

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requestlogger/RequestLoggerSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requestlogger;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(RequestLoggerSettingsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class RequestLoggerSettingsProperties {

    public static final String PROPERTY_PREFIX = "wicket.core.settings.requestlogger";

    private boolean enabled = false;

    private boolean recordSessionSize = true;

    private int requestsWindowSize = 0;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requrestcycle/RequestCycleSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requrestcycle;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.settings.RequestCycleSettings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.context.extensions.types.TypeParser;

@ApplicationInitExtension
@ConditionalOnProperty(prefix = RequestCycleSettingsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@EnableConfigurationProperties({RequestCycleSettingsProperties.class})
@RequiredArgsConstructor
public class RequestCycleSettingsConfig implements WicketApplicationInitConfiguration {

    private final RequestCycleSettingsProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var requestCycleSettings = webApplication.getRequestCycleSettings();

        requestCycleSettings.setRenderStrategy(props.getRenderStrategy());
        requestCycleSettings.setBufferResponse(props.isBufferResponse());
        requestCycleSettings.setExceptionRetryCount(props.getExceptionRetryCount());
        requestCycleSettings.setGatherExtendedBrowserInfo(props.isGatherExtendedBrowserInfo());
        requestCycleSettings.setResponseRequestEncoding(props.getResponseRequestEncoding());
        requestCycleSettings.setTimeout(TypeParser.parse(props.getTimeoutSize(), props.getTimeoutUnit()));

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}

================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requrestcycle/RequestCycleSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requrestcycle;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.settings.RequestCycleSettings.RenderStrategy;
import org.springframework.boot.context.properties.ConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.types.DurationUnit;

@ConfigurationProperties(prefix = RequestCycleSettingsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class RequestCycleSettingsProperties {

    public static final String PROPERTY_PREFIX = "wicket.core.settings.requestcycle";

    private RenderStrategy renderStrategy = RenderStrategy.REDIRECT_TO_BUFFER;

    private boolean bufferResponse = true;

    private boolean gatherExtendedBrowserInfo = false;

    private String responseRequestEncoding = "UTF-8";

    private Long timeoutSize = 1L;

    private DurationUnit timeoutUnit = DurationUnit.MINUTES;

    private int exceptionRetryCount = 10;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/resource/ResourceSettingsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.resource;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;

import java.time.Duration;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@ApplicationInitExtension
@ConditionalOnProperty(prefix = ResourceSettingsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@EnableConfigurationProperties({ResourceSettingsProperties.class})
@RequiredArgsConstructor
public class ResourceSettingsConfig implements WicketApplicationInitConfiguration {

    private final ResourceSettingsProperties properties;

    @Override
    public void init(WebApplication webApplication) {
        webApplication.getResourceSettings().setUseMinifiedResources(properties.isUseMinifiedResources());
        if (properties.getResourcePollFrequencySeconds() > 0) {
            webApplication.getResourceSettings().setResourcePollFrequency(Duration.ofSeconds(properties.getResourcePollFrequencySeconds()));
        }
    }
}

================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/resource/ResourceSettingsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.resource;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(ResourceSettingsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class ResourceSettingsProperties {

	public static final String PROPERTY_PREFIX = "wicket.core.settings.resource";

	private boolean useMinifiedResources = true;

	private int resourcePollFrequencySeconds;

}

================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/beanvalidation/BeanValidationConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.beanvalidation;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.bean.validation.BeanValidationConfiguration;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * Enables the bean validation support if the following condition matches
 * <p>
 * 1. The {@link BeanValidationConfiguration} class is in the classpath. side
 * note: Bean validation required an validation implementation like hibernate
 * validator.
 * <p>
 * 2. The property wicket.beanvalidation.enabled has to be true (default = true)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@Component
@ConditionalOnProperty(prefix = BeanValidationProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(value = org.apache.wicket.bean.validation.BeanValidationConfiguration.class)
@EnableConfigurationProperties({BeanValidationProperties.class})
@RequiredArgsConstructor
public class BeanValidationConfig implements WicketApplicationInitConfiguration {

    private final BeanValidationProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        new BeanValidationConfiguration().configure(webApplication);

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/beanvalidation/BeanValidationProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.beanvalidation;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = BeanValidationProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class BeanValidationProperties {

    public static final String PROPERTY_PREFIX = "wicket.external.beanvalidation";

    /**
     * Enables or disables the bean validation
     */
    private boolean enabled;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/diskstorebrowser/DiskStoreBrowserConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.diskstorebrowser;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.DefaultPageManagerProvider;
import org.apache.wicket.devutils.pagestore.PageStorePage;
import org.apache.wicket.markup.html.pages.BrowserInfoPage;
import org.apache.wicket.pageStore.DiskPageStore;
import org.apache.wicket.pageStore.IPageStore;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.settings.StoreSettings;
import org.apache.wicket.util.lang.Bytes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;

import java.io.File;

/**
 * Mounts the {@link PageStorePage} if the following condition matches
 * 
 * 1. The {@link PageStorePage} is in the classpath
 * 
 * 2. The disk store browser page is enabled in the property (default=false)
 * 
 * @author Marc Giffing
 *
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = DiskStoreBrowserProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@ConditionalOnClass(value = PageStorePage.class)
@EnableConfigurationProperties({ DiskStoreBrowserProperties.class })
@RequiredArgsConstructor
public class DiskStoreBrowserConfig implements WicketApplicationInitConfiguration {

	private final DiskStoreBrowserProperties properties;
	
	private final WicketEndpointRepository wicketEndpointRepository;
	
	@Override
	public void init(WebApplication webApplication) {
		webApplication.setPageManagerProvider(new DefaultPageManagerProvider(webApplication) {
			@Override
			protected IPageStore newPersistentStore() {
				var storeSettings = application.getStoreSettings();
				var fileStoreFolder = storeSettings.getFileStoreFolder();
				var maxSizePerSession = storeSettings.getMaxSizePerSession();
				return new DiskPageStore(webApplication.getName(), fileStoreFolder, maxSizePerSession);
			}
		});
		webApplication.mountPage(properties.getMountPage(), BrowserInfoPage.class);
		
		wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
				.withDetail("properties", properties)
				.build());
	}

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/diskstorebrowser/DiskStoreBrowserProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.diskstorebrowser;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.devutils.pagestore.PageStorePage;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = DiskStoreBrowserProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class DiskStoreBrowserProperties {

    public static final String PROPERTY_PREFIX = "wicket.external.development.devutils.diskstorebrowser";

    /**
     * If enabled the {@link PageStorePage} should be mounted test page.
     * <p>
     * It is required that the deployment configuration is set to DEVELOPMENT.
     */
    private boolean enabled;

    /**
     * The default mount page for the disk store browser.
     */
    private String mountPage = "devutils/diskstore/browser";

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/inspector/InspectorConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.inspector;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.devutils.inspector.LiveSessionsPage;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;

/**
 * Mounts pages from the devutils inspector package. Currently only the
 * {@link LiveSessionsPage} is supported and is mounted if the following
 * condition matches.
 * <p>
 * 1. The {@link LiveSessionsPage} is in the classpath.
 * <p>
 * 2. The property enableLiveSessionsPage is enabled
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnClass(value = {org.apache.wicket.devutils.inspector.LiveSessionsPage.class,})
@EnableConfigurationProperties({InspectorProperties.class})
@RequiredArgsConstructor
public class InspectorConfig implements WicketApplicationInitConfiguration {

    private final InspectorProperties properties;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        if (properties.isEnableLiveSessionsPage()) {
            webApplication.mountPage(properties.getLiveSessionPageMount(), LiveSessionsPage.class);
        }

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", properties)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/inspector/InspectorProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.inspector;

import lombok.Getter;
import lombok.Setter;
import org.apache.wicket.devutils.inspector.LiveSessionsPage;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = InspectorProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class InspectorProperties {

    public static final String PROPERTY_PREFIX = "wicket.external.development.devutils.interceptor";

    /**
     * Enables or disabled the mounting of the {@link LiveSessionsPage}.
     */
    private boolean enableLiveSessionsPage;

    /**
     * The relative address on which the {@link LiveSessionsPage} should be mounted
     */
    private String liveSessionPageMount = "devutils/inspector/live-session-page";

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/statelesschecker/StatelessCheckerConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.statelesschecker;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.devutils.stateless.StatelessChecker;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;

/**
 * Enables the states checker from the Wicket devutils. Its only enabled if the
 * following condition matches
 * <p>
 * 1. The {@link StatelessChecker} is present in the classpath
 * <p>
 * 2. the {@link StatelessCheckerProperties}.statelessCheckerEnabled is set to true
 * (default=false)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = StatelessCheckerProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = false)
@ConditionalOnClass(value = org.apache.wicket.devutils.stateless.StatelessChecker.class)
@EnableConfigurationProperties({StatelessCheckerProperties.class})
@RequiredArgsConstructor
public class StatelessCheckerConfig implements WicketApplicationInitConfiguration {

    private final StatelessCheckerProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        webApplication.getComponentPostOnBeforeRenderListeners().add(new StatelessChecker());

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/statelesschecker/StatelessCheckerProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.statelesschecker;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = StatelessCheckerProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class StatelessCheckerProperties {

	public static final String PROPERTY_PREFIX = "wicket.external.development.devutils.statelesschecker";
	
	private boolean enabled = false;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevToolsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = SpringDevToolsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class SpringDevToolsProperties {

    public static final String PROPERTY_PREFIX = "spring.devtools.restart";

    private boolean enabled = true;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevToolsSerializer.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;

import org.apache.wicket.serialize.ISerializer;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.serializer.DefaultDeserializer;
import org.springframework.core.serializer.support.DeserializingConverter;
import org.springframework.core.serializer.support.SerializingConverter;

/**
 * A custom serializer is needed to support Spring Boot Devtools. Spring Boot Devtools
 * has some limitation with support of serialisation/deserialization support. So we have to
 * provide a custom Wicket {@link ISerializer}.
 *
 * <p>
 * <b>20.2.6 Known limitations</b> <br>
 * Restart functionality does not work well with objects that are deserialized using a
 * standard ObjectInputStream. If you need to deserialize data, you may need to use Spring’s
 * ConfigurableObjectInputStream in combination with Thread.currentThread().getContextClassLoader().
 * Unfortunately, several third-party libraries deserialize without considering the context classloader.
 * If you find such a problem, you will need to request a fix with the original authors.
 * </p>
 *
 * @author Marc Giffing
 * @see <a href="https://github.com/spring-projects/spring-boot/issues/3805">Spring Boot Devtools Serializer Issue</a>
 */
public class SpringDevToolsSerializer implements ISerializer {

    private final Converter<Object, byte[]> serializer = new SerializingConverter();
    private final Converter<byte[], Object> deserializer;

    public SpringDevToolsSerializer() {
        this.deserializer = new DeserializingConverter(new DefaultDeserializer(Thread.currentThread().getContextClassLoader()));
    }

    @Override
    public byte[] serialize(Object object) {
        return serializer.convert(object);
    }

    @Override
    public Object deserialize(byte[] data) {
        return deserializer.convert(data);
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevtoolsSerializerConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration;
import org.springframework.boot.devtools.restart.ConditionalOnInitializedRestarter;

/**
 * The Wicket serializer does not working with Spring Boot Devtools so we have to provide a custom {@link SpringDevToolsSerializer}.
 * It should be active by default if the following conditions matches.
 * <p>
 * 1. The {@link LocalDevToolsAutoConfiguration} class is in the classpath. This means that the Spring Boot Devtools is available in the classpath.
 * <p>
 * 2. The property "spring.devtools.restart.enabled" is set to true. (default is true). There is maybe a better option to check
 * <p>
 * 3. Restarter condition is active {@link ConditionalOnInitializedRestarter}.
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = SpringDevToolsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(LocalDevToolsAutoConfiguration.class)
@EnableConfigurationProperties({SpringDevToolsProperties.class})
@ConditionalOnInitializedRestarter
@RequiredArgsConstructor
public class SpringDevtoolsSerializerConfig implements WicketApplicationInitConfiguration {

    private final SpringDevToolsProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        webApplication.getFrameworkSettings().setSerializer(new SpringDevToolsSerializer());
        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }
}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/WicketDevToolsPropertyDefaultsPostProcessor.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.devtools.restart.Restarter;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

@Order(Ordered.LOWEST_PRECEDENCE)
//TODO add feature request in the Spring Boot project for adding custom development properties 
public class WicketDevToolsPropertyDefaultsPostProcessor implements EnvironmentPostProcessor {

    private static final Map<String, Object> PROPERTIES;

    static {
        Map<String, Object> properties = new HashMap<>();
        properties.put("wicket.core.settings.general.configuration-type", "development");
        properties.put("wicket.core.settings.markup.strip-wicket-tags", "false");
        properties.put("wicket.core.settings.debug.component-use-check", "true");
        properties.put("wicket.core.settings.debug.development-utilities-enabled", "true");
        properties.put("wicket.core.settings.debug.ajax-debug-mode-enabled", "true");


        PROPERTIES = Collections.unmodifiableMap(properties);
    }

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        if (Boolean.TRUE.equals(isWicketDevToolsEnabled(environment)
                && isLocalApplication(environment))
                && canAddProperties(environment)) {
            var propertySource = new MapPropertySource("wicketrefresh", PROPERTIES);
            environment.getPropertySources().addLast(propertySource);
        }
    }

    private Boolean isWicketDevToolsEnabled(ConfigurableEnvironment environment) {
        var devToolsEnabled = Boolean.TRUE;
        var devToolsEnabledString = environment.getProperty("wicket." + SpringDevToolsProperties.PROPERTY_PREFIX + ".enabled");
        if (devToolsEnabledString != null) {
            devToolsEnabled = devToolsEnabledString.equalsIgnoreCase("true");
        }
        return devToolsEnabled;
    }

    private boolean isLocalApplication(ConfigurableEnvironment environment) {
        return environment.getPropertySources().get("remoteUrl") == null;
    }

    private boolean canAddProperties(Environment environment) {
        return isRestarterInitialized() || isRemoteRestartEnabled(environment);
    }

    private boolean isRestarterInitialized() {

        try {
            Restarter restarter = Restarter.getInstance();
            return (restarter != null && restarter.getInitialUrls() != null);
        } catch (NoClassDefFoundError | Exception ex) {
            return false;
        }
    }

    private boolean isRemoteRestartEnabled(Environment environment) {
        return environment.containsProperty("spring.devtools.remote.secret");
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/wicketsource/WicketSourceConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.wicketsource;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.github.jennybrown8.wicketsource.WicketSource;

/**
 * Enables wicket-source support if the following two condition matches:
 * <p>
 * 1. The WicketSource is in the classpath.
 * <p>
 * 2. The property wicket.wicketsource.enabled is true (default = true)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = WicketSourceProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(value = com.github.jennybrown8.wicketsource.WicketSource.class)
@EnableConfigurationProperties({WicketSourceProperties.class})
@RequiredArgsConstructor
public class WicketSourceConfig implements WicketApplicationInitConfiguration {

    private final WicketSourceProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        WicketSource.configure(webApplication);

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());

    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/wicketsource/WicketSourceProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.wicketsource;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = WicketSourceProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class WicketSourceProperties {

	public static final String PROPERTY_PREFIX = "wicket.external.development.wicketsource";
	
	private boolean enabled = false;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpoint.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.boot.actuator;

import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.HashMap;
import java.util.Map;


@ConfigurationProperties(prefix = "endpoints.wicket")
@Endpoint(id = "wicket")
@RequiredArgsConstructor
public class WicketEndpoint {

    private final WicketEndpointRepository repository;

    @ReadOperation
    public Map<String, Object> wicketExtensions() {
        Map<String, Object> result = new HashMap<>();
        result.put("extensions", repository.getConfigs());
        return result;
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpointConfiguration.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.boot.actuator;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;

@Configuration
public class WicketEndpointConfiguration {

    @Bean
    public WicketEndpoint wicketEndpoint() {
        return new WicketEndpoint(wicketEndpointRepositoryDefault());
    }

    @Bean
    @ConditionalOnMissingBean
    public WicketEndpointRepository wicketEndpointRepositoryDefault() {
        return new WicketEndpointRepositoryDefault();
    }
}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpointRepositoryDefault.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.boot.actuator;

import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

@Getter
public class WicketEndpointRepositoryDefault implements WicketEndpointRepository {

    private final List<WicketAutoConfig> configs = new ArrayList<>();

    public void add(WicketAutoConfig autoconfig) {
        this.configs.add(autoconfig);
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SecureWebSession.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.security;

import java.io.Serializable;

import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
import org.apache.wicket.authroles.authorization.strategies.role.Roles;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.protocol.http.WebSession;
import org.apache.wicket.request.Request;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;

/**
 * Spring Security Implementation of Wickets {@link AuthenticatedWebSession}.
 *
 * @author Marc Giffing
 */
public class SecureWebSession extends AuthenticatedWebSession implements Serializable {

    private static final String SPRING_SECURITY_CONTEXT_KEY = HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY;

    @SpringBean(name = "authenticationManager")
    private AuthenticationManager authenticationManager;

    public SecureWebSession(Request request) {
        super(request);
        Injector.get().inject(this);
    }

    @Override
    public boolean authenticate(String username, String password) {
        try {
            var auth = authenticationManager
                    .authenticate(new UsernamePasswordAuthenticationToken(username, password));
            if (auth.isAuthenticated()) {
                SecurityContextHolder.getContext().setAuthentication(auth);
                WebSession httpSession = WebSession.get();
                if (httpSession != null) {
                    httpSession.setAttribute(SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());
                }
                return true;
            }
            return false;
        } catch (AuthenticationException e) {
            return false;
        }
    }

    @Override
    public Roles getRoles() {
        Roles roles = new Roles();
        if (isSignedIn()) {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            authentication.getAuthorities().forEach(authority -> roles.add(authority.getAuthority()));
        }
        return roles;
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SpringSecurityConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.security;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.security.AuthenticatedWebSessionConfig;
import com.giffing.wicket.spring.boot.starter.app.WicketBootSecuredWebApplication;
import com.giffing.wicket.spring.boot.starter.app.WicketBootWebApplication;

@ApplicationInitExtension
@ConditionalOnProperty(prefix = SpringSecurityProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(value = {
        org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession.class,
        org.springframework.security.core.Authentication.class,
        org.springframework.security.web.SecurityFilterChain.class
})
@EnableConfigurationProperties({SpringSecurityProperties.class})
@ConditionalOnMissingBean(WicketBootWebApplication.class)
public class SpringSecurityConfig {

    @Bean
    public WicketBootSecuredWebApplication wicketBootWebApplication() {
        return new WicketBootSecuredWebApplication();
    }

    @Bean
    public AuthenticatedWebSessionConfig authenticatedWebSessionConfig() {
        return () -> SecureWebSession.class;
    }
}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SpringSecurityProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.security;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = SpringSecurityProperties.PROPERTY_PREFIX)
public class SpringSecurityProperties {

    public static final String PROPERTY_PREFIX = "wicket.external.spring.security";

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/webjars/WebjarsConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.webjars;

import jdk.jfr.Registered;
import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

import com.giffing.wicket.spring.boot.context.condition.ConditionalOnWicket;
import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;

import de.agilecoders.wicket.webjars.WicketWebjars;
import de.agilecoders.wicket.webjars.settings.WebjarsSettings;

/**
 * Enables webjars support if the following two condition matches:
 * <p>
 * 1. The {@link WicketWebjars} is in the classpath.
 * <p>
 * 2. The property wicket.webjars.enabled is true (default = true)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = WebjarsProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(value = de.agilecoders.wicket.webjars.WicketWebjars.class)
@EnableConfigurationProperties({WebjarsProperties.class})
@ConditionalOnWicket(value = 10)
@RequiredArgsConstructor
public class WebjarsConfig implements WicketApplicationInitConfiguration {

    private final WebjarsProperties props;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        var settings = new WebjarsSettings();
        WicketWebjars.install(webApplication, settings);

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", props)
                .build());
    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/webjars/WebjarsProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.webjars;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = WebjarsProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class WebjarsProperties {

    public static final String PROPERTY_PREFIX = "wicket.external.webjars";

    /**
     * Enables webjars support
     */
    private boolean enabled = true;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/annotationscan/AnnotatedMountScannerConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.annotationscan;

import java.util.ArrayList;
import java.util.List;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.core.annotation.Order;
import org.wicketstuff.annotation.scan.AnnotatedMountScanner;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.starter.app.classscanner.candidates.WicketClassCandidatesHolder;

/**
 * Auto configuration for the {@link AnnotatedMountScanner}.
 * <p>
 * It uses the user defined {@link WebApplication} as the default package scan
 * root directory.
 * <p>
 * Enables annotate mount scanner if the following two condition matches:
 * <p>
 * 1. The {@link AnnotatedMountScanner} is in the classpath.
 * <p>
 * 2. The property {@link AnnotatedMountScannerProperties#PROPERTY_PREFIX}
 * .enabled is true (default = true)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = AnnotatedMountScannerProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(value = org.wicketstuff.annotation.scan.AnnotatedMountScanner.class)
@EnableConfigurationProperties({AnnotatedMountScannerProperties.class})
@Order(ApplicationInitExtension.DEFAULT_PRECEDENCE + 50)
@RequiredArgsConstructor
public class AnnotatedMountScannerConfig implements WicketApplicationInitConfiguration {

    private final AnnotatedMountScannerProperties prop;

    private final WicketClassCandidatesHolder candidates;

    private final WicketEndpointRepository wicketEndpointRepository;

    @Override
    public void init(WebApplication webApplication) {
        List<String> packagesToScan = new ArrayList<>();
        var annotatedMountScanner = new AnnotatedMountScanner();

        var packagename = webApplication.getClass().getPackage().getName();
        if (prop.getPackagename() != null) {
            packagename = prop.getPackagename();
        }

        packagesToScan.add(packagename);
        annotatedMountScanner.scanPackage(packagename).mount(webApplication);

        if (!candidates.getBasePackages().isEmpty()) {
            packagesToScan.addAll(candidates.getBasePackages());
            for (String basePackage : candidates.getBasePackages()) {
                annotatedMountScanner.scanPackage(basePackage).mount(webApplication);
            }
        }

        wicketEndpointRepository.add(new WicketAutoConfig.Builder(this.getClass())
                .withDetail("properties", prop)
                .withDetail("packagesToScan", packagesToScan)
                .build());

    }

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/annotationscan/AnnotatedMountScannerProperties.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.annotationscan;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = AnnotatedMountScannerProperties.PROPERTY_PREFIX)
@Getter
@Setter
public class AnnotatedMountScannerProperties {

    public static final String PROPERTY_PREFIX = "wicket.stuff.annotationscan";

    /**
     * @see AnnotatedMountScannerConfig
     */
    private boolean enabled = true;

    /**
     * An alternative package name for scanning for mount path if the
     * WicketApplication should not used as the root scan package
     */
    private String packagename;

}


================================================
FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/cassandra/DataStoreCassandraConfig.java
================================================
package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.cassandra;

import lombok.RequiredArgsConstructor;
import org.apache.wicket.DefaultPageManagerProvider;
import org.apache.wicket.pageStore.IPageStore;
import org.apache.wicket.protocol.http.WebApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.wicketstuff.datastores.cassandra.CassandraDataStore;
import org.wicketstuff.datastores.cassandra.CassandraSettings;
import org.wicketstuff.datastores.cassandra.ICassandraSettings;
import org.wicketstuff.datastores.common.SessionQuotaManagingDataStore;

import com.giffing.wicket.spring.boot.context.extensions.ApplicationInitExtension;
import com.giffing.wicket.spring.boot.context.extensions.WicketApplicationInitConfiguration;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketAutoConfig;
import com.giffing.wicket.spring.boot.context.extensions.boot.actuator.WicketEndpointRepository;
import com.giffing.wicket.spring.boot.context.extensions.types.TypeParser;

/**
 * Data store auto configuration for the cassandra database
 * <p>
 * Enables cassandra data store if the following two condition matches:
 * <p>
 * 1. The "com.datastax.driver.core.Session" is in the classpath.
 * <p>
 * 2. The property {@link DataStoreCassandraProperties#PROPERTY_PREFIX}.enabled
 * is true (default = true)
 *
 * @author Marc Giffing
 */
@ApplicationInitExtension
@ConditionalOnProperty(prefix = DataStoreCassandraProperties.PROPERTY_PREFIX, value = "enabled", matchIfMissing = true)
@ConditionalOnClass(name = "com.datastax.driver.core.Session", value = {CassandraDataStore.class})
@EnableConfigurationProperties({DataStoreCassandraProperti
Download .txt
gitextract_rhrs615o/

├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       └── maven.yml
├── .gitignore
├── README.adoc
├── pom.xml
├── wicket-spring-boot-context/
│   ├── .gitignore
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── giffing/
│                       └── wicket/
│                           └── spring/
│                               └── boot/
│                                   └── context/
│                                       ├── condition/
│                                       │   ├── ConditionalOnWicket.java
│                                       │   └── WicketSettingsCondition.java
│                                       ├── exceptions/
│                                       │   ├── WicketSpringBootException.java
│                                       │   └── extensions/
│                                       │       └── ExtensionMisconfigurationException.java
│                                       ├── extensions/
│                                       │   ├── ApplicationInitExtension.java
│                                       │   ├── WicketApplicationInitConfiguration.java
│                                       │   ├── boot/
│                                       │   │   └── actuator/
│                                       │   │       ├── WicketAutoConfig.java
│                                       │   │       └── WicketEndpointRepository.java
│                                       │   └── types/
│                                       │       ├── DurationUnit.java
│                                       │       ├── SessionUnit.java
│                                       │       └── TypeParser.java
│                                       ├── scan/
│                                       │   ├── WicketAccessDeniedPage.java
│                                       │   ├── WicketExpiredPage.java
│                                       │   ├── WicketHomePage.java
│                                       │   ├── WicketInternalErrorPage.java
│                                       │   └── WicketSignInPage.java
│                                       └── security/
│                                           └── AuthenticatedWebSessionConfig.java
├── wicket-spring-boot-starter/
│   ├── .gitignore
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── giffing/
│           │           └── wicket/
│           │               └── spring/
│           │                   └── boot/
│           │                       └── starter/
│           │                           ├── WicketAutoConfiguration.java
│           │                           ├── WicketBootWebApplicationAutoConfiguration.java
│           │                           ├── app/
│           │                           │   ├── WicketBootSecuredWebApplication.java
│           │                           │   ├── WicketBootStandardWebApplication.java
│           │                           │   ├── WicketBootWebApplication.java
│           │                           │   ├── classscanner/
│           │                           │   │   ├── ClassCandidateScanner.java
│           │                           │   │   ├── ClassCandidateScannerConfiguration.java
│           │                           │   │   └── candidates/
│           │                           │   │       ├── WicketClassCandidate.java
│           │                           │   │       └── WicketClassCandidatesHolder.java
│           │                           │   └── verifier/
│           │                           │       ├── WicketDependencyMismatchDetectedException.java
│           │                           │       ├── WicketDependencyVersionChecker.java
│           │                           │       ├── WicketDependencyVersionCheckerFailureAnalyzer.java
│           │                           │       └── WicketDependencyVersionCheckerProperties.java
│           │                           ├── configuration/
│           │                           │   ├── CustomAnnotationBeanNameGenerator.java
│           │                           │   └── extensions/
│           │                           │       ├── WicketExtensionLocation.java
│           │                           │       ├── core/
│           │                           │       │   ├── csrf/
│           │                           │       │   │   ├── CsrfAttacksPreventionConfig.java
│           │                           │       │   │   └── CsrfAttacksPreventionProperties.java
│           │                           │       │   ├── datastore/
│           │                           │       │   │   ├── DataStoreHttpSessionConfig.java
│           │                           │       │   │   └── DataStoreHttpSessionProperties.java
│           │                           │       │   ├── requestmapper/
│           │                           │       │   │   ├── CryptMapperConfig.java
│           │                           │       │   │   └── CryptMapperProperties.java
│           │                           │       │   ├── resources/
│           │                           │       │   │   └── SpringBootMainClassResourceRegistration.java
│           │                           │       │   ├── resourcesettings/
│           │                           │       │   │   └── packageresourceguard/
│           │                           │       │   │       ├── PackageResourceGuardConfig.java
│           │                           │       │   │       └── PackageResourceGuardProperties.java
│           │                           │       │   ├── serializer/
│           │                           │       │   │   └── deflated/
│           │                           │       │   │       ├── DeflatedJavaSerializerConfig.java
│           │                           │       │   │       └── DeflatedJavaSerializerProperties.java
│           │                           │       │   └── settings/
│           │                           │       │       ├── application/
│           │                           │       │       │   └── ApplicationSettingsConfig.java
│           │                           │       │       ├── debug/
│           │                           │       │       │   ├── DebugSettingsConfig.java
│           │                           │       │       │   └── DebugSettingsProperties.java
│           │                           │       │       ├── exceptions/
│           │                           │       │       │   ├── ExceptionSettingsConfig.java
│           │                           │       │       │   └── ExceptionSettingsProperties.java
│           │                           │       │       ├── general/
│           │                           │       │       │   └── GeneralSettingsProperties.java
│           │                           │       │       ├── markup/
│           │                           │       │       │   ├── MarkupSettingsConfig.java
│           │                           │       │       │   └── MarkupSettingsProperties.java
│           │                           │       │       ├── pagestore/
│           │                           │       │       │   ├── StoreSettingsConfig.java
│           │                           │       │       │   └── StoreSettingsProperties.java
│           │                           │       │       ├── requestlogger/
│           │                           │       │       │   ├── RequestLoggerSettingsConfig.java
│           │                           │       │       │   └── RequestLoggerSettingsProperties.java
│           │                           │       │       ├── requrestcycle/
│           │                           │       │       │   ├── RequestCycleSettingsConfig.java
│           │                           │       │       │   └── RequestCycleSettingsProperties.java
│           │                           │       │       └── resource/
│           │                           │       │           ├── ResourceSettingsConfig.java
│           │                           │       │           └── ResourceSettingsProperties.java
│           │                           │       ├── external/
│           │                           │       │   ├── beanvalidation/
│           │                           │       │   │   ├── BeanValidationConfig.java
│           │                           │       │   │   └── BeanValidationProperties.java
│           │                           │       │   ├── development/
│           │                           │       │   │   ├── devutils/
│           │                           │       │   │   │   ├── diskstorebrowser/
│           │                           │       │   │   │   │   ├── DiskStoreBrowserConfig.java
│           │                           │       │   │   │   │   └── DiskStoreBrowserProperties.java
│           │                           │       │   │   │   ├── inspector/
│           │                           │       │   │   │   │   ├── InspectorConfig.java
│           │                           │       │   │   │   │   └── InspectorProperties.java
│           │                           │       │   │   │   └── statelesschecker/
│           │                           │       │   │   │       ├── StatelessCheckerConfig.java
│           │                           │       │   │   │       └── StatelessCheckerProperties.java
│           │                           │       │   │   ├── springboot/
│           │                           │       │   │   │   └── devtools/
│           │                           │       │   │   │       ├── SpringDevToolsProperties.java
│           │                           │       │   │   │       ├── SpringDevToolsSerializer.java
│           │                           │       │   │   │       ├── SpringDevtoolsSerializerConfig.java
│           │                           │       │   │   │       └── WicketDevToolsPropertyDefaultsPostProcessor.java
│           │                           │       │   │   └── wicketsource/
│           │                           │       │   │       ├── WicketSourceConfig.java
│           │                           │       │   │       └── WicketSourceProperties.java
│           │                           │       │   ├── spring/
│           │                           │       │   │   ├── boot/
│           │                           │       │   │   │   └── actuator/
│           │                           │       │   │   │       ├── WicketEndpoint.java
│           │                           │       │   │   │       ├── WicketEndpointConfiguration.java
│           │                           │       │   │   │       └── WicketEndpointRepositoryDefault.java
│           │                           │       │   │   └── security/
│           │                           │       │   │       ├── SecureWebSession.java
│           │                           │       │   │       ├── SpringSecurityConfig.java
│           │                           │       │   │       └── SpringSecurityProperties.java
│           │                           │       │   └── webjars/
│           │                           │       │       ├── WebjarsConfig.java
│           │                           │       │       └── WebjarsProperties.java
│           │                           │       └── stuff/
│           │                           │           ├── annotationscan/
│           │                           │           │   ├── AnnotatedMountScannerConfig.java
│           │                           │           │   └── AnnotatedMountScannerProperties.java
│           │                           │           ├── datastore/
│           │                           │           │   ├── cassandra/
│           │                           │           │   │   ├── DataStoreCassandraConfig.java
│           │                           │           │   │   └── DataStoreCassandraProperties.java
│           │                           │           │   ├── hazelcast/
│           │                           │           │   │   ├── DataStoreHazelcastConfig.java
│           │                           │           │   │   └── DataStoreHazelcastProperties.java
│           │                           │           │   ├── memcached/
│           │                           │           │   │   ├── DataStoreMemcachedConfig.java
│           │                           │           │   │   └── DataStoreMemcachedProperties.java
│           │                           │           │   └── redis/
│           │                           │           │       ├── DataStoreRedisConfig.java
│           │                           │           │       └── DataStoreRedisProperties.java
│           │                           │           ├── htmlcompressor/
│           │                           │           │   ├── HTMLCompressingConfig.java
│           │                           │           │   └── HTMLCompressingProperties.java
│           │                           │           ├── monitoring/
│           │                           │           │   └── jamon/
│           │                           │           │       ├── BootJamonAdminPage.java
│           │                           │           │       ├── JamonConfig.java
│           │                           │           │       ├── JamonCssResourceReference.java
│           │                           │           │       ├── JamonProperties.java
│           │                           │           │       └── css/
│           │                           │           │           └── jamon.css
│           │                           │           ├── restannotations/
│           │                           │           │   ├── RestAnnotationsConfig.java
│           │                           │           │   └── RestAnnotationsProperties.java
│           │                           │           ├── serializer/
│           │                           │           │   ├── fast2/
│           │                           │           │   │   ├── WicketSerializerFast2Config.java
│           │                           │           │   │   └── WicketSerializerFast2Properties.java
│           │                           │           │   └── kryo2/
│           │                           │           │       ├── WicketSerializerKryo2Config.java
│           │                           │           │       └── WicketSerializerKryo2Properties.java
│           │                           │           ├── shiro/
│           │                           │           │   ├── ShiroSecurityConfig.java
│           │                           │           │   └── ShiroSecurityProperties.java
│           │                           │           └── springreference/
│           │                           │               ├── SpringReferenceConfig.java
│           │                           │               └── SpringReferenceProperties.java
│           │                           └── web/
│           │                               ├── WicketWebInitializer.java
│           │                               ├── WicketWebInitializerProperties.java
│           │                               ├── config/
│           │                               │   ├── WicketWebInitializerAutoConfig.java
│           │                               │   └── WicketWebInitializerConfig.java
│           │                               └── servlet/
│           │                                   ├── standard/
│           │                                   │   └── StandardWicketWebInitializer.java
│           │                                   └── websocket/
│           │                                       ├── DummyWicketSessionResolver.java
│           │                                       ├── WebSocketMessageBroadcaster.java
│           │                                       ├── WebSocketMessageSenderDefault.java
│           │                                       ├── WebSocketWicketWebInitializer.java
│           │                                       ├── WicketServerEndpointConfigRegister.java
│           │                                       └── WicketSessionResolver.java
│           └── resources/
│               ├── META-INF/
│               │   ├── spring/
│               │   │   └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│               │   ├── spring-devtools.properties
│               │   └── spring.factories
│               └── application-development.yml
└── wicket-spring-boot-starter-example/
    ├── .gitignore
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── doc/
        │   │   └── index.adoc
        │   ├── java/
        │   │   └── com/
        │   │       └── giffing/
        │   │           └── wicket/
        │   │               └── spring/
        │   │                   └── boot/
        │   │                       └── example/
        │   │                           ├── WicketApplication.java
        │   │                           ├── WicketApplication.properties
        │   │                           ├── model/
        │   │                           │   └── Customer.java
        │   │                           ├── repository/
        │   │                           │   ├── DefaultFilter.java
        │   │                           │   ├── Domain.java
        │   │                           │   ├── Filter.java
        │   │                           │   ├── FilterService.java
        │   │                           │   ├── Sort.java
        │   │                           │   └── services/
        │   │                           │       ├── DefaultRepositoryService.java
        │   │                           │       └── customer/
        │   │                           │           ├── CustomerRepository.java
        │   │                           │           ├── CustomerRepositoryService.java
        │   │                           │           ├── CustomerRepositoryServiceImpl.java
        │   │                           │           ├── filter/
        │   │                           │           │   ├── CustomerFilter.java
        │   │                           │           │   └── CustomerSort.java
        │   │                           │           └── specs/
        │   │                           │               └── CustomerSpecs.java
        │   │                           └── web/
        │   │                               ├── SpringBootWebPackageIdentifier.java
        │   │                               ├── assets/
        │   │                               │   └── base/
        │   │                               │       ├── CustomStylesCssRessourceReference.java
        │   │                               │       └── custom.css
        │   │                               ├── general/
        │   │                               │   ├── action/
        │   │                               │   │   └── panel/
        │   │                               │   │       ├── ActionPanel.html
        │   │                               │   │       ├── ActionPanel.java
        │   │                               │   │       └── items/
        │   │                               │   │           ├── AbstractActionItemLink.html
        │   │                               │   │           ├── AbstractActionItemLink.java
        │   │                               │   │           ├── AbstrractActionItem.java
        │   │                               │   │           ├── links/
        │   │                               │   │           │   ├── ActionItemLink.html
        │   │                               │   │           │   └── ActionItemLink.java
        │   │                               │   │           └── yesno/
        │   │                               │   │               └── YesNoLink.java
        │   │                               │   └── notify/
        │   │                               │       ├── NotyJSReference.java
        │   │                               │       ├── NotyPackagedJSReference.java
        │   │                               │       ├── NotyThemeBootstrapJSReference.java
        │   │                               │       ├── jquery.noty.js
        │   │                               │       └── noty.theme.bootstrap.js
        │   │                               ├── html/
        │   │                               │   ├── autocomplete/
        │   │                               │   │   ├── AutoCompleteTextField.css
        │   │                               │   │   └── AutoCompleteTextField.java
        │   │                               │   ├── basic/
        │   │                               │   │   └── YesNoLabel.java
        │   │                               │   ├── border/
        │   │                               │   │   └── behavior/
        │   │                               │   │       ├── ValidationMsgBehavior.html
        │   │                               │   │       └── ValidationMsgBehavior.java
        │   │                               │   ├── form/
        │   │                               │   │   ├── ValidationForm.java
        │   │                               │   │   ├── ValidationFormVisitor.java
        │   │                               │   │   └── focus/
        │   │                               │   │       └── FocusBehaviour.java
        │   │                               │   ├── modal/
        │   │                               │   │   ├── YesNoModal.html
        │   │                               │   │   ├── YesNoModal.java
        │   │                               │   │   ├── YesNoPanel.html
        │   │                               │   │   └── YesNoPanel.java
        │   │                               │   ├── panel/
        │   │                               │   │   ├── FeedbackPanel.html
        │   │                               │   │   └── FeedbackPanel.java
        │   │                               │   └── repeater/
        │   │                               │       └── data/
        │   │                               │           └── table/
        │   │                               │               └── filter/
        │   │                               │                   ├── AbstractCheckBoxFilter.html
        │   │                               │                   ├── AbstractCheckBoxFilter.java
        │   │                               │                   ├── AbstractTextFieldFilter.html
        │   │                               │                   └── AbstractTextFieldFilter.java
        │   │                               ├── pages/
        │   │                               │   ├── BaseAuthenticatedPage.html
        │   │                               │   ├── BaseAuthenticatedPage.java
        │   │                               │   ├── BaseAuthenticatedPage.properties
        │   │                               │   ├── BasePage.html
        │   │                               │   ├── BasePage.java
        │   │                               │   ├── WicketBootstrapInitializer.java
        │   │                               │   ├── customers/
        │   │                               │   │   ├── CustomerListPage.html
        │   │                               │   │   ├── CustomerListPage.java
        │   │                               │   │   ├── create/
        │   │                               │   │   │   ├── CustomerCreatePage.html
        │   │                               │   │   │   └── CustomerCreatePage.java
        │   │                               │   │   ├── edit/
        │   │                               │   │   │   ├── CustomerEditPage.java
        │   │                               │   │   │   └── CustomerEditPage.properties
        │   │                               │   │   ├── events/
        │   │                               │   │   │   ├── CustomerChangedEvent.java
        │   │                               │   │   │   └── CustomerDeletedEvent.java
        │   │                               │   │   └── model/
        │   │                               │   │       ├── CustomerDataProvider.java
        │   │                               │   │       ├── UsernameSearchTextField.java
        │   │                               │   │       └── UsernameTextField.java
        │   │                               │   ├── errors/
        │   │                               │   │   ├── AccessDeniedPage.html
        │   │                               │   │   ├── AccessDeniedPage.java
        │   │                               │   │   ├── ExpiredPage.html
        │   │                               │   │   ├── ExpiredPage.java
        │   │                               │   │   ├── InternalErrorPage.html
        │   │                               │   │   └── InternalErrorPage.java
        │   │                               │   ├── footer/
        │   │                               │   │   ├── Footer.html
        │   │                               │   │   └── Footer.java
        │   │                               │   ├── login/
        │   │                               │   │   ├── LoginPage.html
        │   │                               │   │   └── LoginPage.java
        │   │                               │   └── websocket/
        │   │                               │       ├── ChatPage.css
        │   │                               │       ├── ChatPage.html
        │   │                               │       ├── ChatPage.java
        │   │                               │       ├── ChatPage.properties
        │   │                               │       ├── ChatParticipant.java
        │   │                               │       ├── ChatService.java
        │   │                               │       └── events/
        │   │                               │           ├── CustomerMessageEvent.java
        │   │                               │           ├── JoinChatEvent.java
        │   │                               │           └── LeftChatEvent.java
        │   │                               ├── security/
        │   │                               │   ├── SpringSecurityWicketSessionResolver.java
        │   │                               │   └── WicketWebSecurityAdapterConfig.java
        │   │                               └── wicket/
        │   │                                   └── dataprovider/
        │   │                                       └── DefaultDataProvider.java
        │   └── resources/
        │       ├── META-INF/
        │       │   └── spring-devtools.properties
        │       ├── application.yml
        │       ├── db/
        │       │   └── changelog/
        │       │       ├── db.changelog-master.xml
        │       │       ├── init.xml
        │       │       ├── table_customer.xml
        │       │       └── test-data.xml
        │       └── logback.xml
        └── test/
            ├── java/
            │   ├── com/
            │   │   └── giffing/
            │   │       └── wicket/
            │   │           └── spring/
            │   │               └── boot/
            │   │                   └── example/
            │   │                       └── web/
            │   │                           ├── WicketBaseIntTest.java
            │   │                           ├── WicketBaseTest.java
            │   │                           ├── WicketMockServletContext.java
            │   │                           ├── pages/
            │   │                           │   └── customers/
            │   │                           │       ├── CustomerListIntTest.java
            │   │                           │       ├── CustomerListPageTest.java
            │   │                           │       ├── create/
            │   │                           │       │   ├── CustomerCreatePageIntTest.java
            │   │                           │       │   └── CustomerCreatePageTest.java
            │   │                           │       └── edit/
            │   │                           │           └── CustomerEditPageTest.java
            │   │                           └── security/
            │   │                               └── WicketWebSecurityAdapterTestConfig.java
            │   └── test/
            │       └── com/
            │           └── giffing/
            │               └── wicket/
            │                   └── spring/
            │                       └── boot/
            │                           └── example/
            │                               └── web/
            │                                   └── WicketWebApplicationConfig.java
            └── resources/
                ├── application.yml
                └── db/
                    └── changelog/
                        └── db.changelog-master-test.xml
Download .txt
SYMBOL INDEX (505 symbols across 183 files)

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/condition/ConditionalOnWicket.java
  type Range (line 32) | enum Range {

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/condition/WicketSettingsCondition.java
  class WicketSettingsCondition (line 19) | public class WicketSettingsCondition extends SpringBootCondition {
    method getMatchOutcome (line 21) | @Override
    method getMatchOutcome (line 34) | protected ConditionOutcome getMatchOutcome(Range range, int runningVer...
    method matches (line 40) | private boolean matches(Range range, int expectedVersion, int runningV...
    method getMessage (line 48) | private String getMessage(boolean matches, Range range, int runningVer...
    method retrieveWicketVersion (line 57) | private String retrieveWicketVersion() {

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/exceptions/WicketSpringBootException.java
  class WicketSpringBootException (line 8) | public class WicketSpringBootException extends RuntimeException {
    method WicketSpringBootException (line 10) | public WicketSpringBootException() {
    method WicketSpringBootException (line 14) | public WicketSpringBootException(String message,
    method WicketSpringBootException (line 21) | public WicketSpringBootException(String message, Throwable cause) {
    method WicketSpringBootException (line 25) | public WicketSpringBootException(String message) {
    method WicketSpringBootException (line 29) | public WicketSpringBootException(Throwable cause) {

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/exceptions/extensions/ExtensionMisconfigurationException.java
  class ExtensionMisconfigurationException (line 13) | public class ExtensionMisconfigurationException extends WicketSpringBoot...
    method ExtensionMisconfigurationException (line 15) | public ExtensionMisconfigurationException(String message) {

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/WicketApplicationInitConfiguration.java
  type WicketApplicationInitConfiguration (line 18) | public interface WicketApplicationInitConfiguration {
    method init (line 27) | void init(WebApplication webApplication);

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/boot/actuator/WicketAutoConfig.java
  class WicketAutoConfig (line 11) | @Getter
    method WicketAutoConfig (line 18) | private WicketAutoConfig(Builder builder) {
    class Builder (line 24) | public static class Builder {
      method Builder (line 30) | public Builder() {
      method Builder (line 35) | public Builder(Class<?> configurationClass) {
      method Builder (line 41) | public Builder(Class<?> configurationClass, Map<String, ?> details) {
      method withDetail (line 48) | public Builder withDetail(String key, Object value) {
      method build (line 54) | public WicketAutoConfig build() {

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/boot/actuator/WicketEndpointRepository.java
  type WicketEndpointRepository (line 11) | public interface WicketEndpointRepository {
    method add (line 13) | void add(WicketAutoConfig autoconfig);
    method getConfigs (line 15) | List<WicketAutoConfig> getConfigs();

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/DurationUnit.java
  type DurationUnit (line 3) | public enum DurationUnit {

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/SessionUnit.java
  type SessionUnit (line 3) | public enum SessionUnit {

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/TypeParser.java
  class TypeParser (line 10) | @NoArgsConstructor(access = AccessLevel.PRIVATE)
    method parse (line 13) | public static Bytes parse(Long size, SessionUnit sessionUnit){
    method parse (line 22) | public static Duration parse(Long time, DurationUnit durationUnit){

FILE: wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/security/AuthenticatedWebSessionConfig.java
  type AuthenticatedWebSessionConfig (line 15) | public interface AuthenticatedWebSessionConfig {
    method getAuthenticatedWebSessionClass (line 17) | Class<? extends AbstractAuthenticatedWebSession> getAuthenticatedWebSe...

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/WicketApplication.java
  class WicketApplication (line 8) | @SpringBootApplication
    method main (line 12) | public static void main(String[] args) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/model/Customer.java
  class Customer (line 13) | @Entity

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/DefaultFilter.java
  class DefaultFilter (line 3) | public abstract class DefaultFilter implements Filter {
    method sort (line 9) | @Override
    method isAscending (line 14) | @Override
    method setSort (line 19) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/Domain.java
  type Domain (line 3) | public interface Domain<ID> {
    method getId (line 5) | ID getId();

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/Filter.java
  type Filter (line 5) | public interface Filter extends Serializable {
    method sort (line 7) | Sort sort();
    method isAscending (line 9) | boolean isAscending();
    method setSort (line 11) | void setSort(Sort sort, boolean ascending);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/FilterService.java
  type FilterService (line 5) | public interface FilterService<MODEL, ID, FILTER_MODEL extends Filter> {
    method findById (line 7) | MODEL findById(ID id);
    method findAll (line 9) | List<MODEL> findAll(Long page, Long count, FILTER_MODEL filter);
    method count (line 11) | long count(FILTER_MODEL filter);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/Sort.java
  type Sort (line 3) | public interface Sort {
    method getFieldName (line 5) | String getFieldName();

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/DefaultRepositoryService.java
  class DefaultRepositoryService (line 8) | public abstract class DefaultRepositoryService<MODEL, ID, FILTER extends...
    method getSort (line 10) | public Sort getSort(FILTER filter) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/CustomerRepository.java
  type CustomerRepository (line 7) | public interface CustomerRepository extends ListCrudRepository<Customer,...
    method countByUsernameIgnoreCase (line 9) | int countByUsernameIgnoreCase(String username);
    method findByUsernameIgnoreCase (line 11) | Customer findByUsernameIgnoreCase(String username);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/CustomerRepositoryService.java
  type CustomerRepositoryService (line 9) | public interface CustomerRepositoryService extends FilterService<Custome...
    method delete (line 11) | void delete(Long id);
    method findUsernames (line 13) | List<String> findUsernames(int count, String usernamePart);
    method save (line 15) | Customer save(Customer customer);
    method findByUsername (line 17) | Customer findByUsername(String username);
    method usernameExists (line 23) | boolean usernameExists(String username);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/CustomerRepositoryServiceImpl.java
  class CustomerRepositoryServiceImpl (line 24) | @Repository
    method CustomerRepositoryServiceImpl (line 32) | public CustomerRepositoryServiceImpl(CustomerRepository customerReposi...
    method findAll (line 36) | @Override
    method count (line 42) | @Override
    method filter (line 47) | private Specification<Customer> filter(CustomerFilter filter) {
    method isNotEmpty (line 86) | boolean isNotEmpty(String toCheck) {
    method findById (line 95) | @Override
    method delete (line 101) | @Override
    method findUsernames (line 106) | @Override
    method save (line 123) | @Override
    method usernameExists (line 128) | @Override
    method findByUsername (line 133) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/filter/CustomerFilter.java
  class CustomerFilter (line 7) | @Getter

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/filter/CustomerSort.java
  type CustomerSort (line 5) | public enum CustomerSort implements Sort {
    method CustomerSort (line 14) | CustomerSort(String sortName) {
    method getFieldName (line 18) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/specs/CustomerSpecs.java
  class CustomerSpecs (line 9) | @NoArgsConstructor(access = AccessLevel.PRIVATE)
    method hasId (line 12) | public static Specification<Customer> hasId(final Long id) {
    method hasUsername (line 16) | public static Specification<Customer> hasUsername(final String usernam...
    method hasUsernameLike (line 20) | public static Specification<Customer> hasUsernameLike(final String use...
    method hasFirstnameLike (line 24) | public static Specification<Customer> hasFirstnameLike(final String fi...
    method hasLastnameLike (line 28) | public static Specification<Customer> hasLastnameLike(final String las...
    method hasActive (line 32) | public static Specification<Customer> hasActive(final boolean active) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/SpringBootWebPackageIdentifier.java
  type SpringBootWebPackageIdentifier (line 3) | public interface SpringBootWebPackageIdentifier {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/assets/base/CustomStylesCssRessourceReference.java
  class CustomStylesCssRessourceReference (line 5) | public class CustomStylesCssRessourceReference extends CssResourceRefere...
    method CustomStylesCssRessourceReference (line 9) | public CustomStylesCssRessourceReference() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/ActionPanel.java
  class ActionPanel (line 10) | public class ActionPanel extends Panel {
    method ActionPanel (line 12) | public ActionPanel(String id, List<AbstrractActionItem> items) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/AbstractActionItemLink.java
  class AbstractActionItemLink (line 8) | public abstract class AbstractActionItemLink<T> extends AbstrractActionI...
    method AbstractActionItemLink (line 10) | protected AbstractActionItemLink(IconType iconType) {
    method onClick (line 23) | public abstract void onClick(AjaxRequestTarget target);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/AbstrractActionItem.java
  class AbstrractActionItem (line 5) | public abstract class AbstrractActionItem extends Panel {
    method AbstrractActionItem (line 7) | protected AbstrractActionItem() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/links/ActionItemLink.java
  class ActionItemLink (line 8) | public class ActionItemLink extends AbstrractActionItem {
    method ActionItemLink (line 10) | public ActionItemLink(IconType iconType, AbstractLink link) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/yesno/YesNoLink.java
  class YesNoLink (line 10) | public abstract class YesNoLink<T> extends AbstractActionItemLink<T> {
    method YesNoLink (line 12) | protected YesNoLink(IconType iconType) {
    method onClick (line 16) | @Override
    method yesClicked (line 31) | protected abstract void yesClicked(AjaxRequestTarget target);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/NotyJSReference.java
  class NotyJSReference (line 5) | public class NotyJSReference extends JQueryPluginResourceReference {
    method NotyJSReference (line 9) | public NotyJSReference() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/NotyPackagedJSReference.java
  class NotyPackagedJSReference (line 5) | public class NotyPackagedJSReference extends JQueryPluginResourceReferen...
    method NotyPackagedJSReference (line 9) | public NotyPackagedJSReference() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/NotyThemeBootstrapJSReference.java
  class NotyThemeBootstrapJSReference (line 5) | public class NotyThemeBootstrapJSReference extends JQueryPluginResourceR...
    method NotyThemeBootstrapJSReference (line 9) | public NotyThemeBootstrapJSReference() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/jquery.noty.js
  function F (line 13) | function F() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/autocomplete/AutoCompleteTextField.java
  class AutoCompleteTextField (line 9) | public abstract class AutoCompleteTextField
    method AutoCompleteTextField (line 12) | protected AutoCompleteTextField(String id, AutoCompleteSettings settin...
    method AutoCompleteTextField (line 16) | protected AutoCompleteTextField(String id, IModel<String> model, AutoC...
    method renderHead (line 20) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/basic/YesNoLabel.java
  class YesNoLabel (line 8) | public class YesNoLabel extends Label {
    method YesNoLabel (line 10) | public YesNoLabel(String id, IModel<Boolean> model) {
    method onComponentTagBody (line 14) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/border/behavior/ValidationMsgBehavior.java
  class ValidationMsgBehavior (line 9) | public class ValidationMsgBehavior extends BorderBehavior {
    method beforeRender (line 13) | @Override
    method afterRender (line 20) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/form/ValidationForm.java
  class ValidationForm (line 7) | public class ValidationForm<T> extends BootstrapForm<T> {
    method ValidationForm (line 13) | public ValidationForm(String id, IModel<T> model) {
    method onBeforeRender (line 17) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/form/ValidationFormVisitor.java
  class ValidationFormVisitor (line 14) | public class ValidationFormVisitor<R> implements IVisitor<Component, R>,...
    method component (line 20) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/form/focus/FocusBehaviour.java
  class FocusBehaviour (line 8) | public class FocusBehaviour extends Behavior {
    method renderHead (line 10) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/modal/YesNoModal.java
  class YesNoModal (line 7) | public abstract class YesNoModal extends Modal<Panel> {
    method YesNoModal (line 9) | protected YesNoModal(String id) {
    method noClicked (line 27) | protected void noClicked(AjaxRequestTarget target) {
    method yesClicked (line 31) | protected abstract void yesClicked(AjaxRequestTarget target);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/modal/YesNoPanel.java
  class YesNoPanel (line 7) | public abstract class YesNoPanel extends Panel {
    method YesNoPanel (line 10) | protected YesNoPanel(String id) {
    method noClicked (line 29) | protected abstract void noClicked(AjaxRequestTarget target);
    method yesClicked (line 31) | protected abstract void yesClicked(AjaxRequestTarget target);

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/panel/FeedbackPanel.java
  class FeedbackPanel (line 3) | public class FeedbackPanel extends org.apache.wicket.markup.html.panel.F...
    method FeedbackPanel (line 5) | public FeedbackPanel(String string) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/repeater/data/table/filter/AbstractCheckBoxFilter.java
  class AbstractCheckBoxFilter (line 10) | public class AbstractCheckBoxFilter extends AbstractFilter {
    method AbstractCheckBoxFilter (line 14) | public AbstractCheckBoxFilter(final String id, final IModel<Boolean> m...
    method createTextFieldComponent (line 21) | public CheckBox createTextFieldComponent(String componentId, final IMo...
    method getFilter (line 30) | public final CheckBox getFilter() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/repeater/data/table/filter/AbstractTextFieldFilter.java
  class AbstractTextFieldFilter (line 8) | public class AbstractTextFieldFilter<T> extends AbstractFilter {
    method AbstractTextFieldFilter (line 12) | public AbstractTextFieldFilter(final String id, final IModel<T> model,...
    method createTextFieldComponent (line 19) | public TextField<T> createTextFieldComponent(String componentId, final...
    method getFilter (line 26) | public final TextField<T> getFilter() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/BaseAuthenticatedPage.java
  class BaseAuthenticatedPage (line 24) | public abstract class BaseAuthenticatedPage extends BasePage {
    method BaseAuthenticatedPage (line 26) | protected BaseAuthenticatedPage(final PageParameters parameters) {
    method newNavbar (line 33) | protected Navbar newNavbar(String markupId) {
    method configureTheme (line 79) | private void configureTheme(PageParameters pageParameters) {
    method onConfigure (line 88) | @Override
    method hasNavigation (line 94) | protected boolean hasNavigation() {
    method newNavigation (line 98) | private Component newNavigation(String markupId) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/BasePage.java
  class BasePage (line 26) | public class BasePage extends GenericWebPage<Void> {
    method BasePage (line 30) | public BasePage(final PageParameters parameters) {
    method renderHead (line 49) | @Override
    method replaceDefaultModal (line 64) | public void replaceDefaultModal(MarkupContainer newModal, AjaxRequestT...
    method queueFormComponent (line 72) | protected void queueFormComponent(FormComponent<?> formComponent) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/WicketBootstrapInitializer.java
  class WicketBootstrapInitializer (line 14) | @ApplicationInitExtension
    method init (line 16) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/CustomerListPage.java
  class CustomerListPage (line 62) | @WicketHomePage
    method CustomerListPage (line 79) | public CustomerListPage() {
    method getWebSocketBehavior (line 106) | private WebSocketBehavior getWebSocketBehavior(FeedbackPanel feedbackP...
    method cancelButton (line 124) | private Button cancelButton() {
    method customerDataTable (line 139) | private void customerDataTable(CustomerDataProvider customerDataProvid...
    method idColumn (line 161) | private PropertyColumn<Customer, CustomerSort> idColumn() {
    method usernameColumn (line 166) | private FilteredPropertyColumn<Customer, CustomerSort> usernameColumn() {
    method firstnameColumn (line 186) | private FilteredPropertyColumn<Customer, CustomerSort> firstnameColumn...
    method lastnameColumn (line 206) | private FilteredPropertyColumn<Customer, CustomerSort> lastnameColumn() {
    method activeColumn (line 226) | private FilteredPropertyColumn<Customer, CustomerSort> activeColumn() {
    method actionColumn (line 244) | private AbstractColumn<Customer, CustomerSort> actionColumn() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/create/CustomerCreatePage.java
  class CustomerCreatePage (line 25) | @MountPath("customers/create")
    method CustomerCreatePage (line 41) | public CustomerCreatePage(Integer pageId) {
    method CustomerCreatePage (line 46) | public CustomerCreatePage() {
    method usernameField (line 59) | private FormComponent<String> usernameField() {
    method isCreatePage (line 69) | public boolean isCreatePage() {
    method submitButton (line 73) | private Component submitButton() {
    method cancelButton (line 89) | private Component cancelButton() {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/edit/CustomerEditPage.java
  class CustomerEditPage (line 16) | @MountPath("customers/edit/${" + CustomerEditPage.CUSTOMER_ID_PARAM + "}")
    method CustomerEditPage (line 26) | public CustomerEditPage(PageParameters params) {
    method isCreatePage (line 49) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/events/CustomerChangedEvent.java
  class CustomerChangedEvent (line 8) | @Getter

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/events/CustomerDeletedEvent.java
  class CustomerDeletedEvent (line 8) | @Getter

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/model/CustomerDataProvider.java
  class CustomerDataProvider (line 14) | @Getter
    method CustomerDataProvider (line 23) | public CustomerDataProvider(IModel<CustomerFilter> customerFilterModel) {
    method getFilter (line 28) | @Override
    method setFilter (line 33) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/model/UsernameSearchTextField.java
  class UsernameSearchTextField (line 15) | public class UsernameSearchTextField extends AutoCompleteTextField {
    method UsernameSearchTextField (line 22) | public UsernameSearchTextField(String id) {
    method UsernameSearchTextField (line 27) | public UsernameSearchTextField(String componentId, IModel<String> mode...
    method initComponent (line 32) | private void initComponent() {
    method getChoices (line 36) | @Override
    method settings (line 45) | private static AutoCompleteSettings settings(){

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/model/UsernameTextField.java
  class UsernameTextField (line 13) | public class UsernameTextField extends TextField<String>{
    method UsernameTextField (line 18) | public UsernameTextField(String id) {
    class UsernameExistsValidator (line 26) | public class UsernameExistsValidator implements IValidator<String>{
      method validate (line 28) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/errors/AccessDeniedPage.java
  class AccessDeniedPage (line 10) | @MountPath("problem")
    method AccessDeniedPage (line 14) | public AccessDeniedPage(PageParameters parameters) {
    method setHeaders (line 18) | @Override
    method isErrorPage (line 23) | @Override
    method isVersioned (line 28) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/errors/ExpiredPage.java
  class ExpiredPage (line 11) | @WicketExpiredPage
    method ExpiredPage (line 14) | public ExpiredPage(PageParameters parameters) {
    method setHeaders (line 18) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/errors/InternalErrorPage.java
  class InternalErrorPage (line 7) | @WicketInternalErrorPage
    method InternalErrorPage (line 9) | public InternalErrorPage(PageParameters parameters) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/footer/Footer.java
  class Footer (line 5) | public class Footer extends Panel {
    method Footer (line 6) | public Footer(String markupId) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/login/LoginPage.java
  class LoginPage (line 22) | @WicketSignInPage
    method LoginPage (line 26) | public LoginPage(PageParameters parameters) {
    class LoginForm (line 36) | private class LoginForm extends StatelessForm<LoginForm> {
      method LoginForm (line 42) | public LoginForm(String id) {
      method usernameField (line 51) | private RequiredTextField<String> usernameField() {
      method onSubmit (line 58) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/websocket/ChatPage.java
  class ChatPage (line 41) | @MountPath("chat")
    method ChatPage (line 59) | public ChatPage(PageParameters pageParameters) {
    method addChatForm (line 66) | private void addChatForm() {
    method addWebsocketBehaviour (line 114) | private void addWebsocketBehaviour() {
    class ChatMessage (line 159) | @Getter
    method renderHead (line 166) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/websocket/ChatParticipant.java
  class ChatParticipant (line 14) | @Data

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/websocket/ChatService.java
  class ChatService (line 13) | @Component
    method ChatService (line 21) | public ChatService(WebSocketMessageBroadcaster broadcaster) {
    method getParticipants (line 25) | public Set<String> getParticipants() {
    method join (line 32) | public void join(ChatParticipant chatParticipant) {
    method leave (line 44) | public void leave(ChatParticipant chatParticipant) {

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/websocket/events/CustomerMessageEvent.java
  class CustomerMessageEvent (line 10) | @Getter

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/websocket/events/JoinChatEvent.java
  class JoinChatEvent (line 7) | @Getter

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/websocket/events/LeftChatEvent.java
  class LeftChatEvent (line 7) | @Getter

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/security/SpringSecurityWicketSessionResolver.java
  class SpringSecurityWicketSessionResolver (line 13) | @RequiredArgsConstructor
    method resolve (line 18) | @Override

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/security/WicketWebSecurityAdapterConfig.java
  class WicketWebSecurityAdapterConfig (line 30) | @Configuration
    method authenticationManager (line 34) | @ConditionalOnMissingBean
    method filterChain (line 40) | @ConditionalOnMissingBean
    method passwordEncoder (line 53) | @Bean
    method allowUrlEncodedSlashHttpFirewall (line 58) | @Bean
    method userDetailsService (line 66) | @ConditionalOnMissingBean

FILE: wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/wicket/dataprovider/DefaultDataProvider.java
  class DefaultDataProvider (line 19) | public abstract class DefaultDataProvider<MODEL extends Domain<ID>,
    method getFilterService (line 27) | public abstract SERVICE getFilterService();
    method getFilter (line 29) | public abstract FILTER_MODEL getFilter();
    method setFilter (line 31) | public abstract void setFilter(FILTER_MODEL filterModel);
    method iterator (line 35) | @Override
    method size (line 47) | @Override
    method model (line 53) | @Override
    method getSortState (line 65) | @Override
    method getFilterState (line 70) | @Override
    method setFilterState (line 75) | @Override

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/WicketBaseIntTest.java
  class WicketBaseIntTest (line 25) | @SpringBootTest(classes = WicketApplication.class)
    class TestConfig (line 36) | @Configuration
      method webSocketMessageBroadcaster (line 38) | @Bean
    method setUp (line 45) | @BeforeEach
    method login (line 51) | private void login(String username, String password) {
    method getTester (line 63) | public WicketTester getTester() {
    method getWicketApplication (line 67) | public WebApplication getWicketApplication() {
    method borderPath (line 71) | protected String borderPath(String componentName){

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/WicketBaseTest.java
  class WicketBaseTest (line 31) | @ExtendWith(SpringExtension.class)
    method setUp (line 50) | @BeforeEach
    class CustomAuthenticationManager (line 57) | public static class CustomAuthenticationManager implements Authenticat...
      method authenticate (line 59) | @Override
    method login (line 66) | private void login(String username, String password) {
    method getTester (line 78) | public WicketTester getTester() {
    method getWicketApplication (line 82) | public WebApplication getWicketApplication() {
    method borderPath (line 86) | protected String borderPath(String componentName){

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/WicketMockServletContext.java
  class WicketMockServletContext (line 10) | public class WicketMockServletContext extends MockServletContext {
    method WicketMockServletContext (line 12) | public WicketMockServletContext(Application application, String path) {
    method getDefaultSessionTrackingModes (line 16) | @Override
    method getEffectiveSessionTrackingModes (line 21) | @Override

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/pages/customers/CustomerListIntTest.java
  class CustomerListIntTest (line 17) | @Transactional
    method assert_start_customer_list_page (line 21) | @Test
    method assert_delete_customer_method_called_once (line 43) | @Test
    method getTableCell (line 61) | private String getTableCell(int row, int cell) {

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/pages/customers/CustomerListPageTest.java
  class CustomerListPageTest (line 25) | public class CustomerListPageTest extends WicketBaseTest {
    method setUp (line 32) | @Override
    method assert_start_customer_list_page (line 45) | @Test
    method assert_click_customer_edit_page (line 67) | @Test
    method assert_click_customer_create_page (line 77) | @Test
    method assert_delete_customer_method_called_once (line 86) | @Test
    method getTableCell (line 100) | private String getTableCell(int row, int cell){
    method createCustomers (line 104) | public static List<Customer> createCustomers(long count) {
    method createCustomer (line 112) | public static Customer createCustomer(long i) {

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/pages/customers/create/CustomerCreatePageIntTest.java
  class CustomerCreatePageIntTest (line 18) | @Transactional
    method assert_new_customer_saved (line 25) | @Test
    method assert_error_when_create_existing_customer (line 52) | @Test
    method borderPath (line 70) | protected String borderPath(String componentName) {

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/pages/customers/create/CustomerCreatePageTest.java
  class CustomerCreatePageTest (line 19) | public class CustomerCreatePageTest extends WicketBaseTest {
    method setUp (line 24) | @Override
    method assert_customer_save_called (line 30) | @Test
    method assert_customer_not_saved_if_user_already_exist (line 59) | @Test

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/pages/customers/edit/CustomerEditPageTest.java
  class CustomerEditPageTest (line 23) | public class CustomerEditPageTest extends WicketBaseTest {
    method setUp (line 30) | @Override
    method assert_customer_not_exists (line 42) | @Test
    method assert_customer_on_load_existing (line 58) | @Test
    method assert_customer_saved (line 86) | @Test

FILE: wicket-spring-boot-starter-example/src/test/java/com/giffing/wicket/spring/boot/example/web/security/WicketWebSecurityAdapterTestConfig.java
  class WicketWebSecurityAdapterTestConfig (line 9) | @Configuration
    method configureGlobal (line 16) | @Autowired

FILE: wicket-spring-boot-starter-example/src/test/java/test/com/giffing/wicket/spring/boot/example/web/WicketWebApplicationConfig.java
  class WicketWebApplicationConfig (line 22) | @SpringBootApplication(exclude = {
    method init (line 31) | @Override
    method getSignInPageClass (line 38) | @Override
    method getHomePage (line 43) | @Override
    method getWebSessionClass (line 48) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/WicketAutoConfiguration.java
  class WicketAutoConfiguration (line 20) | @Configuration

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/WicketBootWebApplicationAutoConfiguration.java
  class WicketBootWebApplicationAutoConfiguration (line 20) | @Configuration
    method wicketBootWebApplication (line 24) | @Bean

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootSecuredWebApplication.java
  class WicketBootSecuredWebApplication (line 48) | @RequiredArgsConstructor
    method init (line 74) | @Override
    method getConfigurationType (line 93) | @Override
    method getWebSessionClass (line 98) | @Override
    method getSignInPageClass (line 103) | @SuppressWarnings("unchecked")
    method getHomePage (line 121) | @SuppressWarnings("unchecked")

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootStandardWebApplication.java
  class WicketBootStandardWebApplication (line 40) | @Lazy
    method init (line 67) | @Override
    method getConfigurationType (line 86) | @Override
    method getHomePage (line 91) | @SuppressWarnings("unchecked")

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootWebApplication.java
  type WicketBootWebApplication (line 17) | public interface WicketBootWebApplication {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/ClassCandidateScanner.java
  class ClassCandidateScanner (line 27) | @RequiredArgsConstructor
    method postConstruct (line 36) | public void postConstruct() {
    method getMappingBasePackages (line 86) | private static Collection<String> getMappingBasePackages(BeanFactory b...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/ClassCandidateScannerConfiguration.java
  class ClassCandidateScannerConfiguration (line 13) | @Configuration
    method pageCandidates (line 23) | @Bean

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/candidates/WicketClassCandidate.java
  class WicketClassCandidate (line 9) | public class WicketClassCandidate<T> {
    method WicketClassCandidate (line 13) | public WicketClassCandidate(Class<T> candidate) {
    method getCandidate (line 17) | public Class<T> getCandidate() {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/candidates/WicketClassCandidatesHolder.java
  class WicketClassCandidatesHolder (line 18) | @Getter

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyMismatchDetectedException.java
  class WicketDependencyMismatchDetectedException (line 14) | @Getter

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionChecker.java
  class WicketDependencyVersionChecker (line 24) | @Configuration
    method WicketDependencyVersionChecker (line 42) | @Autowired
    method setResourceLoader (line 47) | @Override
    method detectWicketDependencyVersionMismatch (line 52) | @PostConstruct
    method findWicketCoreVersion (line 88) | private Optional<String> findWicketCoreVersion(List<MavenDependency> w...
    method collectWicketMavenDependencies (line 97) | private List<MavenDependency> collectWicketMavenDependencies() {
    method collectWicketMavenDependencies (line 108) | private List<MavenDependency> collectWicketMavenDependencies(Resource[...
    class MavenDependency (line 126) | @RequiredArgsConstructor
      method toString (line 132) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionCheckerFailureAnalyzer.java
  class WicketDependencyVersionCheckerFailureAnalyzer (line 8) | public class WicketDependencyVersionCheckerFailureAnalyzer extends Abstr...
    method analyze (line 10) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionCheckerProperties.java
  class WicketDependencyVersionCheckerProperties (line 8) | @ConfigurationProperties(prefix = WicketDependencyVersionCheckerProperti...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/CustomAnnotationBeanNameGenerator.java
  class CustomAnnotationBeanNameGenerator (line 15) | public class CustomAnnotationBeanNameGenerator extends AnnotationBeanNam...
    method generateBeanName (line 17) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/WicketExtensionLocation.java
  type WicketExtensionLocation (line 9) | public interface WicketExtensionLocation {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/csrf/CsrfAttacksPreventionConfig.java
  class CsrfAttacksPreventionConfig (line 29) | @ApplicationInitExtension
    method init (line 40) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/csrf/CsrfAttacksPreventionProperties.java
  class CsrfAttacksPreventionProperties (line 11) | @ConfigurationProperties(prefix = CsrfAttacksPreventionProperties.PROPER...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/datastore/DataStoreHttpSessionConfig.java
  class DataStoreHttpSessionConfig (line 15) | @ApplicationInitExtension
    method init (line 25) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/datastore/DataStoreHttpSessionProperties.java
  class DataStoreHttpSessionProperties (line 7) | @ConfigurationProperties(prefix = DataStoreHttpSessionProperties.PROPERT...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/requestmapper/CryptMapperConfig.java
  class CryptMapperConfig (line 14) | @ApplicationInitExtension
    method init (line 25) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/requestmapper/CryptMapperProperties.java
  class CryptMapperProperties (line 5) | @ConfigurationProperties(CryptMapperProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resources/SpringBootMainClassResourceRegistration.java
  class SpringBootMainClassResourceRegistration (line 10) | @ApplicationInitExtension
    method init (line 16) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resourcesettings/packageresourceguard/PackageResourceGuardConfig.java
  class PackageResourceGuardConfig (line 12) | @ApplicationInitExtension
    method init (line 21) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resourcesettings/packageresourceguard/PackageResourceGuardProperties.java
  class PackageResourceGuardProperties (line 10) | @ConfigurationProperties(PackageResourceGuardProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/serializer/deflated/DeflatedJavaSerializerConfig.java
  class DeflatedJavaSerializerConfig (line 26) | @ApplicationInitExtension
    method init (line 36) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/serializer/deflated/DeflatedJavaSerializerProperties.java
  class DeflatedJavaSerializerProperties (line 7) | @ConfigurationProperties(DeflatedJavaSerializerProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/application/ApplicationSettingsConfig.java
  class ApplicationSettingsConfig (line 21) | @ApplicationInitExtension
    method init (line 29) | @Override
    method configureInternalErrorPage (line 43) | private void configureInternalErrorPage(ApplicationSettings applicatio...
    method configureAccessDeniedPage (line 59) | private void configureAccessDeniedPage(ApplicationSettings application...
    method configureExpiredPage (line 73) | private void configureExpiredPage(ApplicationSettings applicationSetti...
    method throwExceptionOnMultipleAnnotations (line 88) | private void throwExceptionOnMultipleAnnotations(Class<?> pageClass, L...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/debug/DebugSettingsConfig.java
  class DebugSettingsConfig (line 20) | @ApplicationInitExtension
    method init (line 30) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/debug/DebugSettingsProperties.java
  class DebugSettingsProperties (line 7) | @ConfigurationProperties(DebugSettingsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/exceptions/ExceptionSettingsConfig.java
  class ExceptionSettingsConfig (line 21) | @ApplicationInitExtension
    method init (line 31) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/exceptions/ExceptionSettingsProperties.java
  class ExceptionSettingsProperties (line 9) | @ConfigurationProperties(ExceptionSettingsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/general/GeneralSettingsProperties.java
  class GeneralSettingsProperties (line 8) | @ConfigurationProperties(prefix = "wicket.core.settings.general")

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/markup/MarkupSettingsConfig.java
  class MarkupSettingsConfig (line 19) | @ApplicationInitExtension
    method init (line 28) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/markup/MarkupSettingsProperties.java
  class MarkupSettingsProperties (line 8) | @ConfigurationProperties(prefix = MarkupSettingsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/pagestore/StoreSettingsConfig.java
  class StoreSettingsConfig (line 18) | @ApplicationInitExtension
    method init (line 28) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/pagestore/StoreSettingsProperties.java
  class StoreSettingsProperties (line 9) | @ConfigurationProperties(StoreSettingsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requestlogger/RequestLoggerSettingsConfig.java
  class RequestLoggerSettingsConfig (line 18) | @ApplicationInitExtension
    method init (line 28) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requestlogger/RequestLoggerSettingsProperties.java
  class RequestLoggerSettingsProperties (line 7) | @ConfigurationProperties(RequestLoggerSettingsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requrestcycle/RequestCycleSettingsConfig.java
  class RequestCycleSettingsConfig (line 16) | @ApplicationInitExtension
    method init (line 26) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requrestcycle/RequestCycleSettingsProperties.java
  class RequestCycleSettingsProperties (line 10) | @ConfigurationProperties(prefix = RequestCycleSettingsProperties.PROPERT...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/resource/ResourceSettingsConfig.java
  class ResourceSettingsConfig (line 14) | @ApplicationInitExtension
    method init (line 22) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/resource/ResourceSettingsProperties.java
  class ResourceSettingsProperties (line 7) | @ConfigurationProperties(ResourceSettingsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/beanvalidation/BeanValidationConfig.java
  class BeanValidationConfig (line 26) | @ApplicationInitExtension
    method init (line 38) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/beanvalidation/BeanValidationProperties.java
  class BeanValidationProperties (line 7) | @ConfigurationProperties(prefix = BeanValidationProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/diskstorebrowser/DiskStoreBrowserConfig.java
  class DiskStoreBrowserConfig (line 34) | @ApplicationInitExtension
    method init (line 45) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/diskstorebrowser/DiskStoreBrowserProperties.java
  class DiskStoreBrowserProperties (line 8) | @ConfigurationProperties(prefix = DiskStoreBrowserProperties.PROPERTY_PR...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/inspector/InspectorConfig.java
  class InspectorConfig (line 26) | @ApplicationInitExtension
    method init (line 36) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/inspector/InspectorProperties.java
  class InspectorProperties (line 8) | @ConfigurationProperties(prefix = InspectorProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/statelesschecker/StatelessCheckerConfig.java
  class StatelessCheckerConfig (line 27) | @ApplicationInitExtension
    method init (line 38) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/statelesschecker/StatelessCheckerProperties.java
  class StatelessCheckerProperties (line 7) | @ConfigurationProperties(prefix = StatelessCheckerProperties.PROPERTY_PR...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevToolsProperties.java
  class SpringDevToolsProperties (line 7) | @ConfigurationProperties(prefix = SpringDevToolsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevToolsSerializer.java
  class SpringDevToolsSerializer (line 26) | public class SpringDevToolsSerializer implements ISerializer {
    method SpringDevToolsSerializer (line 31) | public SpringDevToolsSerializer() {
    method serialize (line 35) | @Override
    method deserialize (line 40) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevtoolsSerializerConfig.java
  class SpringDevtoolsSerializerConfig (line 27) | @ApplicationInitExtension
    method init (line 39) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/WicketDevToolsPropertyDefaultsPostProcessor.java
  class WicketDevToolsPropertyDefaultsPostProcessor (line 16) | @Order(Ordered.LOWEST_PRECEDENCE)
    method postProcessEnvironment (line 34) | @Override
    method isWicketDevToolsEnabled (line 44) | private Boolean isWicketDevToolsEnabled(ConfigurableEnvironment enviro...
    method isLocalApplication (line 53) | private boolean isLocalApplication(ConfigurableEnvironment environment) {
    method canAddProperties (line 57) | private boolean canAddProperties(Environment environment) {
    method isRestarterInitialized (line 61) | private boolean isRestarterInitialized() {
    method isRemoteRestartEnabled (line 71) | private boolean isRemoteRestartEnabled(Environment environment) {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/wicketsource/WicketSourceConfig.java
  class WicketSourceConfig (line 25) | @ApplicationInitExtension
    method init (line 36) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/wicketsource/WicketSourceProperties.java
  class WicketSourceProperties (line 7) | @ConfigurationProperties(prefix = WicketSourceProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpoint.java
  class WicketEndpoint (line 13) | @ConfigurationProperties(prefix = "endpoints.wicket")
    method wicketExtensions (line 20) | @ReadOperation

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpointConfiguration.java
  class WicketEndpointConfiguration (line 9) | @Configuration
    method wicketEndpoint (line 12) | @Bean
    method wicketEndpointRepositoryDefault (line 17) | @Bean

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpointRepositoryDefault.java
  class WicketEndpointRepositoryDefault (line 10) | @Getter
    method add (line 15) | public void add(WicketAutoConfig autoconfig) {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SecureWebSession.java
  class SecureWebSession (line 23) | public class SecureWebSession extends AuthenticatedWebSession implements...
    method SecureWebSession (line 30) | public SecureWebSession(Request request) {
    method authenticate (line 35) | @Override
    method getRoles (line 54) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SpringSecurityConfig.java
  class SpringSecurityConfig (line 14) | @ApplicationInitExtension
    method wicketBootWebApplication (line 25) | @Bean
    method authenticatedWebSessionConfig (line 30) | @Bean

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SpringSecurityProperties.java
  class SpringSecurityProperties (line 5) | @ConfigurationProperties(prefix = SpringSecurityProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/webjars/WebjarsConfig.java
  class WebjarsConfig (line 29) | @ApplicationInitExtension
    method init (line 41) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/webjars/WebjarsProperties.java
  class WebjarsProperties (line 7) | @ConfigurationProperties(prefix = WebjarsProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/annotationscan/AnnotatedMountScannerConfig.java
  class AnnotatedMountScannerConfig (line 36) | @ApplicationInitExtension
    method init (line 50) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/annotationscan/AnnotatedMountScannerProperties.java
  class AnnotatedMountScannerProperties (line 7) | @ConfigurationProperties(prefix = AnnotatedMountScannerProperties.PROPER...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/cassandra/DataStoreCassandraConfig.java
  class DataStoreCassandraConfig (line 36) | @ApplicationInitExtension
    method init (line 48) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/cassandra/DataStoreCassandraProperties.java
  class DataStoreCassandraProperties (line 11) | @ConfigurationProperties(prefix = DataStoreCassandraProperties.PROPERTY_...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/hazelcast/DataStoreHazelcastConfig.java
  class DataStoreHazelcastConfig (line 36) | @ApplicationInitExtension
    method init (line 51) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/hazelcast/DataStoreHazelcastProperties.java
  class DataStoreHazelcastProperties (line 8) | @ConfigurationProperties(prefix = DataStoreHazelcastProperties.PROPERTY_...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/memcached/DataStoreMemcachedConfig.java
  class DataStoreMemcachedConfig (line 38) | @ApplicationInitExtension
    method init (line 49) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/memcached/DataStoreMemcachedProperties.java
  class DataStoreMemcachedProperties (line 9) | @ConfigurationProperties(prefix = DataStoreMemcachedProperties.PROPERTY_...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/redis/DataStoreRedisConfig.java
  class DataStoreRedisConfig (line 38) | @ApplicationInitExtension
    method init (line 50) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/redis/DataStoreRedisProperties.java
  class DataStoreRedisProperties (line 10) | @ConfigurationProperties(prefix = DataStoreRedisProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/htmlcompressor/HTMLCompressingConfig.java
  class HTMLCompressingConfig (line 30) | @ApplicationInitExtension
    method init (line 42) | @Override
    method setFeatureConfiguration (line 53) | private void setFeatureConfiguration(HtmlCompressor compressor) {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/htmlcompressor/HTMLCompressingProperties.java
  class HTMLCompressingProperties (line 10) | @ConfigurationProperties(prefix = HTMLCompressingProperties.PROPERTY_PRE...
    method HTMLCompressingProperties (line 35) | public HTMLCompressingProperties() {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/BootJamonAdminPage.java
  class BootJamonAdminPage (line 7) | public class BootJamonAdminPage extends JamonAdminPage {
    method renderHead (line 9) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/JamonConfig.java
  class JamonConfig (line 12) | @ApplicationInitExtension
    method init (line 21) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/JamonCssResourceReference.java
  class JamonCssResourceReference (line 6) | public class JamonCssResourceReference extends CssResourceReference {
    method JamonCssResourceReference (line 16) | private JamonCssResourceReference() {

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/JamonProperties.java
  class JamonProperties (line 7) | @ConfigurationProperties(prefix = JamonProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/restannotations/RestAnnotationsConfig.java
  class RestAnnotationsConfig (line 13) | @ApplicationInitExtension
    method init (line 24) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/restannotations/RestAnnotationsProperties.java
  class RestAnnotationsProperties (line 7) | @ConfigurationProperties(prefix = RestAnnotationsProperties.PROPERTY_PRE...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/fast2/WicketSerializerFast2Config.java
  class WicketSerializerFast2Config (line 19) | @ApplicationInitExtension
    method init (line 31) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/fast2/WicketSerializerFast2Properties.java
  class WicketSerializerFast2Properties (line 5) | @ConfigurationProperties(prefix = WicketSerializerFast2Properties.PROPER...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/kryo2/WicketSerializerKryo2Config.java
  class WicketSerializerKryo2Config (line 18) | @ApplicationInitExtension
    method init (line 30) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/kryo2/WicketSerializerKryo2Properties.java
  class WicketSerializerKryo2Properties (line 5) | @ConfigurationProperties(prefix = WicketSerializerKryo2Properties.PROPER...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/shiro/ShiroSecurityConfig.java
  class ShiroSecurityConfig (line 25) | @ApplicationInitExtension
    method shiroFilterChainDefinition (line 37) | @Bean
    method init (line 42) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/shiro/ShiroSecurityProperties.java
  class ShiroSecurityProperties (line 7) | @ConfigurationProperties(prefix = ShiroSecurityProperties.PROPERTY_PREFIX)

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/springreference/SpringReferenceConfig.java
  class SpringReferenceConfig (line 14) | @ApplicationInitExtension
    method init (line 25) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/springreference/SpringReferenceProperties.java
  class SpringReferenceProperties (line 7) | @ConfigurationProperties(prefix = SpringReferenceProperties.PROPERTY_PRE...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/WicketWebInitializer.java
  class WicketWebInitializer (line 23) | @Configuration
    method wicketFilter (line 30) | @Bean

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/WicketWebInitializerProperties.java
  class WicketWebInitializerProperties (line 12) | @ConfigurationProperties(prefix = WicketWebInitializerProperties.PROPERT...

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/config/WicketWebInitializerAutoConfig.java
  class WicketWebInitializerAutoConfig (line 21) | @Configuration
    class StandardWicketWebInitializerAutoConfiguration (line 31) | @Configuration
      method wicketWebInitializerConfig (line 36) | @Bean
    class WebSocketWicketWebInitializerAutoConfiguration (line 45) | @Configuration
      method wicketWebInitializerConfig (line 53) | @Bean
      method wicketServerEndpointConfigRegister (line 61) | @Bean
      method dummyWicketSessionResolver (line 67) | @Bean
      method webSocketEventHandler (line 73) | @Bean

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/config/WicketWebInitializerConfig.java
  type WicketWebInitializerConfig (line 15) | public interface WicketWebInitializerConfig {
    method createWicketFilter (line 20) | WicketFilter createWicketFilter(WebApplication application);

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/standard/StandardWicketWebInitializer.java
  class StandardWicketWebInitializer (line 13) | public class StandardWicketWebInitializer implements WicketWebInitialize...
    method createWicketFilter (line 15) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/DummyWicketSessionResolver.java
  class DummyWicketSessionResolver (line 5) | public class DummyWicketSessionResolver implements WicketSessionResolver {
    method resolve (line 7) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WebSocketMessageBroadcaster.java
  type WebSocketMessageBroadcaster (line 10) | public interface WebSocketMessageBroadcaster {
    method sendToAll (line 19) | void sendToAll(IWebSocketPushMessage event);
    method sendTo (line 28) | void sendTo(Object identifier, IWebSocketPushMessage event);

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WebSocketMessageSenderDefault.java
  class WebSocketMessageSenderDefault (line 10) | public class WebSocketMessageSenderDefault implements WebSocketMessageBr...
    method WebSocketMessageSenderDefault (line 18) | public WebSocketMessageSenderDefault(Application application, WicketSe...
    method sendToAll (line 23) | @Override
    method sendTo (line 34) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WebSocketWicketWebInitializer.java
  class WebSocketWicketWebInitializer (line 14) | public class WebSocketWicketWebInitializer implements WicketWebInitializ...
    method createWicketFilter (line 16) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WicketServerEndpointConfigRegister.java
  class WicketServerEndpointConfigRegister (line 17) | public class WicketServerEndpointConfigRegister implements ServletContex...
    method contextInitialized (line 21) | @Override

FILE: wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WicketSessionResolver.java
  type WicketSessionResolver (line 5) | public interface WicketSessionResolver {
    method resolve (line 13) | List<String> resolve(Object identifier);
Condensed preview — 243 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (456K chars).
[
  {
    "path": ".github/dependabot.yml",
    "chars": 527,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/workflows/maven.yml",
    "chars": 1147,
    "preview": "# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow executi"
  },
  {
    "path": ".gitignore",
    "chars": 53,
    "preview": "/target/\n/.settings/\n.classpath\n.project\n.idea/\n*.iml"
  },
  {
    "path": "README.adoc",
    "chars": 29776,
    "preview": "= Wicket autoconfiguration with Spring Boot\n\nCurrent release version:\n\n* 4.1.x - http://wicket.apache.org/[Wicket 10.6] "
  },
  {
    "path": "pom.xml",
    "chars": 11611,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoc"
  },
  {
    "path": "wicket-spring-boot-context/.gitignore",
    "chars": 40,
    "preview": "/target/\n/.settings/\n.classpath\n.project"
  },
  {
    "path": "wicket-spring-boot-context/README.md",
    "chars": 942,
    "preview": "# wicket-spring-boot-context\n\nAdvanced Level, a typical spring-boot user does not need this module.\n\n###Description\n\nThi"
  },
  {
    "path": "wicket-spring-boot-context/pom.xml",
    "chars": 1445,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/condition/ConditionalOnWicket.java",
    "chars": 1161,
    "preview": "package com.giffing.wicket.spring.boot.context.condition;\n\nimport org.springframework.context.annotation.Conditional;\n\ni"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/condition/WicketSettingsCondition.java",
    "chars": 2879,
    "preview": "package com.giffing.wicket.spring.boot.context.condition;\n\nimport com.giffing.wicket.spring.boot.context.condition.Condi"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/exceptions/WicketSpringBootException.java",
    "chars": 885,
    "preview": "package com.giffing.wicket.spring.boot.context.exceptions;\n\n/**\n * General extension from which all exception should ext"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/exceptions/extensions/ExtensionMisconfigurationException.java",
    "chars": 564,
    "preview": "package com.giffing.wicket.spring.boot.context.exceptions.extensions;\n\nimport com.giffing.wicket.spring.boot.context.exc"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/ApplicationInitExtension.java",
    "chars": 1094,
    "preview": "package com.giffing.wicket.spring.boot.context.extensions;\n\nimport java.lang.annotation.Documented;\nimport java.lang.ann"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/WicketApplicationInitConfiguration.java",
    "chars": 1214,
    "preview": "package com.giffing.wicket.spring.boot.context.extensions;\n\nimport org.apache.wicket.protocol.http.WebApplication;\n\n/**\n"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/boot/actuator/WicketAutoConfig.java",
    "chars": 1710,
    "preview": "package com.giffing.wicket.spring.boot.context.extensions.boot.actuator;\r\n\r\nimport java.io.Serializable;\r\nimport java.ut"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/boot/actuator/WicketEndpointRepository.java",
    "chars": 434,
    "preview": "package com.giffing.wicket.spring.boot.context.extensions.boot.actuator;\r\n\r\nimport java.util.List;\r\n\r\n/**\r\n * This repos"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/DurationUnit.java",
    "chars": 162,
    "preview": "package com.giffing.wicket.spring.boot.context.extensions.types;\n\npublic enum DurationUnit {\n\n    MILLISECONDS,\n    SECO"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/SessionUnit.java",
    "chars": 149,
    "preview": "package com.giffing.wicket.spring.boot.context.extensions.types;\n\npublic enum SessionUnit {\n    BYTES,\n    KILOBYTES,\n  "
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/extensions/types/TypeParser.java",
    "chars": 1078,
    "preview": "package com.giffing.wicket.spring.boot.context.extensions.types;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstru"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketAccessDeniedPage.java",
    "chars": 653,
    "preview": "package com.giffing.wicket.spring.boot.context.scan;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotati"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketExpiredPage.java",
    "chars": 653,
    "preview": "package com.giffing.wicket.spring.boot.context.scan;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotati"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketHomePage.java",
    "chars": 663,
    "preview": "package com.giffing.wicket.spring.boot.context.scan;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotati"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketInternalErrorPage.java",
    "chars": 655,
    "preview": "package com.giffing.wicket.spring.boot.context.scan;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotati"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/scan/WicketSignInPage.java",
    "chars": 677,
    "preview": "package com.giffing.wicket.spring.boot.context.scan;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotati"
  },
  {
    "path": "wicket-spring-boot-context/src/main/java/com/giffing/wicket/spring/boot/context/security/AuthenticatedWebSessionConfig.java",
    "chars": 686,
    "preview": "package com.giffing.wicket.spring.boot.context.security;\n\nimport org.apache.wicket.authroles.authentication.AbstractAuth"
  },
  {
    "path": "wicket-spring-boot-starter/.gitignore",
    "chars": 71,
    "preview": "/target/\n/.settings/\n/.classpath\n.project\n/.apt_generated/\n.factorypath"
  },
  {
    "path": "wicket-spring-boot-starter/pom.xml",
    "chars": 5969,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/WicketAutoConfiguration.java",
    "chars": 1547,
    "preview": "package com.giffing.wicket.spring.boot.starter;\n\nimport com.giffing.wicket.spring.boot.starter.app.classscanner.ClassCan"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/WicketBootWebApplicationAutoConfiguration.java",
    "chars": 1160,
    "preview": "package com.giffing.wicket.spring.boot.starter;\n\nimport com.giffing.wicket.spring.boot.starter.app.WicketBootSecuredWebA"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootSecuredWebApplication.java",
    "chars": 5648,
    "preview": "package com.giffing.wicket.spring.boot.starter.app;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport lombok.G"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootStandardWebApplication.java",
    "chars": 4154,
    "preview": "package com.giffing.wicket.spring.boot.starter.app;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport lombok.G"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/WicketBootWebApplication.java",
    "chars": 569,
    "preview": "package com.giffing.wicket.spring.boot.starter.app;\n\nimport org.apache.wicket.protocol.http.WebApplication;\n\nimport com."
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/ClassCandidateScanner.java",
    "chars": 4826,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.classscanner;\r\n\r\nimport com.giffing.wicket.spring.boot.context.scan.*"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/ClassCandidateScannerConfiguration.java",
    "chars": 1198,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.classscanner;\n\nimport lombok.RequiredArgsConstructor;\nimport org.spri"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/candidates/WicketClassCandidate.java",
    "chars": 466,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.classscanner.candidates;\n\nimport java.lang.ref.WeakReference;\n\n/**\n *"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/classscanner/candidates/WicketClassCandidatesHolder.java",
    "chars": 1055,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.classscanner.candidates;\r\n\r\nimport java.util.HashSet;\r\nimport java.ut"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyMismatchDetectedException.java",
    "chars": 631,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.verifier;\r\n\r\nimport com.giffing.wicket.spring.boot.starter.app.verifi"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionChecker.java",
    "chars": 6391,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.verifier;\r\n\r\nimport java.io.IOException;\r\nimport java.util.ArrayList;"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionCheckerFailureAnalyzer.java",
    "chars": 1605,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.verifier;\r\n\r\nimport org.springframework.boot.diagnostics.AbstractFail"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/app/verifier/WicketDependencyVersionCheckerProperties.java",
    "chars": 560,
    "preview": "package com.giffing.wicket.spring.boot.starter.app.verifier;\r\n\r\nimport lombok.Getter;\r\nimport lombok.Setter;\r\nimport org"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/CustomAnnotationBeanNameGenerator.java",
    "chars": 841,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration;\n\nimport org.springframework.beans.factory.config.BeanDefin"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/WicketExtensionLocation.java",
    "chars": 262,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions;\n\n/**\n * Marker interface to locate the Wicket E"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/csrf/CsrfAttacksPreventionConfig.java",
    "chars": 3011,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.csrf;\r\n\r\nimport com.giffing.wicket.spring.b"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/csrf/CsrfAttacksPreventionProperties.java",
    "chars": 1738,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.csrf;\n\nimport java.util.ArrayList;\nimport j"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/datastore/DataStoreHttpSessionConfig.java",
    "chars": 1866,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.datastore;\n\nimport com.giffing.wicket.sprin"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/datastore/DataStoreHttpSessionProperties.java",
    "chars": 591,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.datastore;\n\nimport lombok.Getter;\nimport lo"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/requestmapper/CryptMapperConfig.java",
    "chars": 1610,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.requestmapper;\n\nimport com.giffing.wicket.s"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/requestmapper/CryptMapperProperties.java",
    "chars": 364,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.requestmapper;\n\nimport org.springframework."
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resources/SpringBootMainClassResourceRegistration.java",
    "chars": 1078,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.resources;\r\n\r\nimport com.giffing.wicket.spr"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resourcesettings/packageresourceguard/PackageResourceGuardConfig.java",
    "chars": 1597,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.resourcesettings.packageresourceguard;\n\nimp"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/resourcesettings/packageresourceguard/PackageResourceGuardProperties.java",
    "chars": 581,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.resourcesettings.packageresourceguard;\n\nimp"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/serializer/deflated/DeflatedJavaSerializerConfig.java",
    "chars": 2450,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.serializer.deflated;\n\nimport lombok.Require"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/serializer/deflated/DeflatedJavaSerializerProperties.java",
    "chars": 516,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.serializer.deflated;\n\nimport lombok.Getter;"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/application/ApplicationSettingsConfig.java",
    "chars": 5059,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.application;\n\nimport com.giffing.w"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/debug/DebugSettingsConfig.java",
    "chars": 2519,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.debug;\n\nimport com.giffing.wicket."
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/debug/DebugSettingsProperties.java",
    "chars": 884,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.debug;\n\nimport lombok.Getter;\nimpo"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/exceptions/ExceptionSettingsConfig.java",
    "chars": 1958,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.exceptions;\n\nimport lombok.Require"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/exceptions/ExceptionSettingsProperties.java",
    "chars": 781,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.exceptions;\n\nimport lombok.Getter;"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/general/GeneralSettingsProperties.java",
    "chars": 608,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.general;\n\nimport lombok.Getter;\nim"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/markup/MarkupSettingsConfig.java",
    "chars": 2001,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.markup;\n\nimport lombok.RequiredArg"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/markup/MarkupSettingsProperties.java",
    "chars": 1423,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.markup;\n\nimport lombok.Getter;\nimp"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/pagestore/StoreSettingsConfig.java",
    "chars": 2201,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.pagestore;\n\nimport java.io.File;\n\n"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/pagestore/StoreSettingsProperties.java",
    "chars": 773,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.pagestore;\n\nimport lombok.Getter;\n"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requestlogger/RequestLoggerSettingsConfig.java",
    "chars": 1948,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requestlogger;\n\nimport com.giffing"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requestlogger/RequestLoggerSettingsProperties.java",
    "chars": 577,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requestlogger;\n\nimport lombok.Gett"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requrestcycle/RequestCycleSettingsConfig.java",
    "chars": 2219,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requrestcycle;\n\nimport lombok.Requ"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/requrestcycle/RequestCycleSettingsProperties.java",
    "chars": 982,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.requrestcycle;\n\nimport lombok.Gett"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/resource/ResourceSettingsConfig.java",
    "chars": 1398,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.resource;\n\nimport com.giffing.wick"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/core/settings/resource/ResourceSettingsProperties.java",
    "chars": 518,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.core.settings.resource;\n\nimport lombok.Getter;\ni"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/beanvalidation/BeanValidationConfig.java",
    "chars": 2135,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.beanvalidation;\n\nimport com.giffing.wic"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/beanvalidation/BeanValidationProperties.java",
    "chars": 531,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.beanvalidation;\n\nimport lombok.Getter;\n"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/diskstorebrowser/DiskStoreBrowserConfig.java",
    "chars": 2787,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.diskstorebrowser;\r"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/diskstorebrowser/DiskStoreBrowserProperties.java",
    "chars": 892,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.diskstorebrowser;\n"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/inspector/InspectorConfig.java",
    "chars": 1987,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.inspector;\n\nimport"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/inspector/InspectorProperties.java",
    "chars": 841,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.inspector;\n\nimport"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/statelesschecker/StatelessCheckerConfig.java",
    "chars": 2179,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.statelesschecker;\r"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/devutils/statelesschecker/StatelessCheckerProperties.java",
    "chars": 521,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.devutils.statelesschecker;\n"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevToolsProperties.java",
    "chars": 501,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;\r\n\r\nimp"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevToolsSerializer.java",
    "chars": 1955,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;\n\nimpor"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/SpringDevtoolsSerializerConfig.java",
    "chars": 2462,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;\n\nimpor"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/springboot/devtools/WicketDevToolsPropertyDefaultsPostProcessor.java",
    "chars": 3217,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.springboot.devtools;\r\n\r\nimp"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/wicketsource/WicketSourceConfig.java",
    "chars": 1959,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.wicketsource;\n\nimport lombo"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/development/wicketsource/WicketSourceProperties.java",
    "chars": 487,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.development.wicketsource;\n\nimport lombo"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpoint.java",
    "chars": 946,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.boot.actuator;\r\n\r\nimport com.gif"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpointConfiguration.java",
    "chars": 785,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.boot.actuator;\r\n\r\nimport org.spr"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/boot/actuator/WicketEndpointRepositoryDefault.java",
    "chars": 645,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.boot.actuator;\r\n\r\nimport com.gif"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SecureWebSession.java",
    "chars": 2629,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.security;\r\n\r\nimport java.io.Seri"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SpringSecurityConfig.java",
    "chars": 1637,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.security;\n\nimport org.springfram"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/spring/security/SpringSecurityProperties.java",
    "chars": 380,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.spring.security;\n\nimport org.springfram"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/webjars/WebjarsConfig.java",
    "chars": 2165,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.webjars;\n\nimport jdk.jfr.Registered;\nim"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/external/webjars/WebjarsProperties.java",
    "chars": 494,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.external.webjars;\n\nimport lombok.Getter;\nimport "
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/annotationscan/AnnotatedMountScannerConfig.java",
    "chars": 3280,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.annotationscan;\n\nimport java.util.ArrayLis"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/annotationscan/AnnotatedMountScannerProperties.java",
    "chars": 724,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.annotationscan;\n\nimport lombok.Getter;\nimp"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/cassandra/DataStoreCassandraConfig.java",
    "chars": 3419,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.cassandra;\n\nimport lombok.Requir"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/cassandra/DataStoreCassandraProperties.java",
    "chars": 992,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.cassandra;\n\nimport com.giffing.w"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/hazelcast/DataStoreHazelcastConfig.java",
    "chars": 3159,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.hazelcast;\n\nimport lombok.Requir"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/hazelcast/DataStoreHazelcastProperties.java",
    "chars": 670,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.hazelcast;\r\n\r\nimport com.giffing"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/memcached/DataStoreMemcachedConfig.java",
    "chars": 3485,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.memcached;\n\nimport lombok.Requir"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/memcached/DataStoreMemcachedProperties.java",
    "chars": 930,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.memcached;\n\nimport com.giffing.w"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/redis/DataStoreRedisConfig.java",
    "chars": 3253,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.redis;\n\nimport lombok.RequiredAr"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/datastore/redis/DataStoreRedisProperties.java",
    "chars": 896,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.datastore.redis;\n\nimport lombok.Getter;\nim"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/htmlcompressor/HTMLCompressingConfig.java",
    "chars": 3085,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.htmlcompressor;\n\nimport com.giffing.wicket"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/htmlcompressor/HTMLCompressingProperties.java",
    "chars": 2298,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.htmlcompressor;\n\nimport com.googlecode.htm"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/BootJamonAdminPage.java",
    "chars": 520,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.monitoring.jamon;\n\nimport org.apache.wicke"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/JamonConfig.java",
    "chars": 1382,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.monitoring.jamon;\n\nimport com.giffing.wick"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/JamonCssResourceReference.java",
    "chars": 548,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.monitoring.jamon;\n\nimport org.apache.wicke"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/JamonProperties.java",
    "chars": 525,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.monitoring.jamon;\n\nimport lombok.Getter;\ni"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/monitoring/jamon/css/jamon.css",
    "chars": 789,
    "preview": ".jamonTable {\n\tbackground-color: #03487f;\n\tborder-width: 2px;\n\tborder-style: solid;\n\tborder-color: white;\n\tfont-weight: "
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/restannotations/RestAnnotationsConfig.java",
    "chars": 1711,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.restannotations;\n\nimport com.giffing.wicke"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/restannotations/RestAnnotationsProperties.java",
    "chars": 498,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.restannotations;\n\nimport lombok.Getter;\nim"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/fast2/WicketSerializerFast2Config.java",
    "chars": 2583,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.serializer.fast2;\n\nimport com.giffing.wick"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/fast2/WicketSerializerFast2Properties.java",
    "chars": 390,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.serializer.fast2;\n\nimport org.springframew"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/kryo2/WicketSerializerKryo2Config.java",
    "chars": 2505,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.serializer.kryo2;\n\nimport com.giffing.wick"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/serializer/kryo2/WicketSerializerKryo2Properties.java",
    "chars": 389,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.serializer.kryo2;\n\nimport org.springframew"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/shiro/ShiroSecurityConfig.java",
    "chars": 3244,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.shiro;\r\n\r\nimport lombok.RequiredArgsConstr"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/shiro/ShiroSecurityProperties.java",
    "chars": 475,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.shiro;\r\n\r\nimport lombok.Getter;\r\nimport lo"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/springreference/SpringReferenceConfig.java",
    "chars": 1651,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.springreference;\n\nimport com.giffing.wicke"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/configuration/extensions/stuff/springreference/SpringReferenceProperties.java",
    "chars": 473,
    "preview": "package com.giffing.wicket.spring.boot.starter.configuration.extensions.stuff.springreference;\n\nimport lombok.Getter;\nim"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/WicketWebInitializer.java",
    "chars": 2541,
    "preview": "package com.giffing.wicket.spring.boot.starter.web;\n\nimport com.giffing.wicket.spring.boot.context.extensions.boot.actua"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/WicketWebInitializerProperties.java",
    "chars": 845,
    "preview": "package com.giffing.wicket.spring.boot.starter.web;\n\nimport jakarta.servlet.DispatcherType;\nimport lombok.Getter;\nimport"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/config/WicketWebInitializerAutoConfig.java",
    "chars": 3238,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.config;\n\nimport com.giffing.wicket.spring.boot.starter.web.servlet.st"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/config/WicketWebInitializerConfig.java",
    "chars": 749,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.config;\n\nimport com.giffing.wicket.spring.boot.starter.web.WicketWebI"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/standard/StandardWicketWebInitializer.java",
    "chars": 694,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.servlet.standard;\n\nimport com.giffing.wicket.spring.boot.starter.web."
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/DummyWicketSessionResolver.java",
    "chars": 280,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.servlet.websocket;\r\n\r\nimport java.util.List;\r\n\r\npublic class DummyWic"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WebSocketMessageBroadcaster.java",
    "chars": 1010,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.servlet.websocket;\n\nimport org.apache.wicket.protocol.ws.api.message."
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WebSocketMessageSenderDefault.java",
    "chars": 2010,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.servlet.websocket;\n\nimport org.apache.wicket.Application;\nimport org."
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WebSocketWicketWebInitializer.java",
    "chars": 684,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.servlet.websocket;\n\nimport com.giffing.wicket.spring.boot.starter.web"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WicketServerEndpointConfigRegister.java",
    "chars": 1214,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.servlet.websocket;\n\nimport com.giffing.wicket.spring.boot.context.exc"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/java/com/giffing/wicket/spring/boot/starter/web/servlet/websocket/WicketSessionResolver.java",
    "chars": 302,
    "preview": "package com.giffing.wicket.spring.boot.starter.web.servlet.websocket;\r\n\r\nimport java.util.List;\r\n\r\npublic interface Wick"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 63,
    "preview": "com.giffing.wicket.spring.boot.starter.WicketAutoConfiguration\n"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/resources/META-INF/spring-devtools.properties",
    "chars": 135,
    "preview": "restart.include.wicket-annotation=/wicketstuff-annotation-[\\\\w-\\.]+\\.jar\r\nrestart.include.wicket-spring=/wicket-spring-["
  },
  {
    "path": "wicket-spring-boot-starter/src/main/resources/META-INF/spring.factories",
    "chars": 355,
    "preview": "org.springframework.boot.env.EnvironmentPostProcessor=com.giffing.wicket.spring.boot.starter.configuration.extensions.ex"
  },
  {
    "path": "wicket-spring-boot-starter/src/main/resources/application-development.yml",
    "chars": 1284,
    "preview": "spring:\n  h2:\n    console:\n      enabled: true\n  devtools:\n    restart:\n      additional-exclude: /**/*.js, /**/*.css, /"
  },
  {
    "path": "wicket-spring-boot-starter-example/.gitignore",
    "chars": 86,
    "preview": "/target/\n/.settings/\n.classpath\n.project\n.springBeans\n/src/main/resources/public/docs/"
  },
  {
    "path": "wicket-spring-boot-starter-example/pom.xml",
    "chars": 14866,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:sc"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/doc/index.adoc",
    "chars": 51,
    "preview": "= Example Title\n\n== Sub Section 1\n\n== Sub Section 2"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/WicketApplication.java",
    "chars": 660,
    "preview": "package com.giffing.wicket.spring.boot.example;\n\nimport com.giffing.wicket.spring.boot.example.repository.services.Defau"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/WicketApplication.properties",
    "chars": 17,
    "preview": "login.label=Login"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/model/Customer.java",
    "chars": 642,
    "preview": "package com.giffing.wicket.spring.boot.example.model;\n\nimport com.giffing.wicket.spring.boot.example.repository.Domain;\n"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/DefaultFilter.java",
    "chars": 463,
    "preview": "package com.giffing.wicket.spring.boot.example.repository;\n\npublic abstract class DefaultFilter implements Filter {\n\n   "
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/Domain.java",
    "chars": 110,
    "preview": "package com.giffing.wicket.spring.boot.example.repository;\n\npublic interface Domain<ID> {\n\n    ID getId();\n\n}\n"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/Filter.java",
    "chars": 235,
    "preview": "package com.giffing.wicket.spring.boot.example.repository;\n\nimport java.io.Serializable;\n\npublic interface Filter extend"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/FilterService.java",
    "chars": 296,
    "preview": "package com.giffing.wicket.spring.boot.example.repository;\n\nimport java.util.List;\n\npublic interface FilterService<MODEL"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/Sort.java",
    "chars": 114,
    "preview": "package com.giffing.wicket.spring.boot.example.repository;\n\npublic interface Sort {\n\n    String getFieldName();\n}\n"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/DefaultRepositoryService.java",
    "chars": 747,
    "preview": "package com.giffing.wicket.spring.boot.example.repository.services;\n\nimport com.giffing.wicket.spring.boot.example.repos"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/CustomerRepository.java",
    "chars": 507,
    "preview": "package com.giffing.wicket.spring.boot.example.repository.services.customer;\n\nimport com.giffing.wicket.spring.boot.exam"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/CustomerRepositoryService.java",
    "chars": 789,
    "preview": "package com.giffing.wicket.spring.boot.example.repository.services.customer;\r\n\r\nimport com.giffing.wicket.spring.boot.ex"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/CustomerRepositoryServiceImpl.java",
    "chars": 4612,
    "preview": "package com.giffing.wicket.spring.boot.example.repository.services.customer;\n\n\nimport com.giffing.wicket.spring.boot.exa"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/filter/CustomerFilter.java",
    "chars": 610,
    "preview": "package com.giffing.wicket.spring.boot.example.repository.services.customer.filter;\n\nimport com.giffing.wicket.spring.bo"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/filter/CustomerSort.java",
    "chars": 510,
    "preview": "package com.giffing.wicket.spring.boot.example.repository.services.customer.filter;\n\nimport com.giffing.wicket.spring.bo"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/repository/services/customer/specs/CustomerSpecs.java",
    "chars": 1632,
    "preview": "package com.giffing.wicket.spring.boot.example.repository.services.customer.specs;\n\nimport com.giffing.wicket.spring.boo"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/SpringBootWebPackageIdentifier.java",
    "chars": 106,
    "preview": "package com.giffing.wicket.spring.boot.example.web;\n\npublic interface SpringBootWebPackageIdentifier {\n\n}\n"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/assets/base/CustomStylesCssRessourceReference.java",
    "chars": 447,
    "preview": "package com.giffing.wicket.spring.boot.example.web.assets.base;\n\nimport org.apache.wicket.request.resource.CssResourceRe"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/assets/base/custom.css",
    "chars": 77,
    "preview": ".navbar {\n    --bs-navbar-padding-x: 1;\n}\n\n.items {\n    padding-right: 5px;\n}"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/ActionPanel.html",
    "chars": 99,
    "preview": "<wicket:panel><span wicket:id=\"items\" class=\"items\"><span wicket:id=\"item\" /></span></wicket:panel>"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/ActionPanel.java",
    "chars": 756,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.action.panel;\n\nimport com.giffing.wicket.spring.boot.example."
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/AbstractActionItemLink.html",
    "chars": 107,
    "preview": "<wicket:panel>\n<a wicket:id=\"link\">\n\t<span aria-hidden=\"true\" wicket:id=\"icon\"></span>\n</a>\n</wicket:panel>"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/AbstractActionItemLink.java",
    "chars": 816,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.action.panel.items;\n\nimport de.agilecoders.wicket.core.markup"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/AbstrractActionItem.java",
    "chars": 260,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.action.panel.items;\n\nimport org.apache.wicket.markup.html.pan"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/links/ActionItemLink.html",
    "chars": 107,
    "preview": "<wicket:panel>\n<a wicket:id=\"link\">\n\t<span aria-hidden=\"true\" wicket:id=\"icon\"></span>\n</a>\n</wicket:panel>"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/links/ActionItemLink.java",
    "chars": 580,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.action.panel.items.links;\n\nimport com.giffing.wicket.spring.b"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/action/panel/items/yesno/YesNoLink.java",
    "chars": 1282,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.action.panel.items.yesno;\n\nimport com.giffing.wicket.spring.b"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/NotyJSReference.java",
    "chars": 386,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.notify;\r\n\r\nimport org.apache.wicket.resource.JQueryPluginReso"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/NotyPackagedJSReference.java",
    "chars": 441,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.notify;\r\n\r\nimport org.apache.wicket.resource.JQueryPluginReso"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/NotyThemeBootstrapJSReference.java",
    "chars": 467,
    "preview": "package com.giffing.wicket.spring.boot.example.web.general.notify;\r\n\r\nimport org.apache.wicket.resource.JQueryPluginReso"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/jquery.noty.js",
    "chars": 20001,
    "preview": "/*!\r\n @package noty - jQuery Notification Plugin\r\n @version version: 2.4.1\r\n @contributors https://github.com/needim/not"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/general/notify/noty.theme.bootstrap.js",
    "chars": 1973,
    "preview": "$.noty.themes.bootstrapTheme = {\r\n  name    : 'bootstrapTheme',\r\n  modal   : {\r\n    css: {\r\n      position       : 'fixe"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/autocomplete/AutoCompleteTextField.css",
    "chars": 290,
    "preview": "div.wicket-aa {\n    background-color:white;\n    border:1px solid #2387C4;\n    color:black;\n}\ndiv.wicket-aa ul {\n   list-"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/autocomplete/AutoCompleteTextField.java",
    "chars": 1058,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.autocomplete;\n\nimport org.apache.wicket.extensions.ajax.markup.h"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/basic/YesNoLabel.java",
    "chars": 672,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.basic;\n\nimport org.apache.wicket.markup.ComponentTag;\nimport org"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/border/behavior/ValidationMsgBehavior.html",
    "chars": 66,
    "preview": "<wicket:border>\n\t<div>\n\t\t<wicket:body />\n\t</div>\n</wicket:border>\n"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/border/behavior/ValidationMsgBehavior.java",
    "chars": 1185,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.border.behavior;\n\n\nimport org.apache.wicket.Component;\nimport or"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/form/ValidationForm.java",
    "chars": 615,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.form;\n\nimport de.agilecoders.wicket.core.markup.html.bootstrap.f"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/form/ValidationFormVisitor.java",
    "chars": 925,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.form;\n\nimport com.giffing.wicket.spring.boot.example.web.html.bo"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/form/focus/FocusBehaviour.java",
    "chars": 690,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.form.focus;\n\nimport org.apache.wicket.Component;\nimport org.apac"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/modal/YesNoModal.html",
    "chars": 190,
    "preview": "<html xmlns:wicket=\"http://wicket.apache.org\">\n<head>\n    <title>TextContentModal</title>\n</head>\n<body>\n<wicket:extend>"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/modal/YesNoModal.java",
    "chars": 909,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.modal;\n\nimport de.agilecoders.wicket.core.markup.html.bootstrap."
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/modal/YesNoPanel.html",
    "chars": 309,
    "preview": "<html xmlns:wicket=\"http://wicket.apache.org\">\n<head>\n        <title>TextContentModal</title>\n</head>\n<body>\n<wicket:pan"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/modal/YesNoPanel.java",
    "chars": 859,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.modal;\n\nimport org.apache.wicket.ajax.AjaxRequestTarget;\nimport "
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/panel/FeedbackPanel.html",
    "chars": 288,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<html xmlns:wicket=\"http://wicket.apache.org\">\n<body>\n<wicket:panel>\n  <div wick"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/panel/FeedbackPanel.java",
    "chars": 226,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.panel;\n\npublic class FeedbackPanel extends org.apache.wicket.mar"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/repeater/data/table/filter/AbstractCheckBoxFilter.html",
    "chars": 112,
    "preview": "<wicket:panel xmlns:wicket=\"http://wicket.apache.org\"><input type=\"checkbox\" wicket:id=\"filter\"/></wicket:panel>"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/repeater/data/table/filter/AbstractCheckBoxFilter.java",
    "chars": 1262,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.repeater.data.table.filter;\n\nimport org.apache.wicket.extensions"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/repeater/data/table/filter/AbstractTextFieldFilter.html",
    "chars": 108,
    "preview": "<wicket:panel xmlns:wicket=\"http://wicket.apache.org\"><input type=\"text\" wicket:id=\"filter\"/></wicket:panel>"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/html/repeater/data/table/filter/AbstractTextFieldFilter.java",
    "chars": 1048,
    "preview": "package com.giffing.wicket.spring.boot.example.web.html.repeater.data.table.filter;\n\nimport org.apache.wicket.extensions"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/BaseAuthenticatedPage.html",
    "chars": 376,
    "preview": "<!DOCTYPE html>\n<html xmlns:wicket=\"http://wicket.apache.org\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Spring Boo"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/BaseAuthenticatedPage.java",
    "chars": 4416,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages;\n\nimport com.giffing.wicket.spring.boot.example.web.pages.custo"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/BaseAuthenticatedPage.properties",
    "chars": 507,
    "preview": "id=Id\nusername=Username\nfirstname=Firstname\nlastname=Lastname\nactive=Active\npassword=Password\nusernameLike=Username\nfirs"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/BasePage.html",
    "chars": 691,
    "preview": "<!DOCTYPE html>\n<html xmlns:wicket=\"http://wicket.apache.org\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/BasePage.java",
    "chars": 3653,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages;\n\nimport com.giffing.wicket.spring.boot.example.web.assets.base"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/WicketBootstrapInitializer.java",
    "chars": 1673,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages;\n\nimport com.giffing.wicket.spring.boot.context.extensions.Appl"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/CustomerListPage.html",
    "chars": 1889,
    "preview": "<html xmlns:wicket=\"http://wicket.apache.org\">\n<body>\n<wicket:extend>\n    <header class=\"jumbotron subhead\" id=\"content\""
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/CustomerListPage.java",
    "chars": 12706,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages.customers;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Lis"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/create/CustomerCreatePage.html",
    "chars": 1571,
    "preview": "<html xmlns:wicket=\"http://wicket.apache.org\">\n<body>\n<wicket:extend>\n\n    <header class=\"jumbotron subhead\" id=\"content"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/create/CustomerCreatePage.java",
    "chars": 3853,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages.customers.create;\n\nimport com.giffing.wicket.spring.boot.exampl"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/edit/CustomerEditPage.java",
    "chars": 2318,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages.customers.edit;\n\nimport com.giffing.wicket.spring.boot.example."
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/edit/CustomerEditPage.properties",
    "chars": 91,
    "preview": "param.customer.id.missing=Missing customer id {0}\ncustomer.not-found=Customer not found {0}"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/events/CustomerChangedEvent.java",
    "chars": 415,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages.customers.events;\n\nimport com.giffing.wicket.spring.boot.exampl"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/events/CustomerDeletedEvent.java",
    "chars": 415,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages.customers.events;\n\nimport com.giffing.wicket.spring.boot.exampl"
  },
  {
    "path": "wicket-spring-boot-starter-example/src/main/java/com/giffing/wicket/spring/boot/example/web/pages/customers/model/CustomerDataProvider.java",
    "chars": 1412,
    "preview": "package com.giffing.wicket.spring.boot.example.web.pages.customers.model;\n\nimport com.giffing.wicket.spring.boot.example"
  }
]

// ... and 43 more files (download for full content)

About this extraction

This page contains the full source code of the MarcGiffing/wicket-spring-boot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 243 files (389.0 KB), approximately 96.1k tokens, and a symbol index with 505 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!