View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.syncope.client.console;
20  
21  import com.giffing.wicket.spring.boot.starter.web.config.WicketWebInitializerAutoConfig.WebSocketWicketWebInitializerAutoConfiguration;
22  import java.time.OffsetDateTime;
23  import java.util.List;
24  import java.util.Map;
25  import javax.cache.Cache;
26  import org.apache.syncope.client.console.commons.AccessPolicyConfProvider;
27  import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionLinksProvider;
28  import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActionsProvider;
29  import org.apache.syncope.client.console.commons.AnyWizardBuilderAdditionalSteps;
30  import org.apache.syncope.client.console.commons.ExternalResourceProvider;
31  import org.apache.syncope.client.console.commons.ImplementationInfoProvider;
32  import org.apache.syncope.client.console.commons.PolicyTabProvider;
33  import org.apache.syncope.client.console.commons.StatusProvider;
34  import org.apache.syncope.client.console.init.ClassPathScanImplementationLookup;
35  import org.apache.syncope.client.console.wizards.any.UserFormFinalizer;
36  import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
37  import org.apache.syncope.client.ui.commons.actuate.SyncopeCoreHealthIndicator;
38  import org.apache.syncope.common.keymaster.client.api.ServiceOps;
39  import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
40  import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStart;
41  import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
42  import org.apache.wicket.request.resource.IResource;
43  import org.springframework.beans.factory.annotation.Qualifier;
44  import org.springframework.boot.autoconfigure.SpringBootApplication;
45  import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
46  import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
47  import org.springframework.boot.builder.SpringApplicationBuilder;
48  import org.springframework.boot.context.properties.EnableConfigurationProperties;
49  import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
50  import org.springframework.cache.annotation.EnableCaching;
51  import org.springframework.context.annotation.Bean;
52  
53  @SpringBootApplication(proxyBeanMethods = false)
54  @EnableConfigurationProperties(ConsoleProperties.class)
55  @EnableCaching
56  public class SyncopeConsoleApplication extends SpringBootServletInitializer {
57  
58      public static void main(final String[] args) {
59          new SpringApplicationBuilder(SyncopeConsoleApplication.class).
60                  properties("spring.config.name:console").
61                  build().run(args);
62      }
63  
64      @Override
65      protected SpringApplicationBuilder configure(final SpringApplicationBuilder builder) {
66          return builder.properties(Map.of(
67                  WebSocketWicketWebInitializerAutoConfiguration.REGISTER_SERVER_ENDPOINT_ENABLED, false,
68                  "spring.config.name", "console")).
69                  sources(SyncopeConsoleApplication.class);
70      }
71  
72      @ConditionalOnMissingBean
73      @Bean
74      public SyncopeWebApplication syncopeWebApplication(
75              final ConsoleProperties props,
76              final ClassPathScanImplementationLookup lookup,
77              final ServiceOps serviceOps,
78              final ExternalResourceProvider resourceProvider,
79              final AnyDirectoryPanelAdditionalActionsProvider anyDirectoryPanelAdditionalActionsProvider,
80              final AnyDirectoryPanelAdditionalActionLinksProvider anyDirectoryPanelAdditionalActionLinksProvider,
81              final AnyWizardBuilderAdditionalSteps anyWizardBuilderAdditionalSteps,
82              final StatusProvider statusProvider,
83              final ImplementationInfoProvider implementationInfoProvider,
84              final AccessPolicyConfProvider accessPolicyConfProvider,
85              final List<PolicyTabProvider> policyTabProviders,
86              final List<UserFormFinalizer> userFormFinalizers,
87              final List<IResource> resources,
88              @Qualifier(SyncopeWebApplication.LOGGEDOUT_SESSIONID_CACHE)
89              final Cache<String, OffsetDateTime> loggedoutSessionIdCache,
90              @Qualifier(SyncopeWebApplication.DESTROYED_SESSIONID_CACHE)
91              final Cache<String, OffsetDateTime> destroyedSessionIdCache,
92              final DynamicMenuStringResourceLoader dynamicMenuStringResourceLoader) {
93  
94          return new SyncopeWebApplication(
95                  props,
96                  lookup,
97                  serviceOps,
98                  resourceProvider,
99                  anyDirectoryPanelAdditionalActionsProvider,
100                 anyDirectoryPanelAdditionalActionLinksProvider,
101                 anyWizardBuilderAdditionalSteps, statusProvider,
102                 implementationInfoProvider,
103                 accessPolicyConfProvider,
104                 policyTabProviders,
105                 userFormFinalizers,
106                 resources,
107                 loggedoutSessionIdCache,
108                 destroyedSessionIdCache,
109                 dynamicMenuStringResourceLoader);
110     }
111 
112     @ConditionalOnMissingBean
113     @Bean
114     public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator(
115             final ServiceOps serviceOps, final ConsoleProperties props) {
116 
117         return new SyncopeCoreHealthIndicator(
118                 serviceOps,
119                 props.getAnonymousUser(),
120                 props.getAnonymousKey(),
121                 props.isUseGZIPCompression());
122     }
123 
124     @ConditionalOnProperty(
125             prefix = "keymaster", name = "enableAutoRegistration", havingValue = "true", matchIfMissing = true)
126     @Bean
127     public KeymasterStart keymasterStart() {
128         return new KeymasterStart(NetworkService.Type.CONSOLE);
129     }
130 
131     @ConditionalOnProperty(
132             prefix = "keymaster", name = "enableAutoRegistration", havingValue = "true", matchIfMissing = true)
133     @Bean
134     public KeymasterStop keymasterStop() {
135         return new KeymasterStop(NetworkService.Type.CONSOLE);
136     }
137 }