From 9bbec816faffb401b1a9c2de657cf14cb2eed27a Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Mon, 10 Sep 2018 21:46:38 +0200 Subject: [PATCH 1/5] MID-4559 MID-4826 client abort exceptions, logging improved --- .../web/util/MidPointProfilingServletFilter.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java index c81e994e350..66e4653a720 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.util.aspect.ProfilingDataManager; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import org.apache.catalina.connector.ClientAbortException; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -68,7 +69,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha try { chain.doFilter(request, response); } catch (IOException | ServletException | RuntimeException | Error e) { - LOGGER.debug("Encountered exception: {}: {}", e.getClass().getName(), e.getMessage(), e); + logException(e); throw e; } @@ -85,7 +86,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha try { chain.doFilter(request, response); } catch (IOException | ServletException | RuntimeException | Error e) { - LOGGER.debug("Encountered exception: {}: {}", e.getClass().getName(), e.getMessage(), e); + logException(e); throw e; } } @@ -99,5 +100,15 @@ private void prepareRequestProfilingEvent(ServletRequest request, long elapsed, ProfilingDataManager.getInstance().prepareRequestProfilingEvent(event); } + private void logException(Throwable t) throws IOException, ServletException { + if (t instanceof ClientAbortException) { + if (LOGGER.isDebugEnabled()) { + // client abort exceptions are quite OK as they are not an application/server problem + LOGGER.debug("Encountered exception: {}: {}", t.getClass().getName(), t.getMessage(), t); + } + return; + } + LOGGER.error("Encountered exception: {}: {}", t.getClass().getName(), t.getMessage(), t); + } } From dbf9df79f2acaec54c29096ac8bb27fa0ec0028c Mon Sep 17 00:00:00 2001 From: skublik Date: Tue, 11 Sep 2018 07:53:12 +0200 Subject: [PATCH 2/5] creating of health endpoint --- gui/admin-gui/pom.xml | 5 ++++ .../web/boot/MidPointSpringApplication.java | 27 +++++++++++++++++-- .../midpoint/web/boot/WebSecurityConfig.java | 3 +++ .../component/prism/ContainerValuePanel.java | 2 +- .../component/prism/PrismContainerPanel.java | 4 +++ .../src/main/resources/application.yml | 12 ++++++++- 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/gui/admin-gui/pom.xml b/gui/admin-gui/pom.xml index 973bf361966..33d8992f796 100644 --- a/gui/admin-gui/pom.xml +++ b/gui/admin-gui/pom.xml @@ -145,6 +145,11 @@ org.apache.cxf cxf-rt-transports-http + + + org.springframework.boot + spring-boot-starter-actuator + org.webjars diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java index fddb1940419..1487119ba27 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java @@ -35,6 +35,17 @@ import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.web.mappings.MappingsEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration; +import org.springframework.boot.actuate.endpoint.EndpointFilter; +import org.springframework.boot.actuate.endpoint.ExposableEndpoint; +import org.springframework.boot.actuate.endpoint.web.EndpointServlet; +import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointDiscoverer; +import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; @@ -62,6 +73,7 @@ import ro.isdc.wro.http.WroFilter; import javax.servlet.DispatcherType; +import javax.servlet.Servlet; import java.io.File; import java.lang.management.ManagementFactory; @@ -103,7 +115,10 @@ PropertyPlaceholderAutoConfiguration.class, SecurityFilterAutoConfiguration.class, MultipartAutoConfiguration.class, - HttpEncodingAutoConfiguration.class + HttpEncodingAutoConfiguration.class, + WebEndpointAutoConfiguration.class, + ServletManagementContextAutoConfiguration.class, + HealthEndpointAutoConfiguration.class }) @SpringBootConfiguration public class MidPointSpringApplication extends SpringBootServletInitializer { @@ -206,7 +221,7 @@ public FilterRegistrationBean springSecurityFilterChain() { registration.addUrlPatterns("/*"); return registration; } - + @Bean public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) { FilterRegistrationBean registration = new FilterRegistrationBean(); @@ -214,6 +229,14 @@ public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) { registration.addUrlPatterns("/wro/*"); return registration; } + +// @Bean +// public ServletRegistrationBean actuatorServlet(Servlet endpointServlet ) { +// ServletRegistrationBean registration = new ServletRegistrationBean(); +// registration.setServlet(endpointServlet); +// registration.addUrlMappings("/actuator/*"); +// return registration; +// } @Bean public ServletRegistrationBean cxfServlet() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java index d2e12f5a3f5..fba6fbbf773 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java @@ -107,6 +107,9 @@ public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/less/**"); web.ignoring().antMatchers("/wicket/resource/**"); + + web.ignoring().antMatchers("/health"); + web.ignoring().antMatchers("/actuator/**"); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java index c7ef4d59459..561686d4ed9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java @@ -135,7 +135,7 @@ public boolean isVisible() { } - private boolean hasAnyProperty() { + public boolean hasAnyProperty() { for(ItemWrapper item : getModelObject().getItems()) { if(item instanceof PropertyOrReferenceWrapper) { return true; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java index b560f9da880..6a8df89c777 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java @@ -250,6 +250,10 @@ public String getObject() { if(((ContainerValueWrapper)item.getModelObject()).getContainer() !=null && ((ContainerValueWrapper)item.getModelObject()).getContainer().isShowOnTopLevel()) { item.add(AttributeModifier.append("class", "top-level-prism-container")); } + + if(!containerPanel.hasAnyProperty()) { + item.add(AttributeModifier.append("style", " border-top: none; padding-top: 0px; ")); + } } diff --git a/gui/admin-gui/src/main/resources/application.yml b/gui/admin-gui/src/main/resources/application.yml index 03cf6fdb5c5..710f8cf5bed 100644 --- a/gui/admin-gui/src/main/resources/application.yml +++ b/gui/admin-gui/src/main/resources/application.yml @@ -46,4 +46,14 @@ auth: # enable-csrf: false # default for midpoint is true # more properties with default values can be found here: -# https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html \ No newline at end of file +# https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html + +management: + endpoint: + health: + enabled: true + + +logging: + level: + org.springframework: TRACE \ No newline at end of file From 61be67421faa33c20409f581c798d113a5ec8d58 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Sep 2018 10:32:03 +0200 Subject: [PATCH 3/5] Add some relation-related documentation (MID-3581) ...and minor code changes. --- .../refinery/RelationRegistryDummyImpl.java | 27 +----- .../midpoint/schema/RelationRegistry.java | 96 ++++++++++++++++--- .../schema/relation/RelationRegistryImpl.java | 25 ----- .../xml/ns/public/common/common-core-3.xsd | 4 - 4 files changed, 82 insertions(+), 70 deletions(-) diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java index 375fd18c739..cf13c829e5b 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java @@ -53,31 +53,6 @@ public boolean isOfKind(QName relation, RelationKindType kind) { return kind == RelationKindType.MEMBERSHIP && (relation == null || QNameUtil.match(relation, ORG_DEFAULT)); } - @Override - public boolean isManager(QName relation) { - return false; - } - - @Override - public boolean isDelegation(QName relation) { - return false; - } - - @Override - public boolean isMembership(QName relation) { - return isOfKind(relation, RelationKindType.MEMBERSHIP); - } - - @Override - public boolean isOwner(QName relation) { - return false; - } - - @Override - public boolean isApprover(QName relation) { - return false; - } - @Override public boolean processRelationOnLogin(QName relation) { return false; @@ -116,7 +91,7 @@ public QName normalizeRelation(QName relation) { } @Override - public void applyRelationConfiguration(SystemConfigurationType relationsDefinition) { + public void applyRelationConfiguration(SystemConfigurationType systemConfiguration) { } @Override diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java index 8179135b910..450039dc2b9 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java @@ -20,64 +20,130 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; import java.util.Collection; import java.util.List; /** - * TODO think about precise place of this interface + * A component that holds current definition of object relations. * * @author mederly */ public interface RelationRegistry { + /** + * Returns all relation definitions: explicitly specified as well as built-in ones. + * Invalid or duplicate definitions are filtered out and not mentioned here. + * + * Each relation is listed only once even if it can be referenced using various QNames (e.g. null, default, org:default). + */ List getRelationDefinitions(); - RelationDefinitionType getRelationDefinition(QName relation); - - // SchemaException is thrown as SystemException as it really should not occur + /** + * Returns a relation definition for a specified relation name. + * The relation name need not be normalized, i.e. all names for a relation might be used here + * (e.g. null, default, org:default); resulting in the same definition. + * + * Returns null if the definition cannot be found. + */ + @Nullable RelationDefinitionType getRelationDefinition(QName relation); + /** + * Returns true if the relation is of specified kind. The relation name need not be normalized. + */ boolean isOfKind(QName relation, RelationKindType kind); - boolean isManager(QName relation); + default boolean isMembership(QName relation) { + return isOfKind(relation, RelationKindType.MEMBERSHIP); + } - boolean isDelegation(QName relation); + default boolean isManager(QName relation) { + return isOfKind(relation, RelationKindType.MANAGER); + } - boolean isMembership(QName relation); + default boolean isDelegation(QName relation) { + return isOfKind(relation, RelationKindType.DELEGATION); + } - boolean isOwner(QName relation); + @SuppressWarnings("unused") + default boolean isApprover(QName relation) { + return isOfKind(relation, RelationKindType.APPROVER); + } - boolean isApprover(QName relation); + @SuppressWarnings("unused") + default boolean isOwner(QName relation) { + return isOfKind(relation, RelationKindType.OWNER); + } + /** + * Whether this kind of relations is processed on login. Currently only relations of MEMBERSHIP and DELEGATION kinds are. + * This is to be configured in the future (MID-3581). + */ boolean processRelationOnLogin(QName relation); + /** + * Whether this kind of relations is processed on recompute. Currently only relations of MEMBERSHIP, MANAGER and DELEGATION kinds are. + * This is to be configured in the future (MID-3581). + */ boolean processRelationOnRecompute(QName relation); + /** + * Whether this kind of relations is included in parentOrgRef. Currently only relations of MEMBERSHIP but *not* META kinds are. + * This is to be configured in the future (MID-3581). + */ boolean includeIntoParentOrgRef(QName relation); + /** + * Returns the default relation i.e. the one that is equivalent to the null relation name. + * Please do NOT use this information for queries nor determining the behavior of the relation! Use relation kinds instead. + */ QName getDefaultRelation(); + /** + * Checks whether the relation is equivalent to the default one. + * Please do NOT use this information for determining the behavior of the relation! Use relation kinds instead. + */ + boolean isDefault(QName relation); + + /** + * Returns all relations of a given kind. Note that the result might be an empty set; although it is a bad practice to + * configure midPoint in that way. Unused relations are better hidden using categories. + */ @NotNull Collection getAllRelationsFor(RelationKindType kind); - QName getDefaultRelationFor(RelationKindType kind); + /** + * Returns the default relation for a given kind. The result might be a null value; although it is a bad practice to + * configure midPoint in that way. Unused relations are better hidden using categories. + */ + @Nullable QName getDefaultRelationFor(RelationKindType kind); + /** + * Returns a normalized relation name, i.e. the one that is used in the "ref" item on the definition. It should be qualified + * (so please DO NOT use unqualified relation names in the definitions!) + * + * If the relation is unknown, the relation name is returned unchanged. + */ @NotNull QName normalizeRelation(QName relation); - void applyRelationConfiguration(SystemConfigurationType relationsDefinition); - - boolean isDefault(QName relation); + /** + * This method should be called whenever midPoint determines that the relations definition in system configuration might + * have been changed. + */ + void applyRelationConfiguration(SystemConfigurationType systemConfiguration); /** * Returns aliases of a relation. Currently these are: - * - unnormalized version of the relation QNme + * - unqualified version of the relation QName * - null if the relation is the default one * + * -- * In the future we might return some other values (e.g. explicitly configured aliases) as well. * But we would need to adapt prismContext.relationsEquivalent method and other comparison methods as well. - * It is perhaps not worth the effort. + * So it is perhaps not worth the effort. */ @NotNull Collection getAliases(QName relation); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java index f1455e777dc..fc0ba3dd888 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java @@ -124,31 +124,6 @@ public boolean isOfKind(QName relation, RelationKindType kind) { return indexedRelationDefinitions.isOfKind(relation, kind); } - @Override - public boolean isMembership(QName relation) { - return isOfKind(relation, RelationKindType.MEMBERSHIP); - } - - @Override - public boolean isManager(QName relation) { - return isOfKind(relation, RelationKindType.MANAGER); - } - - @Override - public boolean isDelegation(QName relation) { - return isOfKind(relation, RelationKindType.DELEGATION); - } - - @Override - public boolean isOwner(QName relation) { - return isOfKind(relation, RelationKindType.OWNER); - } - - @Override - public boolean isApprover(QName relation) { - return isOfKind(relation, RelationKindType.APPROVER); - } - @Override public boolean processRelationOnLogin(QName relation) { return indexedRelationDefinitions.processRelationOnLogin(relation); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 49f58266f8f..004b6b57f82 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -16319,7 +16319,6 @@ Membership relation, usually meaning "has" or "is member of". - Used as a relation value in object references. Specifies that the subject is a member of organization, or that the subject has been assigned a role in a way that he gets authorizations and other content provided by that role. @@ -16378,9 +16377,6 @@ a rule conflict during assignment (e.g. SoD conflict) or if there is any similar situation. - This is a generic approver used for all the situation. The system may be customized - with more specific approver roles, e.g. technicalApprover, securityApprover, etc. - This approver is responsible for the use of the role, which mostly means that he decides about role assignment. It is NOT meant to approve role changes. Role owner is meant for that purpose. From ebe7d47da4515decf4c14c15c9008b6ab5495f19 Mon Sep 17 00:00:00 2001 From: skublik Date: Tue, 11 Sep 2018 10:43:52 +0200 Subject: [PATCH 4/5] MID-4849 --- gui/admin-gui/pom.xml | 4 ++++ .../web/boot/MidPointSpringApplication.java | 19 ++++++++++--------- .../midpoint/web/boot/WebSecurityConfig.java | 1 - .../src/main/resources/application.yml | 6 +++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/gui/admin-gui/pom.xml b/gui/admin-gui/pom.xml index 33d8992f796..5a9b6c58e7d 100644 --- a/gui/admin-gui/pom.xml +++ b/gui/admin-gui/pom.xml @@ -150,6 +150,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.boot + spring-boot-actuator-autoconfigure + org.webjars diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java index ffd9a69d0ce..054dbe32b33 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java @@ -19,6 +19,7 @@ import java.io.File; import java.lang.management.ManagementFactory; import java.time.Duration; +import java.util.Arrays; import javax.servlet.DispatcherType; @@ -30,11 +31,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.Banner; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet.WebMvcEndpointManagementContextConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; @@ -57,6 +62,7 @@ import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.boot.web.servlet.server.Session; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ImportResource; @@ -112,9 +118,12 @@ SecurityFilterAutoConfiguration.class, MultipartAutoConfiguration.class, HttpEncodingAutoConfiguration.class, + EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class, + WebMvcEndpointManagementContextConfiguration.class, ServletManagementContextAutoConfiguration.class, - HealthEndpointAutoConfiguration.class + HealthEndpointAutoConfiguration.class, + HealthIndicatorAutoConfiguration.class }) @SpringBootConfiguration public class MidPointSpringApplication extends SpringBootServletInitializer { @@ -227,14 +236,6 @@ public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilte return registration; } -// @Bean -// public ServletRegistrationBean actuatorServlet(Servlet endpointServlet ) { -// ServletRegistrationBean registration = new ServletRegistrationBean(); -// registration.setServlet(endpointServlet); -// registration.addUrlMappings("/actuator/*"); -// return registration; -// } - @Bean public ServletRegistrationBean cxfServlet() { ServletRegistrationBean registration = new ServletRegistrationBean<>(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java index a5a1217f7da..cee464a712c 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java @@ -109,7 +109,6 @@ public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/wicket/resource/**"); - web.ignoring().antMatchers("/health"); web.ignoring().antMatchers("/actuator/**"); } diff --git a/gui/admin-gui/src/main/resources/application.yml b/gui/admin-gui/src/main/resources/application.yml index 710f8cf5bed..a26e0492aaf 100644 --- a/gui/admin-gui/src/main/resources/application.yml +++ b/gui/admin-gui/src/main/resources/application.yml @@ -54,6 +54,6 @@ management: enabled: true -logging: - level: - org.springframework: TRACE \ No newline at end of file +#logging: +# level: +# org.springframework: TRACE \ No newline at end of file From 52621e173d334c783e98e09e377192a4532286ef Mon Sep 17 00:00:00 2001 From: kate Date: Tue, 11 Sep 2018 11:31:11 +0200 Subject: [PATCH 5/5] MID-4851 checkbox selecting in the popup fix --- .../gui/api/component/AssignmentPopup.java | 13 ++--- .../gui/api/component/ChooseMemberPopup.java | 57 +++++++++++++++++-- .../FocusTypeAssignmentPopupTabPanel.java | 2 +- .../midpoint/web/component/TabbedPanel.java | 20 ++++++- 4 files changed, 74 insertions(+), 18 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java index 74413e5f017..eba525a2e2a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.TabbedPanel; import com.evolveum.midpoint.web.component.dialog.Popupable; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; import com.evolveum.midpoint.web.component.util.VisibleBehaviour; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -107,14 +108,7 @@ public void onClick(AjaxRequestTarget target) { } }; addButton.add(AttributeAppender.append("title", getAddButtonTitleModel())); - addButton.add(new VisibleEnableBehaviour(){ - private static final long serialVersionUID = 1L; - - @Override - public boolean isEnabled(){ - return isAssignButtonEnabled(); - } - }); + addButton.add(new EnableBehaviour(() -> isAssignButtonEnabled())); addButton.setOutputMarkupId(true); form.add(addButton); } @@ -289,7 +283,8 @@ private int getTabPanelSelectedCount(WebMarkupContainer panel){ } private void tabLabelPanelUpdate(AjaxRequestTarget target){ - target.add(AssignmentPopup.this); + getTabbedPanel().reloadCountLabels(target); + target.add(get(ID_FORM).get(ID_ASSIGN_BUTTON)); } private TabbedPanel getTabbedPanel(){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java index 13be8bd381e..d45f9800cb8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.gui.api.component; import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab; +import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.InOidFilter; @@ -32,13 +33,16 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.TabbedPanel; import com.evolveum.midpoint.web.component.dialog.Popupable; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.StringResourceModel; import javax.xml.namespace.QName; @@ -100,19 +104,34 @@ public void onClick(AjaxRequestTarget target) { @Override public void onClick(AjaxRequestTarget target) { - tabs.forEach(panelTab -> { + boolean orgPanelProcessed = false; + for (ITab panelTab : tabs){ WebMarkupContainer tabPanel = ((CountablePanelTab)panelTab).getPanel(); if (tabPanel == null){ - return; + continue; } - MemberPopupTabPanel memberPanel = (MemberPopupTabPanel) tabPanel; - executeMemberOperation(memberPanel.getObjectType().getTypeQName(), createInOidQuery(memberPanel.getSelectedObjectsList()), + if (memberPanel.getObjectType().equals(ObjectTypes.ORG) && orgPanelProcessed){ + continue; + } + List selectedObjects = memberPanel.getObjectType().equals(ObjectTypes.ORG) ? memberPanel.getPreselectedObjects() : + memberPanel.getSelectedObjectsList(); + + if (selectedObjects == null || selectedObjects.size() == 0){ + continue; + } + executeMemberOperation(memberPanel.getObjectType().getTypeQName(), + createInOidQuery(selectedObjects), memberPanel.prepareDelta(), target); - }); + if (memberPanel.getObjectType().equals(ObjectTypes.ORG)){ + orgPanelProcessed = true; + } + } ChooseMemberPopup.this.getPageBase().hideMainPopup(target); } }; + addButton.add(AttributeAppender.append("title", getAddButtonTitleModel())); + addButton.add(new EnableBehaviour(() -> isAddButtonEnabled())); addButton.setOutputMarkupId(true); form.add(addButton); } @@ -304,7 +323,9 @@ protected int getTabPanelSelectedCount(WebMarkupContainer panel){ } protected void tabLabelPanelUpdate(AjaxRequestTarget target){ - target.add(getTabbedPanel()); + getTabbedPanel().reloadCountLabels(target); + target.add(get(ID_FORM).get(ID_ADD_BUTTON)); + } private TabbedPanel getTabbedPanel(){ @@ -320,6 +341,30 @@ protected ObjectQuery createInOidQuery(List selectedObjectsList){ return ObjectQuery.createObjectQuery(InOidFilter.createInOid(oids)); } + private IModel getAddButtonTitleModel(){ + return new LoadableModel(true) { + @Override + protected String load() { + return !isAddButtonEnabled() ? createStringResource("AssignmentPopup.addButtonTitle").getString() : ""; + } + }; + } + + private boolean isAddButtonEnabled(){ + TabbedPanel tabbedPanel = getTabbedPanel(); + List tabs = (List) tabbedPanel.getTabs().getObject(); + for (ITab tab : tabs){ + WebMarkupContainer memberPanel = ((CountablePanelTab)tab).getPanel(); + if (memberPanel == null){ + continue; + } + if (((MemberPopupTabPanel) memberPanel).getSelectedObjectsList().size() > 0) { + return true; + } + } + return false; + } + protected void executeMemberOperation(QName type, ObjectQuery memberQuery, ObjectDelta delta, AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java index bbd01f16526..bfb8a6736db 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java @@ -74,7 +74,7 @@ private List getSupportedRelations() { protected Map getSelectedAssignmentsMap(){ Map assignmentsMap = new HashedMap(); - List selectedObjects = getSelectedObjectsList(); + List selectedObjects = getObjectType().equals(ObjectTypes.ORG) ? getPreselectedObjects() : getSelectedObjectsList(); QName relation = getRelationValue(); selectedObjects.forEach(selectedObject -> { assignmentsMap.put(selectedObject.getOid(), ObjectTypeUtil.createAssignmentTo(selectedObject, relation)); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java index 9e336e81182..19f0050460a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java @@ -19,6 +19,7 @@ import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.WicketRuntimeException; +import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; @@ -37,6 +38,7 @@ import com.evolveum.midpoint.gui.api.model.CountModelProvider; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; /** @@ -49,6 +51,8 @@ public class TabbedPanel extends Panel { * id used for child panels */ public static final String TAB_PANEL_ID = "panel"; + public static final String ID_TABS_CONTAINER = "tabs-container"; + public static final String ID_TABS = "tabs"; public static final String RIGHT_SIDE_TAB_ITEM_ID = "rightSideTabItem"; public static final String RIGHT_SIDE_TAB_ID = "rightSideTab"; @@ -106,11 +110,11 @@ public Integer getObject() { } }; - WebMarkupContainer tabsContainer = newTabsContainer("tabs-container"); + WebMarkupContainer tabsContainer = newTabsContainer(ID_TABS_CONTAINER); add(tabsContainer); // add the loop used to generate tab names - tabsContainer.add(new Loop("tabs", tabCount) { + tabsContainer.add(new Loop(ID_TABS, tabCount) { private static final long serialVersionUID = 1L; @Override @@ -131,6 +135,7 @@ protected void populateItem(final LoopItem item) { } Label countLabel = new Label(ID_COUNT, countModel); countLabel.setVisible(countModel != null); + countLabel.setOutputMarkupId(true); countLabel.add(AttributeModifier.append("class", new AbstractReadOnlyModel() { private static final long serialVersionUID = 1L; @@ -492,4 +497,15 @@ protected void onTabChange(int index) {} public interface RightSideItemProvider extends Serializable { Component createRightSideItem(String id); } + + public void reloadCountLabels(AjaxRequestTarget target){ + Loop tabbedPanel = ((Loop)get(ID_TABS_CONTAINER).get(ID_TABS)); + int tabsCount = tabbedPanel.getIterations(); + for (int i = 0; i < tabsCount; i++){ + Component countLabel = tabbedPanel.get(Integer.toString(i)).get(ID_LINK).get(ID_COUNT); + if (countLabel != null) { + target.add(countLabel); + } + } + } }