From 45a956fdfdcb6c0a89340fc69368477c72c11e9a Mon Sep 17 00:00:00 2001 From: Jj! Date: Tue, 9 Nov 2021 08:57:58 -0600 Subject: [PATCH 001/125] [IGA-417] fix call to `getMemberships` with proper parameter --- .../middleware/grouper/ws/rest/GrouperServiceRest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/rest/GrouperServiceRest.java b/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/rest/GrouperServiceRest.java index f13377992903..7a0953675ffd 100644 --- a/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/rest/GrouperServiceRest.java +++ b/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/rest/GrouperServiceRest.java @@ -1389,7 +1389,7 @@ public static WsGetMembershipsResults getMemberships(GrouperVersion clientVersio wsRestGetMembershipsRequest.getServiceLookup(), wsRestGetMembershipsRequest.getPageSize(), wsRestGetMembershipsRequest.getPageNumber(), wsRestGetMembershipsRequest.getSortString(), wsRestGetMembershipsRequest.getAscending(), - wsRestGetMembershipsRequest.getPageNumberForMember(), + wsRestGetMembershipsRequest.getPageSizeForMember(), wsRestGetMembershipsRequest.getPageNumberForMember(), wsRestGetMembershipsRequest.getSortStringForMember(), wsRestGetMembershipsRequest.getAscendingForMember(), wsRestGetMembershipsRequest.getPageIsCursor(), From be963650d5ff4ce2e238f35d1bd8129b32810b01 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 1 Apr 2022 14:51:46 -0700 Subject: [PATCH 002/125] IAMSE-1531 updating pom with new parent --- grouper-misc/grouper-authentication/pom.xml | 5 ++--- grouper-webapp/pom.xml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/grouper-misc/grouper-authentication/pom.xml b/grouper-misc/grouper-authentication/pom.xml index 2f1620677552..1c6cfd7cca41 100644 --- a/grouper-misc/grouper-authentication/pom.xml +++ b/grouper-misc/grouper-authentication/pom.xml @@ -24,7 +24,7 @@ edu.internet2.middleware.grouper grouper-parent - 2.5.0-SNAPSHOT + 2.6.0-SNAPSHOT ../../grouper-parent @@ -133,5 +133,4 @@ - - + \ No newline at end of file diff --git a/grouper-webapp/pom.xml b/grouper-webapp/pom.xml index 5f6895df8d0b..dee275079178 100644 --- a/grouper-webapp/pom.xml +++ b/grouper-webapp/pom.xml @@ -24,7 +24,7 @@ edu.internet2.middleware.grouper grouper-parent - 2.5.0-SNAPSHOT + 2.6.0-SNAPSHOT ../grouper-parent From 605c92553eea9b140e6e19a00760c920646673b4 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 1 Apr 2022 14:56:25 -0700 Subject: [PATCH 003/125] IAMSE-1531 refactored code to be accessed plugin style --- ...external.authentication.example.properties | 2 +- .../Pac4jServletContainerInitializer.java | 58 ----------------- .../filter/CallbackFilterFacade.java | 50 --------------- .../filter/FilterFascadeUtils.java | 20 ------ .../filter/SecurityFilterFacade.java | 50 --------------- .../filter/CallbackFilterDecorator.java | 52 +++++++++++++++ .../filter/FilterDecoratorUtils.java | 12 ++++ .../filter/Reinitializable.java | 5 ++ .../filter/ReinitializingTimer.java | 38 +++++++++++ .../filter/SecurityFilterDecorator.java | 48 ++++++++++++++ .../javax.servlet.ServletContainerInitializer | 3 +- grouper/conf/grouper.base.properties | 26 +++++++- .../CommonServletContainerInitializer.java | 25 +++++++- .../servlet/filter/PluginFilterDelegate.java | 63 +++++++++++++++++++ 14 files changed, 265 insertions(+), 187 deletions(-) delete mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/Pac4jServletContainerInitializer.java delete mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/CallbackFilterFacade.java delete mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/FilterFascadeUtils.java delete mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/SecurityFilterFacade.java create mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/CallbackFilterDecorator.java create mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/FilterDecoratorUtils.java create mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java create mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java create mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/SecurityFilterDecorator.java create mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/servlet/filter/PluginFilterDelegate.java diff --git a/grouper-misc/grouper-authentication/conf/grouper.external.authentication.example.properties b/grouper-misc/grouper-authentication/conf/grouper.external.authentication.example.properties index 7f6a4bdbaacf..5403f631cfcd 100644 --- a/grouper-misc/grouper-authentication/conf/grouper.external.authentication.example.properties +++ b/grouper-misc/grouper-authentication/conf/grouper.external.authentication.example.properties @@ -1,7 +1,7 @@ # these are properties to configure PAC4J with CAS # Enable External Authentication -external.authentication.enabled = true +# see: grouper.base.properties for plugin configuration description within grouper # External Authentication Mechanism (cas,saml,oidc) external.authentication.auth.mechanism = cas diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/Pac4jServletContainerInitializer.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/Pac4jServletContainerInitializer.java deleted file mode 100644 index 32568444b895..000000000000 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/Pac4jServletContainerInitializer.java +++ /dev/null @@ -1,58 +0,0 @@ -package edu.internet2.middleware.grouper.authentication; - -import edu.internet2.middleware.grouper.authentication.filter.CallbackFilterFacade; -import edu.internet2.middleware.grouper.authentication.filter.SecurityFilterFacade; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.servlet.*; -import java.util.Map; -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; -import java.util.regex.Pattern; - -public class Pac4jServletContainerInitializer implements ServletContainerInitializer { - private static final Logger LOGGER = LoggerFactory.getLogger(Pac4jServletContainerInitializer.class); - private Timer timer = new Timer(); - private Map config; - - @Override - public void onStartup(Set> c, ServletContext ctx) throws ServletException { - LOGGER.info("initializing pac4j"); - - CallbackFilterFacade callbackFilterFacade = new CallbackFilterFacade(); - FilterRegistration.Dynamic callbackFilter = ctx.addFilter("callbackFilter", callbackFilterFacade); - callbackFilter.addMappingForUrlPatterns(null, false, "/*"); - - SecurityFilterFacade securityFilterFacade = new SecurityFilterFacade(); - FilterRegistration.Dynamic securityFilter = ctx.addFilter("securityFilter", SecurityFilterFacade.class); - securityFilter.addMappingForUrlPatterns(null, false, "/*"); - - this.config = ConfigUtils.getBestGrouperConfiguration().propertiesMap(Pattern.compile("^external\\.authentication\\.([^.]+)$")); - - TimerTask timerTask = new TimerTask() { - @Override - public void run() { - Map curConfig = ConfigUtils.getBestGrouperConfiguration().propertiesMap(Pattern.compile("^external\\.authentication\\.([^.]+)$")); - if (!areEqual(config, curConfig)) { - config = curConfig; - callbackFilterFacade.initDelegate(); - securityFilterFacade.initDelegate(); - LOGGER.info("Pac4j External Authentication configuration reloaded"); - } - } - }; - - int period = ConfigUtils.getBestGrouperConfiguration().propertyValueInt("external.authentication.config.reload.milliseconds", 60 * 1000); - this.timer.schedule(timerTask, period, period); - } - - private boolean areEqual(Map first, Map second) { - if (first.size() != second.size()) { - return false; - } - return first.entrySet().stream() - .allMatch(e -> e.getValue().equals(second.get(e.getKey()))); - } -} diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/CallbackFilterFacade.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/CallbackFilterFacade.java deleted file mode 100644 index b0dac7ff77bf..000000000000 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/CallbackFilterFacade.java +++ /dev/null @@ -1,50 +0,0 @@ -package edu.internet2.middleware.grouper.authentication.filter; - -import edu.internet2.middleware.grouper.authentication.ConfigUtils; -import edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig; -import org.pac4j.jee.filter.CallbackFilter; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -public class CallbackFilterFacade implements Filter { - private CallbackFilter uiDelegate; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - this.uiDelegate = new CallbackFilter(); - this.uiDelegate.init(filterConfig); - this.initDelegate(); - } - - public void initDelegate() { - this.uiDelegate.setDefaultUrl(ConfigUtils.getBestGrouperConfiguration().propertyValueString("external.authentication.defaultUrl", "/")); - this.uiDelegate.setRenewSession(true); - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - boolean runGrouperUi = GrouperHibernateConfig.retrieveConfig().propertyValueBoolean("grouper.is.ui", false); - - if (runGrouperUi && FilterFascadeUtils.isExternalAuthenticationEnabled() && isCallbackUrlCalled((HttpServletRequest) request)) { - this.uiDelegate.doFilter(request, response, chain); - } else { - chain.doFilter(request, response); - } - } - - private static boolean isCallbackUrlCalled(HttpServletRequest request) { - return FilterFascadeUtils.getRequestPathInContext(request).matches(ConfigUtils.getBestGrouperConfiguration().propertyValueString("external.authentication.callbackUrl", "/callback")); - } - - @Override - public void destroy() { - this.uiDelegate.destroy(); - } -} diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/FilterFascadeUtils.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/FilterFascadeUtils.java deleted file mode 100644 index 5acb2adcc2a3..000000000000 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/FilterFascadeUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package edu.internet2.middleware.grouper.authentication.filter; - -import edu.internet2.middleware.grouper.authentication.ConfigUtils; -import edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig; - -import javax.servlet.http.HttpServletRequest; - -public class FilterFascadeUtils { - protected static String getRequestPathInContext(HttpServletRequest request) { - return request.getRequestURI().replaceFirst(request.getServletContext().getContextPath(), ""); - } - - protected static boolean isExternalAuthenticationEnabled() { - return ConfigUtils.getBestGrouperConfiguration().propertyValueBoolean("external.authentication.enabled", false); - } - - protected static boolean isRunUi() { - return GrouperHibernateConfig.retrieveConfig().propertyValueBoolean("grouper.is.ui", false); - } -} diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/SecurityFilterFacade.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/SecurityFilterFacade.java deleted file mode 100644 index f194709b1f3d..000000000000 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/filter/SecurityFilterFacade.java +++ /dev/null @@ -1,50 +0,0 @@ -package edu.internet2.middleware.grouper.authentication.filter; - -import edu.internet2.middleware.grouper.authentication.ConfigUtils; -import edu.internet2.middleware.grouper.authentication.Pac4jConfigFactory; -import org.pac4j.core.authorization.authorizer.DefaultAuthorizers; -import org.pac4j.core.config.ConfigBuilder; -import org.pac4j.core.util.Pac4jConstants; -import org.pac4j.jee.filter.SecurityFilter; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import java.io.IOException; - -public class SecurityFilterFacade implements Filter { - private SecurityFilter uiDelegate; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - this.uiDelegate = new SecurityFilter(); - this.uiDelegate.init(filterConfig); - this.initDelegate(); - } - - public void initDelegate() { - if (ConfigUtils.isGrouperUi() && FilterFascadeUtils.isExternalAuthenticationEnabled()) { - this.uiDelegate.setSharedConfig(ConfigBuilder.build(Pac4jConfigFactory.class.getCanonicalName())); - this.uiDelegate.setClients("client"); - this.uiDelegate.setMatchers(String.join(Pac4jConstants.ELEMENT_SEPARATOR, "securityExclusions")); - this.uiDelegate.setAuthorizers(DefaultAuthorizers.NONE); - } - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - if (ConfigUtils.isGrouperUi() && FilterFascadeUtils.isExternalAuthenticationEnabled()) { - this.uiDelegate.doFilter(request, response, chain); - } else { - chain.doFilter(request, response); - } - } - - @Override - public void destroy() { - this.uiDelegate.destroy(); - } -} diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/CallbackFilterDecorator.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/CallbackFilterDecorator.java new file mode 100644 index 000000000000..faa1bba53e24 --- /dev/null +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/CallbackFilterDecorator.java @@ -0,0 +1,52 @@ +package edu.internet2.middleware.grouper.plugins.authentication.filter; + +import edu.internet2.middleware.grouper.authentication.ConfigUtils; +import edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig; +import org.pac4j.jee.filter.CallbackFilter; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + +public class CallbackFilterDecorator extends CallbackFilter implements Reinitializable { + private Timer timer = new Timer(); + + private static boolean isCallbackUrlCalled(HttpServletRequest request) { + return getRequestPathInContext(request).matches(ConfigUtils.getBestGrouperConfiguration().propertyValueString("external.authentication.callbackUrl", "/callback")); + } + + private static String getRequestPathInContext(HttpServletRequest request) { + return request.getRequestURI().replaceFirst(request.getServletContext().getContextPath(), ""); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + super.init(filterConfig); + this.initDecorator(); + TimerTask timerTask = new ReinitializingTimer(this); + int period = ConfigUtils.getBestGrouperConfiguration().propertyValueInt("external.authentication.config.reload.milliseconds", 60 * 1000); + this.timer.schedule(timerTask, period, period); + } + + public void initDecorator() { + this.setDefaultUrl(ConfigUtils.getBestGrouperConfiguration().propertyValueString("external.authentication.defaultUrl", "/")); + this.setRenewSession(true); + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + boolean runGrouperUi = GrouperHibernateConfig.retrieveConfig().propertyValueBoolean("grouper.is.ui", false); + + if (runGrouperUi && FilterDecoratorUtils.isExternalAuthenticationEnabled() && isCallbackUrlCalled((HttpServletRequest) request)) { + super.doFilter(request, response, chain); + } else { + chain.doFilter(request, response); + } + } +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/FilterDecoratorUtils.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/FilterDecoratorUtils.java new file mode 100644 index 000000000000..2ff674137fad --- /dev/null +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/FilterDecoratorUtils.java @@ -0,0 +1,12 @@ +package edu.internet2.middleware.grouper.plugins.authentication.filter; + +import edu.internet2.middleware.grouper.authentication.ConfigUtils; + +import java.util.Map; + +public class FilterDecoratorUtils { + protected static boolean isExternalAuthenticationEnabled() { + return ConfigUtils.getBestGrouperConfiguration().propertyValueBoolean("grouper.is.extAuth.enabled", false); + } + +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java new file mode 100644 index 000000000000..643356931c88 --- /dev/null +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java @@ -0,0 +1,5 @@ +package edu.internet2.middleware.grouper.plugins.authentication.filter; + +public interface Reinitializable { + void initDecorator(); +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java new file mode 100644 index 000000000000..1d10c3fd00d9 --- /dev/null +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java @@ -0,0 +1,38 @@ +package edu.internet2.middleware.grouper.plugins.authentication.filter; + +import edu.internet2.middleware.grouper.authentication.ConfigUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; +import java.util.TimerTask; +import java.util.regex.Pattern; + +public class ReinitializingTimer extends TimerTask { + private static final Logger LOGGER = LoggerFactory.getLogger(ReinitializingTimer.class); + + private Map config; + private final Reinitializable initTarget; + + public ReinitializingTimer(Reinitializable initTarget) { + this.initTarget = initTarget; + } + + protected static boolean areEqual(Map first, Map second) { + if (first.size() != second.size()) { + return false; + } + return first.entrySet().stream().allMatch(e -> e.getValue().equals(second.get(e.getKey()))); + } + + @Override + public void run() { + Map curConfig = ConfigUtils.getBestGrouperConfiguration() + .propertiesMap(Pattern.compile("^external\\.authentication\\.([^.]+)$")); + if (!areEqual(config, curConfig)) { + config = curConfig; + initTarget.initDecorator(); + LOGGER.info("Pac4j External Authentication configuration reloaded"); + } + } +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/SecurityFilterDecorator.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/SecurityFilterDecorator.java new file mode 100644 index 000000000000..a4b975701d8d --- /dev/null +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/SecurityFilterDecorator.java @@ -0,0 +1,48 @@ +package edu.internet2.middleware.grouper.plugins.authentication.filter; + +import edu.internet2.middleware.grouper.authentication.ConfigUtils; +import edu.internet2.middleware.grouper.authentication.Pac4jConfigFactory; +import org.pac4j.core.authorization.authorizer.DefaultAuthorizers; +import org.pac4j.core.config.ConfigBuilder; +import org.pac4j.core.util.Pac4jConstants; +import org.pac4j.jee.filter.SecurityFilter; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + +public class SecurityFilterDecorator extends SecurityFilter implements Reinitializable { + private Timer timer = new Timer(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + super.init(filterConfig); + this.initDecorator(); + TimerTask timerTask = new ReinitializingTimer(this); + int period = ConfigUtils.getBestGrouperConfiguration().propertyValueInt("external.authentication.config.reload.milliseconds", 60 * 1000); + this.timer.schedule(timerTask, period, period); + } + + public void initDecorator() { + if (ConfigUtils.isGrouperUi() && FilterDecoratorUtils.isExternalAuthenticationEnabled()) { + this.setSharedConfig(ConfigBuilder.build(Pac4jConfigFactory.class.getCanonicalName())); + this.setClients("client"); + this.setMatchers(String.join(Pac4jConstants.ELEMENT_SEPARATOR, "securityExclusions")); + this.setAuthorizers(DefaultAuthorizers.NONE); + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + if (ConfigUtils.isGrouperUi() && FilterDecoratorUtils.isExternalAuthenticationEnabled()) { + super.doFilter(request, response, chain); + } else { + chain.doFilter(request, response); + } + } +} \ No newline at end of file diff --git a/grouper-webapp/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/grouper-webapp/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer index 9d5b5f1df302..22a3ba2ce086 100644 --- a/grouper-webapp/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer +++ b/grouper-webapp/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer @@ -1,2 +1 @@ -edu.internet2.middleware.grouper.authentication.Pac4jServletContainerInitializer -edu.internet2.middleware.grouper.j2ee.CommonServletContainerInitializer +edu.internet2.middleware.grouper.j2ee.CommonServletContainerInitializer \ No newline at end of file diff --git a/grouper/conf/grouper.base.properties b/grouper/conf/grouper.base.properties index 379fb1a718d5..a2065503cd00 100644 --- a/grouper/conf/grouper.base.properties +++ b/grouper/conf/grouper.base.properties @@ -4114,6 +4114,28 @@ grouper.felix.cache.rootdir = /opt/grouper/grouperWebapp/WEB-INF/grouperFelixCac # {valueType: "string", required: true, order: 13000, showEl: "${numberOfImplementations > $i$}", repeatGroup: "osgiImplementation", repeatCount: 10} # grouperOsgiPlugin.testConfigId.osgiImplementation.$i$.implementsInterface = +############################################ +## External Authentication plugin +############################################ +# Enable external authorization security filters +# {valueType: "boolean", defaultValue: "false"} +# grouper.is.extAuth.enabled = + +# Name of the jar containing the external authorization plugin +# {valueType: "string", required: true} +# grouper.extAuth.jarname = grouper-authentication-plugin-0.0.1-SNAPSHOT.jar + +# Callback filter implementation classname +# ex: edu.internet2.middleware.grouper.plugins.testImplementation.SamplePluginProviderServiceImpl +# ${valueType: "class", required: true} +# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.plugins.authentication.filter.CallbackFilterDecorator + +# Security filter implementation classname +# ex: edu.internet2.middleware.grouper.plugins.testImplementation.SamplePluginProviderServiceImpl +# ${valueType: "class", required: true} +# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.plugins.authentication.filter.SecurityFilterDecorator + + ############################################ ## logging loggers (levels and appenders) @@ -4140,6 +4162,4 @@ grouper.felix.cache.rootdir = /opt/grouper/grouperWebapp/WEB-INF/grouperFelixCac # which appender to send logs to (optional), default to the appender for the class logs to, or default to: grouper_error # e.g. CATALINA, stderr, grouper_error, grouper_daemon, grouper_pspng, grouper_provisioning, grouper_ws, grouper_ws_longRunning # {valueType: "string", regex: "^grouper\\.logger\\.[^.]+\\.appender$"} -# grouper.logger..appender = - - +# grouper.logger..appender = \ No newline at end of file diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/CommonServletContainerInitializer.java b/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/CommonServletContainerInitializer.java index 07b19b4514ce..aab87801de9b 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/CommonServletContainerInitializer.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/CommonServletContainerInitializer.java @@ -2,11 +2,13 @@ import java.util.Set; +import javax.servlet.FilterRegistration; import javax.servlet.FilterRegistration.Dynamic; import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import edu.internet2.middleware.grouper.j2ee.servlet.filter.PluginFilterDelegate; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -35,7 +37,9 @@ public void onStartup(Set> arg0, ServletContext context) throws Servlet boolean runGrouperScim = GrouperHibernateConfig.retrieveConfig().propertyValueBoolean("grouper.is.scim", false); boolean runGrouperDaemon = GrouperHibernateConfig.retrieveConfig().propertyValueBoolean("grouper.is.daemon", false); - + + boolean runGrouperExtAuth = GrouperConfig.retrieveConfig().propertyValueBoolean("grouper.is.extAuth.enabled", false); + try { String statusServletName = "StatusServlet"; Class statusServletClass = Class.forName("edu.internet2.middleware.grouper.j2ee.status.GrouperStatusServlet"); @@ -45,7 +49,22 @@ public void onStartup(Set> arg0, ServletContext context) throws Servlet } catch (ClassNotFoundException e) { throw new RuntimeException("why edu.internet2.middleware.grouper.j2ee.status.GrouperStatusServlet is not there??"); } - + + // If using external auth, the security filters need to be installed first in the list, so this happens before other options to + // ensure correct order in the context - this is 'safe' : if the needed plugin isn't available, the default behavior for the + // filters should be to do nothing but continue the normal filter chain without issue. + if (runGrouperExtAuth) { + LOG.info("Initializing plugin security filters for external authentication"); + String jarname = GrouperConfig.retrieveConfig().propertyValueString("grouper.extAuth.jarname", ""); + PluginFilterDelegate filterDelegate = new PluginFilterDelegate(jarname, GrouperConfig.retrieveConfig().propertyValueString("grouper.extAuth.filter.callback.implmentation.className", "")); + FilterRegistration.Dynamic callbackFilter = context.addFilter("callbackFilter", filterDelegate); + callbackFilter.addMappingForUrlPatterns(null, false, "/*"); + + filterDelegate = new PluginFilterDelegate(jarname, GrouperConfig.retrieveConfig().propertyValueString("grouper.extAuth.filter.security.implmentation.className", "")); + FilterRegistration.Dynamic securityFilter = context.addFilter("securityFilter", filterDelegate); + securityFilter.addMappingForUrlPatterns(null, false, "/*"); + } + if (runMockServices) { String uiServletName = "MockServices"; @@ -181,4 +200,4 @@ public void run() { } -} +} \ No newline at end of file diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/servlet/filter/PluginFilterDelegate.java b/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/servlet/filter/PluginFilterDelegate.java new file mode 100644 index 000000000000..c56d95b550fc --- /dev/null +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/servlet/filter/PluginFilterDelegate.java @@ -0,0 +1,63 @@ +package edu.internet2.middleware.grouper.j2ee.servlet.filter; + +import edu.internet2.middleware.grouper.plugins.GrouperPluginManager; +import edu.internet2.middleware.grouper.util.GrouperUtil; +import org.apache.commons.logging.Log; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +/** + * PluginFilterDelegate will delegate behavior to the correct grouper-authentication plugin filter. If the plugin is not properly + * installed, this delegate should fail silently and simply pass control onto the next filter in the filter chain without issue + */ +public class PluginFilterDelegate implements Filter { + private static final Log LOG = GrouperUtil.getLog(PluginFilterDelegate.class); + + protected Filter delegateFilter = new Filter() { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + } + }; + + public PluginFilterDelegate(String moduleJarNameInput, String pluginClassName) { + try { + delegateFilter = GrouperPluginManager.retrievePluginImplementation(moduleJarNameInput, Filter.class, pluginClassName); + } + catch (Throwable e) { + LOG.error("Error retrieving plugin implementation : [" + pluginClassName + "]", e); + } + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + delegateFilter.init(filterConfig); + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { + delegateFilter.doFilter(servletRequest, servletResponse, filterChain); + } + + @Override + public void destroy() { + delegateFilter.destroy(); + } + +} \ No newline at end of file From 1872da53b8b9ecc641541c687c62daf04abfa161 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Fri, 1 Apr 2022 15:12:50 -0700 Subject: [PATCH 004/125] IAMSE-1531 initialing the config --- .../plugins/authentication/filter/ReinitializingTimer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java index 1d10c3fd00d9..1224f27c0164 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java @@ -16,6 +16,7 @@ public class ReinitializingTimer extends TimerTask { public ReinitializingTimer(Reinitializable initTarget) { this.initTarget = initTarget; + config = ConfigUtils.getBestGrouperConfiguration().propertiesMap(Pattern.compile("^external\\.authentication\\.([^.]+)$")); } protected static boolean areEqual(Map first, Map second) { @@ -27,8 +28,7 @@ protected static boolean areEqual(Map first, Map @Override public void run() { - Map curConfig = ConfigUtils.getBestGrouperConfiguration() - .propertiesMap(Pattern.compile("^external\\.authentication\\.([^.]+)$")); + Map curConfig = ConfigUtils.getBestGrouperConfiguration().propertiesMap(Pattern.compile("^external\\.authentication\\.([^.]+)$")); if (!areEqual(config, curConfig)) { config = curConfig; initTarget.initDecorator(); From ce284c6713f861b7f7867bf5d5632e490b2db7b5 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 3 Apr 2022 19:15:50 -0400 Subject: [PATCH 005/125] GRP-2027: Provide expression support for LDAP filters --- .../ldap/ldaptive/LdaptiveSessionImpl.java | 15 +++++++ .../middleware/grouper/util/GrouperUtil.java | 41 +++++++++++++++++-- .../LdapProvisionerTestUtils.java | 5 ++- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/ldap/ldaptive/LdaptiveSessionImpl.java b/grouper/src/grouper/edu/internet2/middleware/grouper/ldap/ldaptive/LdaptiveSessionImpl.java index b92c9d08dc5a..dcab94c3488d 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/ldap/ldaptive/LdaptiveSessionImpl.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/ldap/ldaptive/LdaptiveSessionImpl.java @@ -749,6 +749,21 @@ private AttributeModificationType translateModificationType(LdapModificationType private SearchResult processSearchRequest(String ldapServerId, Connection ldap, String searchDn, LdapSearchScope ldapSearchScope, String filter, String[] attributeNames, Long sizeLimit) throws LdapException { SearchRequest searchRequest = new SearchRequest(); + + if (filter != null) { + filter = filter.trim(); + if (filter.startsWith("${") && filter.endsWith("}")) { + + if (this.debug) { + this.debugLog.append("Ldaptive filterJexl '").append(filter).append("'\n"); + } + filter = StringUtils.replace(filter, "$newline$", "\n"); + Map variableMap = new HashMap(); + variableMap.put("grouperUtil", new GrouperUtil()); + filter = (String)GrouperUtil.substituteExpressionLanguageScript(filter, variableMap, true, false, false); + } + } + searchRequest.setSearchFilter(new SearchFilter(filter)); searchRequest.setReturnAttributes(attributeNames); diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java b/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java index a5cb0ebda7d3..4713b6eee079 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java @@ -1803,6 +1803,35 @@ public static String ldapEscapeRdnValue(String rdnValue) { RDN rdn = new RDN("cn", rdnValue); return rdn.toMinimallyEncodedString().substring("cn=".length()); } + + /** + * active directory date from millis 1970 date + * @return the AD date + */ + public static long ldapAdDateCurrent() { + return ldapAdDateFromMillis1970(System.currentTimeMillis()); + } + + /** + * active directory date from millis 1970 date + * @param millisSince1970 + * @return the AD date + */ + public static long ldapAdDateFromMillis1970(long millisSince1970) { + + // Calendar calendar = java.util.Calendar.getInstance(); + // + // calendar.setTime(new Date("1/1/1601")); + // long base_1601_time = calendar.getTimeInMillis(); + // + // calendar.setTime(new Date("1/1/1970")); + // long base_1970_time = calendar.getTimeInMillis(); + // + // // 11644473600000 + // long ms_offset = base_1970_time - base_1601_time; + + return (millisSince1970 + 11644473600000L) * 10000; + } /** * @@ -10960,7 +10989,9 @@ public static String substituteExpressionLanguage(String stringToParse, } //allow utility methods - jc.set("grouperUtil", new GrouperUtilElSafe()); + if (!variableMap.containsKey("grouperUtil")) { + jc.set("grouperUtil", new GrouperUtilElSafe()); + } //if you add another one here, add it in the logs below // matching ${ exp } (non-greedy) @@ -11146,7 +11177,9 @@ public static Object substituteExpressionLanguageScript(String script, } //allow utility methods - jc.set("grouperUtil", new GrouperUtilElSafe()); + if (!variableMap.containsKey("grouperUtil")) { + jc.set("grouperUtil", new GrouperUtilElSafe()); + } //if you add another one here, add it in the logs below script = script.trim(); @@ -14122,7 +14155,9 @@ public static String substituteExpressionLanguageTemplate(String script, } //allow utility methods - jc.set("grouperUtil", new GrouperUtilElSafe()); + if (!variableMap.containsKey("grouperUtil")) { + jc.set("grouperUtil", new GrouperUtilElSafe()); + } //if you add another one here, add it in the logs below script = script.trim(); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java index c925f2074476..cec64a1170bd 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java @@ -4,13 +4,12 @@ import org.apache.commons.lang.StringUtils; -import edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig; +import edu.internet2.middleware.grouper.GrouperSession; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningType; import edu.internet2.middleware.grouper.app.provisioning.ProvisioningConsumer; import edu.internet2.middleware.grouper.cfg.dbConfig.GrouperDbConfig; import edu.internet2.middleware.grouper.changeLog.esb.consumer.EsbConsumer; import edu.internet2.middleware.grouper.ldap.LdapSessionUtils; -import edu.internet2.middleware.grouper.misc.GrouperStartup; import edu.internet2.middleware.grouper.util.CommandLineExec; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClient.config.ConfigPropertiesCascadeBase; @@ -23,6 +22,8 @@ public class LdapProvisionerTestUtils { public static void main(String args[]) throws Exception { + GrouperSession.startRootSession(); + setupSubjectSource(); } private static String dockerPath = null; From e6e4625e961128429b4128fbbfddb2abb057ec58 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 3 Apr 2022 19:20:35 -0400 Subject: [PATCH 006/125] entity and membership attribute values --- ...sioningEntityAttributeDropdownOptions.java | 51 +++++++++++++++++++ ...ingMembershipAttributeDropdownOptions.java | 51 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntityAttributeDropdownOptions.java create mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningMembershipAttributeDropdownOptions.java diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntityAttributeDropdownOptions.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntityAttributeDropdownOptions.java new file mode 100644 index 000000000000..93801221b7f2 --- /dev/null +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntityAttributeDropdownOptions.java @@ -0,0 +1,51 @@ +package edu.internet2.middleware.grouper.app.provisioning; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import edu.internet2.middleware.grouper.app.config.GrouperConfigurationModuleAttribute; +import edu.internet2.middleware.grouper.cfg.dbConfig.OptionValueDriver; +import edu.internet2.middleware.grouper.util.GrouperUtil; +import edu.internet2.middleware.grouperClient.collections.MultiKey; +import edu.internet2.middleware.grouperClientExt.org.apache.commons.lang3.StringUtils; + +public class ProvisioningEntityAttributeDropdownOptions implements OptionValueDriver { + + private Map configSuffixToConfigModuleAttribute; + + + @Override + public void setConfigSuffixToConfigModuleAttribute( + Map configSuffixToConfigModuleAttribute) { + + this.configSuffixToConfigModuleAttribute = configSuffixToConfigModuleAttribute; + + } + + + + @Override + public List retrieveKeysAndLabels() { + + GrouperConfigurationModuleAttribute grouperConfigurationModuleAttribute = configSuffixToConfigModuleAttribute.get("numberOfEntityAttributes"); + int countOfAttributes = GrouperUtil.intValue(grouperConfigurationModuleAttribute.getValueOrExpressionEvaluation(), 0); + + List result = new ArrayList(); + + for (int i=0; i configSuffixToConfigModuleAttribute; + + + @Override + public void setConfigSuffixToConfigModuleAttribute( + Map configSuffixToConfigModuleAttribute) { + + this.configSuffixToConfigModuleAttribute = configSuffixToConfigModuleAttribute; + + } + + + + @Override + public List retrieveKeysAndLabels() { + + GrouperConfigurationModuleAttribute grouperConfigurationModuleAttribute = configSuffixToConfigModuleAttribute.get("numberOfMembershipAttributes"); + int countOfAttributes = GrouperUtil.intValue(grouperConfigurationModuleAttribute.getValueOrExpressionEvaluation(), 0); + + List result = new ArrayList(); + + for (int i=0; i Date: Sun, 3 Apr 2022 19:22:51 -0400 Subject: [PATCH 007/125] progress on provisioning refactor --- grouper/conf/grouper-loader.base.properties | 233 +++++++++--------- .../grouper.textNg.en.us.base.properties | 54 +++- 2 files changed, 153 insertions(+), 134 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 70dc8be9e296..e354871065b9 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2449,27 +2449,16 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", order: 5710, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.name = - # Translate type -# {valueType: "string", order: 5720, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "groupSyncField", "grouperProvisioningEntityField", "memberSyncField", "staticValues", "translationScript"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 5720, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateExpressionType = - -# During the translation, use this sync field. If not using a built-in (e.g. subjectId), you can map an entity field to a gcGrouperSyncMember field -# {valueType: "string", required: true, order: 5724, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'memberSyncField'}", formElement: "dropdown", optionValues: ["memberId", "subjectId", "subjectIdentifier", "memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromMemberSyncField = - -# During the translation, use this sync field. If not using a built-in (e.g. subjectId), you can map an entity field to a gcGrouperSyncMember field -# {valueType: "string", required: true, order: 5728, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'groupSyncField'}", formElement: "dropdown", optionValues: ["groupId", "groupIdIndex", "groupExtension", "groupName", "groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGroupSyncField = - - # Translate from field -# {valueType: "string", order: 5734, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 5734, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupFromId2", "groupFromId3", "groupToId2", "groupToId3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningGroupField = # Translate from field -# {valueType: "string", order: 5738, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 5738, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "memberId", "memberFromId2", "memberFromId3", "memberToId2", "memberToId3", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningEntityField = # Translate from static values @@ -2483,82 +2472,74 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # Advanced options # {valueType: "boolean", order: 5770, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAdvancedMembershipAttribute = +# provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAdvancedAttribute = # Show membership attribute crud -# {valueType: "boolean", order: 5820, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5820, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAttributeCrud = # Select attribute? -# {valueType: "boolean", order: 5880, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (selectMemberships == null || selectMemberships) && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5880, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (selectMemberships == null || selectMemberships) && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.select = # Insert attribute? -# {valueType: "boolean", order: 5900, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (insertMemberships == null || insertMemberships) && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5900, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (insertMemberships == null || insertMemberships) && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.insert = # Show membership attribute validation -# {valueType: "boolean", order: 5925, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5925, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAttributeValueSettings = # Value type -# {valueType: "string", order: 5950, defaultValue: "string", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetMembershipAttribute", repeatCount: 20 } +# {valueType: "string", order: 5950, defaultValue: "string", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetMembershipAttribute", repeatCount: 20 } # provisioner.genericProvisioner.targetMembershipAttribute.$i$.valueType = # Ignore this group if this attribute matches any of these values (comma separated) -# {valueType: "string", order: 6050, multiple: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6050, multiple: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.ignoreIfMatchesValue = # Default value if there is not a value -# {valueType: "string", order: 6075, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6075, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.defaultValue = # Show membership attribute validation -# {valueType: "boolean", order: 6080, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 6080, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAttributeValidation = # If a value is required to provision this group -# {valueType: "boolean", order: 6100, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 6100, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.required = # Maximum length of this attribute to be valid for provisioning -# {valueType: "integer", order: 6125, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "integer", order: 6125, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.maxlength = # Validate value with jexl to see if valid for provisioning, the variable 'value' represents the current value. return true if valid and false if invalid -# {valueType: "string", order: 6150, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6150, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.validExpression = # Translate expression create only type -# {valueType: "string", order: 6175, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "groupSyncField", "grouperProvisioningEntityField", "memberSyncField", "staticValues", "translationScript"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6175, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly = -# During the translation, use this sync field. If not using a built-in (e.g. subjectId), you can map an entity field to a gcGrouperSyncMember field -# {valueType: "string", required: true, order: 6180, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'memberSyncField' && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", formElement: "dropdown", optionValues: ["memberId", "subjectId", "subjectIdentifier", "memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromMemberSyncFieldCreateOnly = - -# During the translation, use this sync field. If not using a built-in (e.g. subjectId), you can map an entity field to a gcGrouperSyncMember field -# {valueType: "string", required: true, order: 6185, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'groupSyncField' && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", formElement: "dropdown", optionValues: ["groupId", "groupIdIndex", "groupExtension", "groupName", "groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGroupSyncFieldCreateOnly = - # Translate from field create only -# {valueType: "string", order: 6200, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField' && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6200, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupFromId2", "groupFromId3", "groupToId2", "groupToId3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningGroupFieldCreateOnly = # Translate from field create only -# {valueType: "string", order: 6250, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField' && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6250, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "memberFromId2", "memberFromId3", "memberToId2", "memberToId3", "memberId", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningEntityFieldCreateOnly = # Translate from static values create only -# {valueType: "string", order: 6275, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues' && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6275, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues' && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromStaticValuesCreateOnly = # Translate expression create only -# {valueType: "string", order: 6300, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript' && targetMembershipAttribute.$i$.showAdvancedMembershipAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6300, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript' && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateExpressionCreateOnly = # Operate on grouper groups @@ -2609,115 +2590,110 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", order: 21000, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.name = -# Membership attribute? -# {valueType: "boolean", order: 22200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && provisioningType == 'groupAttributes' && targetGroupAttribute.$i$.multiValued}", repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.membershipAttribute = +# Translate type +# {valueType: "string", order: 21200, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "staticValues", "translationScript"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpressionType = + +# Translate from field +# {valueType: "string", order: 21400, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.translateExpressionType == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromGrouperProvisioningGroupField = + +# Translate from static values +# {valueType: "string", order: 21600, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.translateExpressionType == 'staticValues'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromStaticValues = -# During the translation, use this sync field. If not using a built-in (e.g. subjectId), you can map an entity field to a gcGrouperSyncMember field -# {valueType: "string", required: true, order: 22300, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.membershipAttribute && provisioningType == 'groupAttributes' && targetGroupAttribute.$i$.multiValued}", formElement: "dropdown", optionValues: ["memberId", "subjectId", "subjectIdentifier", "memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromMemberSyncField = +# Translate expression +# {valueType: "string", order: 21800, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.translateExpressionType == 'translationScript'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpression = + +# Advanced options +# {valueType: "boolean", order: 22200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetGroupAttribute.$i$.showAdvancedAttribute = # Show group attribute crud -# {valueType: "boolean", order: 22400, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 22400, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAttributeCrud = # Select attribute? -# {valueType: "boolean", order: 22500, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && (selectGroups == null || selectGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 22500, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (selectGroups == null || selectGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.select = # Insert attribute? -# {valueType: "boolean", order: 23000, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && (insertGroups == null || insertGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 23000, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (insertGroups == null || insertGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.insert = # Update attribute? -# {valueType: "boolean", order: 24000, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && (updateGroups == null || updateGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 24000, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (updateGroups == null || updateGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.update = -# Matching id attribute? -# {valueType: "boolean", order: 24010, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$}", repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.matchingId = - # Show membership attribute validation -# {valueType: "boolean", order: 25000, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 25000, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAttributeValueSettings = # Value type -# {valueType: "string", order: 25100, defaultValue: "string", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetGroupAttribute", repeatCount: 20 } +# {valueType: "string", order: 25100, defaultValue: "string", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetGroupAttribute", repeatCount: 20 } # provisioner.genericProvisioner.targetGroupAttribute.$i$.valueType = # Multi-valued attribute? -# {valueType: "boolean", order: 25200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 25200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.multiValued = # Default value if there is not a value -# {valueType: "string", order: 25500, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 25500, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.defaultValue = # Ignore this group if this attribute matches any of these values (comma separated) -# {valueType: "string", order: 26000, multiple: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 26000, multiple: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.ignoreIfMatchesValue = # Show group attribute validation -# {valueType: "boolean", order: 29200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 29200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAttributeValidation = # If a value is required to provision this group -# {valueType: "boolean", order: 29250, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 29250, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.required = # Maximum length of this field to be valid for provisioning -# {valueType: "integer", order: 29500, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "integer", order: 29500, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.maxlength = # Validate value with jexl to see if valid for provisioning, the variable 'value' represents the current value. return true if valid and false if invalid -# {valueType: "string", order: 29750, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 29750, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.validExpression = -# Search attribute? -# {valueType: "boolean", order: 31000, defaultValue: "false", showEl: "${operateOnGrouperGroups && selectGroups && numberOfGroupAttributes > $i$ && !targetGroupAttribute.$i$.multiValued && targetGroupAttribute.$i$.select}", repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.searchAttribute = - # Translate expression create only type -# {valueType: "string", order: 31300, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.membershipAttribute == false && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "staticValues", "translationScript"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 31300, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "staticValues", "translationScript"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpressionTypeCreateOnly = # Translate from field create only -# {valueType: "string", order: 31600, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && !targetGroupAttribute.$i$.membershipAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 31600, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromGrouperProvisioningGroupFieldCreateOnly = # Translate from static values create only -# {valueType: "string", order: 31800, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && !targetGroupAttribute.$i$.membershipAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 31800, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromStaticValuesCreateOnly = # Translate expression create only -# {valueType: "string", order: 32000, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.membershipAttribute == false && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 32000, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpressionCreateOnly = -# Translate type -# {valueType: "string", order: 32300, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.membershipAttribute == false}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "staticValues", "translationScript"], repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpressionType = - -# Translate from field -# {valueType: "string", order: 32600, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && !targetGroupAttribute.$i$.membershipAttribute && targetGroupAttribute.$i$.translateExpressionType == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromGrouperProvisioningGroupField = - -# Translate from static values -# {valueType: "string", order: 32800, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && !targetGroupAttribute.$i$.membershipAttribute && targetGroupAttribute.$i$.translateExpressionType == 'staticValues'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromStaticValues = +# Search attribute? +# {valueType: "boolean", order: 36000, defaultValue: "false", showEl: "${operateOnGrouperGroups && selectGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && !targetGroupAttribute.$i$.multiValued && targetGroupAttribute.$i$.select}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetGroupAttribute.$i$.searchAttribute = -# Translate expression -# {valueType: "string", order: 33000, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.membershipAttribute == false && targetGroupAttribute.$i$.translateExpressionType == 'translationScript'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpression = +# Matching id attribute? +# {valueType: "boolean", order: 36100, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetGroupAttribute.$i$.matchingId = # During 'group link' copy this value from the target into the sync field -# {valueType: "string", order: 35500, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && !targetGroupAttribute.$i$.membershipAttribute && hasTargetGroupLink}", formElement: "dropdown", optionValues: ["groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 36200, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && hasTargetGroupLink}", formElement: "dropdown", optionValues: ["groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateToGroupSyncField = # After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 35700, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && !targetGroupAttribute.$i$.membershipAttribute}", formElement: "dropdown", optionValues: ["groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 36300, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateGrouperToGroupSyncField = - # Operate on grouper entities # {valueType: "boolean", order: 37000, defaultValue: "false", subSection: "entity"} # provisioner.genericProvisioner.operateOnGrouperEntities = @@ -2786,14 +2762,6 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "boolean", order: 62200, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.multiValued = -# Membership attribute? -# {valueType: "boolean", order: 62400, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && provisioningType == 'entityAttributes' && targetEntityAttribute.$i$.multiValued}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.membershipAttribute = - -# During the translation, use this sync field -# {valueType: "string", order: 62600, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && provisioningType == 'entityAttributes' && targetEntityAttribute.$i$.membershipAttribute}", formElement: "dropdown", optionValues: ["groupId", "groupIdIndex", "groupExtension", "groupName", "groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromGroupSyncField = - # Show entity attribute crud # {valueType: "boolean", order: 62800, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeCrud = @@ -2843,72 +2811,91 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetEntityAttribute.$i$.searchAttribute = # Translate expression create only type -# {valueType: "string", order: 70650, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.membershipAttribute == false && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 70650, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionTypeCreateOnly = # Translate from field create only -# {valueType: "string", order: 70750, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && !targetEntityAttribute.$i$.membershipAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 70750, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromGrouperProvisioningEntityFieldCreateOnly = # Translate from static values create only -# {valueType: "string", order: 70850, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && !targetEntityAttribute.$i$.membershipAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 70850, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromStaticValuesCreateOnly = # Translate expression create only -# {valueType: "string", order: 72000, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.membershipAttribute == false && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 72000, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionCreateOnly = # Translate type -# {valueType: "string", order: 72300, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.membershipAttribute == false}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 72300, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionType = # Translate from field -# {valueType: "string", order: 72600, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && !targetEntityAttribute.$i$.membershipAttribute && targetEntityAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 72600, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromGrouperProvisioningEntityField = # Translate from static values -# {valueType: "string", order: 72800, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && !targetEntityAttribute.$i$.membershipAttribute && targetEntityAttribute.$i$.translateExpressionType == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 72800, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromStaticValues = # Translate expression -# {valueType: "string", order: 73000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.membershipAttribute == false && targetEntityAttribute.$i$.translateExpressionType == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 73000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpression = # During the entity link, copy this attribute to the sync field -# {valueType: "string", order: 76000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.membershipAttribute == false && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateToMemberSyncField = # After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 76200, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && !targetEntityAttribute.$i$.membershipAttribute}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76200, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateGrouperToMemberSyncField = # subject sources to provision -# {valueType: "string", required: true, order: 76400, multiple: true, formElement: "checkbox", checkboxValuesFromClass: "edu.internet2.middleware.grouper.SubjectFinder", subSection: "general2", showEl: "${operateOnGrouperEntities || operateOnGrouperMemberships}"} +# {valueType: "string", required: true, order: 77000, multiple: true, formElement: "checkbox", checkboxValuesFromClass: "edu.internet2.middleware.grouper.SubjectFinder", subSection: "general2", showEl: "${operateOnGrouperEntities || operateOnGrouperMemberships}"} # provisioner.genericProvisioner.subjectSourcesToProvision = +# membership attribute name for groups +# {valueType: "string", required: true, order: 79200, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# provisioner.genericProvisioner.groupMembershipAttributeName = + +# membership attribute value for groups +# {valueType: "string", required: true, order: 79210, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# provisioner.genericProvisioner.groupMembershipAttributeValue = + +# group section 2 advanced options +# {valueType: "boolean", defaultValue: "false", order: 79800, subSection: "group2", showEl: "${operateOnGrouperGroups}"} +# provisioner.genericProvisioner.group2advanced = + +# membership attribute name for entities +# {valueType: "string", required: true, order: 80200, subSection: "entity2", showEl: "${operateOnGrouperEntities && provisioningType == 'entityAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# provisioner.genericProvisioner.entityMembershipAttributeName = + +# membership attribute value for entities +# {valueType: "string", required: true, order: 80210, subSection: "entity2", showEl: "${operateOnGrouperEntities && provisioningType == 'entityAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# provisioner.genericProvisioner.entityMembershipAttributeValue = # Show provisioning diagnostics -# {valueType: "boolean", order: 77000, defaultValue: "false", subSection: "provisioningDiagnostics"} +# {valueType: "boolean", order: 82000, defaultValue: "false", subSection: "provisioningDiagnostics"} # provisioner.genericProvisioner.showProvisioningDiagnostics = # Select all groups during diagnostics -# {valueType: "boolean", order: 78000, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} +# {valueType: "boolean", order: 82100, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} # provisioner.genericProvisioner.selectAllGroupsDuringDiagnostics = # Select all entities during diagnostics -# {valueType: "boolean", order: 79000, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} +# {valueType: "boolean", order: 82200, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} # provisioner.genericProvisioner.selectAllEntitiesDuringDiagnostics = # Select all memberships during diagnostics -# {valueType: "boolean", order: 80000, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} +# {valueType: "boolean", order: 82300, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} # provisioner.genericProvisioner.selectAllMembershipsDuringDiagnostics = # Test group name -# {valueType: "string", order: 81000, subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} +# {valueType: "string", order: 82400, subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} # provisioner.genericProvisioner.testGroupName = # create group during diagnostics -# {valueType: "boolean", order: 82000, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} +# {valueType: "boolean", order: 82500, defaultValue: "false", subSection: "provisioningDiagnostics", showEl: "${showProvisioningDiagnostics}"} # provisioner.genericProvisioner.createGroupDuringDiagnostics = # delete group during diagnostics @@ -3313,7 +3300,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisioner.someSqlProvisioner.userTableName = # users table primary key column of user table -# {valueType: "string", order: 49020, subSection: "entity", showEl: "${operateOnGrouperEntities}"} +# {valueType: "string", order: 49020, subSection: "entity", showEl: "${operateOnGrouperEntities}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.someSqlProvisioner.userPrimaryKey = # if this is more complicated than just a simple select, put the query here optional, select * from users where ... @@ -3347,13 +3334,9 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisioner.someSqlProvisioner.groupTableName = # groups table primary key column of group table -# {valueType: "string", subSection: "group", order: 15020, showEl: "${operateOnGrouperGroups }"} +# {valueType: "string", subSection: "group2", order: 79400, showEl: "${operateOnGrouperGroups }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.someSqlProvisioner.groupTableIdColumn = -# if this is more complicated than just a simple select, put the query here optional, select * from groups where ... -# {valueType: "string", subSection: "group", order: 15040, showEl: "${operateOnGrouperGroups }"} -# provisioner.someSqlProvisioner.groupSearchQuery = - # Use separate table for group attributes # {valueType: "boolean", order: 15041, defaultValue: "false", subSection: "group", showEl: "${operateOnGrouperGroups}"} # provisioner.someSqlProvisioner.useSeparateTableForGroupAttributes = @@ -3363,23 +3346,27 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisioner.someSqlProvisioner.groupAttributesTableName = # column from group table which is the foreign key in the group attribute table. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 15043, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group2", order: 79441, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesGroupForeignKeyColumn = # name of the column in group attribute table that will store attribute names. Include schema name if necessary. -# {valueType: "string", subSection: "group", defaultValue: "attribute_name", order: 15044, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group2", defaultValue: "attribute_name", order: 79442, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeNameColumn = # name of the column in group attribute table that will store attribute values. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 15045, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group2", order: 79443, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeValueColumn = +# if this is more complicated than just a simple select, put the query here optional, select * from groups where ... +# {valueType: "string", subSection: "group2", order: 79912, showEl: "${operateOnGrouperGroups && group2advanced }"} +# provisioner.someSqlProvisioner.groupSearchQuery = + # name of the column in group attribute table that will store last modified timestamp. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 15046, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group2", order: 79913, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}"} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumn = # type of the last modified column. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 15047, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}", formElement: "dropdown", optionValues: ["long", "timestamp"]} +# {valueType: "string", subSection: "group2", order: 79914, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumnType = # Storage type diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 413a75c0c67c..213f727eaf7b 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13256,7 +13256,19 @@ config.GenericConfiguration.subSection.advanced.title = Advanced config.GenericConfiguration.subSection.advanced.description = Advanced config.GenericConfiguration.subSection.general2.title = General configuration section 2 -config.GenericConfiguration.subSection.general2.description = Provisioning configuration after memberships / groups / entities +config.GenericConfiguration.subSection.general2.description = Provisioning configuration after attributes configured for memberships / groups / entities + +config.GenericConfiguration.subSection.group2.title = Group configuration section 2 +config.GenericConfiguration.subSection.group2.description = Group configuration after attributes configured for memberships / groups / entities + +config.GenericConfiguration.attribute.group2advanced.label = Advanced options +config.GenericConfiguration.attribute.group2advanced.description = Advanced options for group section 2 + +config.GenericConfiguration.subSection.membership2.title = Membership configuration section 2 +config.GenericConfiguration.subSection.membership2.description = Membership configuration after attributes configured for memberships / groups / entities + +config.GenericConfiguration.subSection.entity2.title = Entity configuration section 2 +config.GenericConfiguration.subSection.entity2.description = Entity configuration after attributes configured for memberships / groups / entities config.GenericConfiguration.subSection.targetGroupAttribute.i.title = Target __i+1__ config.GenericConfiguration.subSection.targetGroupAttribute.i.description = Configuration for the group field / attribute @@ -13712,8 +13724,14 @@ config.GenericConfiguration.attribute.option.targetGroupAttribute.i.attributePre config.GenericConfiguration.attribute.targetMembershipAttribute.i.name.label = __i+1__ - name config.GenericConfiguration.attribute.targetMembershipAttribute.i.name.description = Attribute name is the key in the key/value pairs for this group -config.GenericConfiguration.attribute.targetMembershipAttribute.i.showAdvancedMembershipAttribute.label = __i+1__ - advanced options -config.GenericConfiguration.attribute.targetMembershipAttribute.i.showAdvancedMembershipAttribute.description = Show less common options like value type, CRUD control, validation, etc +config.GenericConfiguration.attribute.targetMembershipAttribute.i.showAdvancedAttribute.label = __i+1__ - advanced options +config.GenericConfiguration.attribute.targetMembershipAttribute.i.showAdvancedAttribute.description = Show less common options like value type, CRUD control, validation, etc + +config.GenericConfiguration.attribute.targetGroupAttribute.i.showAdvancedAttribute.label = __i+1__ - advanced options +config.GenericConfiguration.attribute.targetGroupAttribute.i.showAdvancedAttribute.description = Show less common options like value type, CRUD control, validation, etc + +config.GenericConfiguration.attribute.targetEntityAttribute.i.showAdvancedAttribute.label = __i+1__ - advanced options +config.GenericConfiguration.attribute.targetEntityAttribute.i.showAdvancedAttribute.description = Show less common options like value type, CRUD control, validation, etc config.GenericConfiguration.attribute.targetMembershipAttribute.i.showAttributeCrud.label = __i+1__ - customize CRUD config.GenericConfiguration.attribute.targetMembershipAttribute.i.showAttributeCrud.description = By default this attribute will follow the same Create/Read/Update/Delete settings as the enclosing object. If the provisioner cannot perform the configured action it will not (e.g. a UUID for a web service which is readonly). Customize the configuration here. @@ -13761,8 +13779,6 @@ config.GenericConfiguration.attribute.targetMembershipAttribute.i.multiValued.la config.GenericConfiguration.attribute.targetMembershipAttribute.i.multiValued.description = If this attribute is multi-valued in the target. Generally attributes are single-valued. The membership attribute must be multi-valued if provisioning groupAttributes. config.GenericConfiguration.attribute.targetMembershipAttribute.i.searchAttribute.label = __i+1__ - search attribute config.GenericConfiguration.attribute.targetMembershipAttribute.i.searchAttribute.description = If this attribute is used to find groups in the target. The search in the target for this group might just need this attribute name and value or there might be a search filter, and this is the value of the bind variable. -config.GenericConfiguration.attribute.targetMembershipAttribute.i.membershipAttribute.label = __i+1__ - membership attribute -config.GenericConfiguration.attribute.targetMembershipAttribute.i.membershipAttribute.description = If this is groupAttribute provisioning and this attribute is multi-valued and holds entries that represents entities/memberships config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateExpressionCreateOnly.label = __i+1__ - translation expression insert only config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateExpressionCreateOnly.description = If you have a different translation from Grouper to Target for updates as opposed to inserts, put the insert translation here. Available variables:
  • $$provisioning.helper.variable.grouperProvisioningGroup$$
  • $$provisioning.helper.variable.gcGrouperSyncGroup$$
  • $$provisioning.helper.variable.provisioningGroupWrapper$$
  • $$provisioning.helper.variable.grouperTargetGroup$$
  • provisioning.helper.variable.grouperProvisioningEntity
  • provisioning.helper.variable.gcGrouperSyncMember
  • provisioning.helper.variable.provisioningEntityWrapper
  • provisioning.helper.variable.grouperTargetEntity
@@ -13809,7 +13825,7 @@ config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromG -provisioning.helper.variable.grouperProvisioningGroup = grouperProvisioningGroup (ProvisioningGroup.java): this is the Grouper representation of the group. Fields include: id, idIndex, name, displayName. Attributes include: description +provisioning.helper.variable.grouperProvisioningGroup = grouperProvisioningGroup (ProvisioningGroup.java): this is the Grouper representation of the group. Fields include: id, idIndex, name, displayName. Attributes include: description. Here is an example of a regex replace all non alphanumeric ids: ${grouperProvisioningGroup.name.replaceAll('[^a-zA-Z0-9]', '_')} provisioning.helper.variable.gcGrouperSyncGroup = gcGrouperSyncGroup (GcGrouperSyncGroup.java): this is the "sync" group object. Fields include: groupFromId2, groupFromId3, groupToId2, groupToId3 provisioning.helper.variable.provisioningGroupWrapper = provisioningGroupWrapper (ProvisioningGroupWrapper.java): holds references to all group data. Fields include: create, delete, recalc, gcGrouperSyncGroup, grouperProvisioningGroup, grouperTargetGroup, targetProvisioningGroup, targetNativeGroup provisioning.helper.variable.grouperTargetGroup = grouperTargetGroup (ProvisioningGroup.java): generally this is not needed since it is being built by the translation process. Fields and attributes depend on the provisioner. @@ -13830,8 +13846,6 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.multiValued.label = config.GenericConfiguration.attribute.targetGroupAttribute.i.multiValued.description = If this attribute is multi-valued in the target. Generally attributes are single-valued. The membership attribute must be multi-valued if provisioning groupAttributes. config.GenericConfiguration.attribute.targetGroupAttribute.i.searchAttribute.label = __i+1__ - search attribute config.GenericConfiguration.attribute.targetGroupAttribute.i.searchAttribute.description = If this attribute is used to find groups in the target. The search in the target for this group might just need this attribute name and value or there might be a search filter, and this is the value of the bind variable. -config.GenericConfiguration.attribute.targetGroupAttribute.i.membershipAttribute.label = __i+1__ - membership attribute -config.GenericConfiguration.attribute.targetGroupAttribute.i.membershipAttribute.description = If this is groupAttribute provisioning and this attribute is multi-valued and holds entries that represents entities/memberships config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionCreateOnly.label = __i+1__ - translation expression insert only config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionCreateOnly.description = If you have a different translation from Grouper to Target for updates as opposed to inserts, put the insert translation here. Available variables:
  • $$provisioning.helper.variable.grouperProvisioningGroup$$
  • $$provisioning.helper.variable.gcGrouperSyncGroup$$
  • $$provisioning.helper.variable.provisioningGroupWrapper$$
  • $$provisioning.helper.variable.grouperTargetGroup$$
@@ -13887,6 +13901,18 @@ config.GenericConfiguration.attribute.selectAllEntities.description = If you hav config.GenericConfiguration.attribute.loadEntitiesToGrouperTable.label = Load entities into grouper table config.GenericConfiguration.attribute.loadEntitiesToGrouperTable.description = Load entities into grouper table for reporting and diagnostics. +config.GenericConfiguration.attribute.groupMembershipAttributeName.label = Group attribute name for memberships +config.GenericConfiguration.attribute.groupMembershipAttributeName.description = The group attribute that stores values that represent memberships for the group + +config.GenericConfiguration.attribute.groupMembershipAttributeValue.label = Entity attribute name for memberships +config.GenericConfiguration.attribute.groupMembershipAttributeValue.description = The entity attribute that has values that represent memberships for the group, will be stored in the group attribute name for memberships + +config.GenericConfiguration.attribute.entityMembershipAttributeName.label = Entity attribute name for memberships +config.GenericConfiguration.attribute.entityMembershipAttributeName.description = The entity attribute that stores values that represent memberships for the entity + +config.GenericConfiguration.attribute.entityMembershipAttributeValue.label = Group attribute name for memberships +config.GenericConfiguration.attribute.entityMembershipAttributeValue.description = The group attribute that has values that represent memberships for the entity, will be stored in the entity attribute name for memberships + config.GenericConfiguration.attribute.selectEntities.label = Select entities config.GenericConfiguration.attribute.selectEntities.description = If entities should be read from the target. Generally this will be 'true' except:
  1. Messages are sent to the target without knowing the state of the target
  2. Provisioning groupAttributes with no entity link
  3. Provisioning membership objects with no entity link
config.GenericConfiguration.attribute.insertEntities.label = Insert entities @@ -13937,8 +13963,6 @@ config.GenericConfiguration.attribute.targetEntityAttribute.i.matchingId.label = config.GenericConfiguration.attribute.targetEntityAttribute.i.matchingId.description = The "matching id" is the attribute that is used to match up target objects with Grouper objects. If the matching ID is something opaque like the subjectId then objects can be more reliably renamed. config.GenericConfiguration.attribute.targetEntityAttribute.i.multiValued.label = __i+1__ - multi-valued attribute config.GenericConfiguration.attribute.targetEntityAttribute.i.multiValued.description = If this attribute is multi-valued in the target. Generally attributes are single-valued. The membership attribute must be multi-valued if provisioning entityAttributes. -config.GenericConfiguration.attribute.targetEntityAttribute.i.membershipAttribute.label = __i+1__ - membership attribute -config.GenericConfiguration.attribute.targetEntityAttribute.i.membershipAttribute.description = If this is entityAttribute provisioning and this attribute is multi-valued and holds entries that represents groups/memberships config.GenericConfiguration.attribute.targetEntityAttribute.i.searchAttribute.label = __i+1__ - search attribute config.GenericConfiguration.attribute.targetEntityAttribute.i.searchAttribute.description = If this attribute is used to find entities in the target. The search in the target for this entity might just need this attribute name and value or there might be a search filter, and this is the value of the bind variable. config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionCreateOnly.label = __i+1__ - translation expression during inserts @@ -14101,18 +14125,26 @@ config.SqlProvisionerConfiguration.attribute.membershipGroupForeignKeyColumn.lab config.SqlProvisionerConfiguration.attribute.membershipEntityForeignKeyColumn.label = Membership entity foreign key config.SqlProvisionerConfiguration.attribute.groupTableName.label = Group table name -config.SqlProvisionerConfiguration.attribute.groupPrimaryKey.label = Group primary key +config.SqlProvisionerConfiguration.attribute.groupTableName.description = Table name of the group table, could have a schema qualifier config.SqlProvisionerConfiguration.attribute.groupSearchQuery.label = Group search query +config.SqlProvisionerConfiguration.attribute.groupSearchQuery.description = Group search query, generally Grouper will generate this automatically config.SqlProvisionerConfiguration.attribute.groupTableIdColumn.label = Group table ID column +config.SqlProvisionerConfiguration.attribute.groupTableIdColumn.description = Primary key column of the group table config.SqlProvisionerConfiguration.attribute.useSeparateTableForGroupAttributes.label = Separate table for group attributes config.SqlProvisionerConfiguration.attribute.groupAttributesTableName.label = Group attributes table name +config.SqlProvisionerConfiguration.attribute.groupAttributesTableName.description = Table to store group attributes with a column which is a foreign key to the group table, and an attribute name column, and an attribute value column config.SqlProvisionerConfiguration.attribute.groupAttributesGroupForeignKeyColumn.label = Group attributes group foreign key column +config.SqlProvisionerConfiguration.attribute.groupAttributesGroupForeignKeyColumn.description = Column name in the group attribute table which is a foreign key to the group table config.SqlProvisionerConfiguration.attribute.groupAttributesAttributeNameColumn.label = Group attributes attribute name column +config.SqlProvisionerConfiguration.attribute.groupAttributesAttributeNameColumn.description = Column name in the group attribute table which is the name of the attribute config.SqlProvisionerConfiguration.attribute.groupAttributesAttributeValueColumn.label = Group attributes attribute value column +config.SqlProvisionerConfiguration.attribute.groupAttributesAttributeValueColumn.description = Column name in the group attribute table which is the value of the attribute config.SqlProvisionerConfiguration.attribute.groupAttributesLastModifiedColumn.label = Group attributes attribute last modified column +config.SqlProvisionerConfiguration.attribute.groupAttributesLastModifiedColumn.description = Column name in the gruop attribute table which is the last modified column config.SqlProvisionerConfiguration.attribute.groupAttributesLastModifiedColumnType.label = Group attributes last modified column type +config.SqlProvisionerConfiguration.attribute.groupAttributesLastModifiedColumnType.description = Type of the last modified column config.SqlProvisionerConfiguration.attribute.useSeparateTableForEntityAttributes.label = Separate table for entity attributes config.SqlProvisionerConfiguration.attribute.entityAttributesTableName.label = Entity attributes table name From e65d77e707e2a7f57001ebebb559ae6e50b85cb1 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Thu, 7 Apr 2022 11:31:09 -0700 Subject: [PATCH 008/125] IAMSE-1531 Refactored packages. Update to pom and added additional pom file following plugin packaging instructions. --- .../grouper-authentication/plugin-pom.xml | 136 ++++++++++++++++++ grouper-misc/grouper-authentication/pom.xml | 19 ++- .../{ => plugin}/ConfigUtils.java | 4 +- .../{ => plugin}/Pac4jConfigFactory.java | 8 +- .../config/CasClientProvider.java | 6 +- .../{ => plugin}/config/ClientProvider.java | 4 +- .../{ => plugin}/config/ClientProviders.java | 4 +- .../config/OidcClientProvider.java | 11 +- .../config/SAML2ClientProvider.java | 6 +- .../filter/CallbackFilterDecorator.java | 4 +- .../plugin}/filter/FilterDecoratorUtils.java | 6 +- .../plugin/filter/Reinitializable.java | 5 + .../plugin}/filter/ReinitializingTimer.java | 4 +- .../filter/SecurityFilterDecorator.java | 6 +- .../client/ClaimAsUsernameOidcClient.java | 8 +- .../ClaimAsUsernameOidcConfiguration.java | 4 +- .../oidc/profile/ClaimAsUsernameProfile.java | 4 +- .../ClaimAsUsernameProfileCreator.java | 6 +- .../ClaimAsUsernameProfileDefinition.java | 4 +- .../filter/Reinitializable.java | 5 - .../Pac4JConfigFactoryTest.java | 5 +- grouper/conf/grouper.base.properties | 4 +- 22 files changed, 204 insertions(+), 59 deletions(-) create mode 100644 grouper-misc/grouper-authentication/plugin-pom.xml rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/ConfigUtils.java (99%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/Pac4jConfigFactory.java (92%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/config/CasClientProvider.java (80%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/config/ClientProvider.java (64%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/config/ClientProviders.java (89%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/config/OidcClientProvider.java (82%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/config/SAML2ClientProvider.java (81%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/{plugins/authentication => authentication/plugin}/filter/CallbackFilterDecorator.java (93%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/{plugins/authentication => authentication/plugin}/filter/FilterDecoratorUtils.java (58%) create mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/Reinitializable.java rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/{plugins/authentication => authentication/plugin}/filter/ReinitializingTimer.java (89%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/{plugins/authentication => authentication/plugin}/filter/SecurityFilterDecorator.java (88%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/oidc/client/ClaimAsUsernameOidcClient.java (62%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/oidc/config/ClaimAsUsernameOidcConfiguration.java (82%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/oidc/profile/ClaimAsUsernameProfile.java (83%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/oidc/profile/ClaimAsUsernameProfileCreator.java (81%) rename grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/{ => plugin}/oidc/profile/ClaimAsUsernameProfileDefinition.java (81%) delete mode 100644 grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java diff --git a/grouper-misc/grouper-authentication/plugin-pom.xml b/grouper-misc/grouper-authentication/plugin-pom.xml new file mode 100644 index 000000000000..ebcd549a089b --- /dev/null +++ b/grouper-misc/grouper-authentication/plugin-pom.xml @@ -0,0 +1,136 @@ + + + + + + 4.0.0 + + + edu.internet2.middleware.grouper + grouper-parent + 2.6.0-SNAPSHOT + ../../grouper-parent + + + Grouper Authentication + Authentication Library + grouper-authentication + 0.0.1-SNAPSHOT + bundle + + + 4.3.1 + 5.0.0 + 2.6.0-SNAPSHOT + + + + + + ${project.groupId} + grouper-ui + ${grouper.version} + provided + + + org.pac4j + pac4j-core + ${pac4j.version} + + + org.pac4j + pac4j-cas + ${pac4j.version} + + + org.pac4j + jee-pac4j + ${jee-pac4j.version} + + + org.pac4j + pac4j-saml-opensamlv3 + ${pac4j.version} + + + org.pac4j + pac4j-oidc + ${pac4j.version} + + + org.apache.tomcat + tomcat-catalina + 8.5.60 + provided + + + commons-logging + commons-logging + provided + + + ${project.groupId} + grouper + ${grouper.version} + test-jar + test + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + true + + ${project.name} + ${project.organization.name} + ${project.artifactId} + ${project.version} + ${project.url} + ${maven.build.timestamp} + + + + + + org.apache.felix + maven-bundle-plugin + true + + + ${project.groupId}.${project.artifactId} + ${project.artifactId} + ${pom.version} + edu.internet2.middleware.grouper.authentication.plugin.filter + edu.internet2.middleware.grouper.authentication.plugin.* + *;scope=compile|runtime + true + + + + + + \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/pom.xml b/grouper-misc/grouper-authentication/pom.xml index 1c6cfd7cca41..c4af2cc6b1d4 100644 --- a/grouper-misc/grouper-authentication/pom.xml +++ b/grouper-misc/grouper-authentication/pom.xml @@ -16,6 +16,10 @@ limitations under the License. --> + @@ -31,11 +35,13 @@ Grouper Authentication Authentication Library grouper-authentication + 0.0.1-SNAPSHOT jar 4.3.1 5.0.0 + 2.6.0-SNAPSHOT @@ -43,7 +49,7 @@ ${project.groupId} grouper-ui - ${project.version} + ${grouper.version} provided @@ -85,7 +91,7 @@ ${project.groupId} grouper - ${project.version} + ${grouper.version} test-jar test @@ -105,12 +111,17 @@ ${project.artifactId} ${project.version} ${project.url} - edu.internet2.middleware.grouperBox.GrouperBoxSync ${maven.build.timestamp} + + + + \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/ConfigUtils.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/ConfigUtils.java similarity index 99% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/ConfigUtils.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/ConfigUtils.java index b91e434ad8fc..a6627e2c53ae 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/ConfigUtils.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/ConfigUtils.java @@ -1,4 +1,4 @@ -package edu.internet2.middleware.grouper.authentication; +package edu.internet2.middleware.grouper.authentication.plugin; import edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig; import edu.internet2.middleware.grouperClient.config.ConfigPropertiesCascadeBase; @@ -145,4 +145,4 @@ public static boolean isGrouperWs() { public static boolean isGrouperDaemon() { return GrouperHibernateConfig.retrieveConfig().propertyValueBoolean("grouper.is.daemon", false); } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/Pac4jConfigFactory.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/Pac4jConfigFactory.java similarity index 92% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/Pac4jConfigFactory.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/Pac4jConfigFactory.java index cb523c6382b5..4ca28c89d9c9 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/Pac4jConfigFactory.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/Pac4jConfigFactory.java @@ -1,7 +1,7 @@ -package edu.internet2.middleware.grouper.authentication; +package edu.internet2.middleware.grouper.authentication.plugin; -import edu.internet2.middleware.grouper.authentication.config.ClientProvider; -import edu.internet2.middleware.grouper.authentication.config.ClientProviders; +import edu.internet2.middleware.grouper.authentication.plugin.config.ClientProvider; +import edu.internet2.middleware.grouper.authentication.plugin.config.ClientProviders; import edu.internet2.middleware.grouperClient.config.ConfigPropertiesCascadeBase; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -61,4 +61,4 @@ private static Client getClient(String provider) throws IllegalAccessException, } return providerClass.newInstance().getClient(); } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/CasClientProvider.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/CasClientProvider.java similarity index 80% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/CasClientProvider.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/CasClientProvider.java index 1647a5997578..1a04a91615a3 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/CasClientProvider.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/CasClientProvider.java @@ -1,6 +1,6 @@ -package edu.internet2.middleware.grouper.authentication.config; +package edu.internet2.middleware.grouper.authentication.plugin.config; -import edu.internet2.middleware.grouper.authentication.ConfigUtils; +import edu.internet2.middleware.grouper.authentication.plugin.ConfigUtils; import org.pac4j.cas.client.CasClient; import org.pac4j.cas.config.CasConfiguration; import org.pac4j.core.client.Client; @@ -21,4 +21,4 @@ public Client getClient() { client.setName("client"); return client; } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/ClientProvider.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/ClientProvider.java similarity index 64% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/ClientProvider.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/ClientProvider.java index c4604d92dc50..d14f75668516 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/ClientProvider.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/ClientProvider.java @@ -1,8 +1,8 @@ -package edu.internet2.middleware.grouper.authentication.config; +package edu.internet2.middleware.grouper.authentication.plugin.config; import org.pac4j.core.client.Client; public interface ClientProvider { boolean supports(String type); Client getClient(); -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/ClientProviders.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/ClientProviders.java similarity index 89% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/ClientProviders.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/ClientProviders.java index cb55c5db5667..c107ba72d5be 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/ClientProviders.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/ClientProviders.java @@ -1,4 +1,4 @@ -package edu.internet2.middleware.grouper.authentication.config; +package edu.internet2.middleware.grouper.authentication.plugin.config; import java.util.Locale; @@ -20,4 +20,4 @@ public Class getProviderClass() { public static ClientProviders fromString(String name) { return ClientProviders.valueOf(name.toUpperCase(Locale.ENGLISH)); } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/OidcClientProvider.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/OidcClientProvider.java similarity index 82% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/OidcClientProvider.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/OidcClientProvider.java index 54bbd61eb6d8..4fe9b2d53bdd 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/OidcClientProvider.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/OidcClientProvider.java @@ -1,9 +1,8 @@ -package edu.internet2.middleware.grouper.authentication.config; +package edu.internet2.middleware.grouper.authentication.plugin.config; -import edu.internet2.middleware.grouper.authentication.ConfigUtils; -import edu.internet2.middleware.grouper.authentication.oidc.client.ClaimAsUsernameOidcClient; -import edu.internet2.middleware.grouper.authentication.oidc.config.ClaimAsUsernameOidcConfiguration; -import edu.internet2.middleware.grouperClient.config.ConfigPropertiesCascadeBase; +import edu.internet2.middleware.grouper.authentication.plugin.ConfigUtils; +import edu.internet2.middleware.grouper.authentication.plugin.oidc.client.ClaimAsUsernameOidcClient; +import edu.internet2.middleware.grouper.authentication.plugin.oidc.config.ClaimAsUsernameOidcConfiguration; import org.apache.log4j.Logger; import org.pac4j.core.client.Client; import org.pac4j.oidc.client.OidcClient; @@ -48,4 +47,4 @@ private static ClaimAsUsernameOidcClient getClaimAsUsernameOidcClient() { ClaimAsUsernameOidcClient client = new ClaimAsUsernameOidcClient(configuration); return client; } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/SAML2ClientProvider.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/SAML2ClientProvider.java similarity index 81% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/SAML2ClientProvider.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/SAML2ClientProvider.java index 35fcf2ea9927..c76c62dfa32c 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/config/SAML2ClientProvider.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/config/SAML2ClientProvider.java @@ -1,6 +1,6 @@ -package edu.internet2.middleware.grouper.authentication.config; +package edu.internet2.middleware.grouper.authentication.plugin.config; -import edu.internet2.middleware.grouper.authentication.ConfigUtils; +import edu.internet2.middleware.grouper.authentication.plugin.ConfigUtils; import org.pac4j.core.client.Client; import org.pac4j.saml.client.SAML2Client; import org.pac4j.saml.config.SAML2Configuration; @@ -21,4 +21,4 @@ public Client getClient() { client.setName("client"); return client; } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/CallbackFilterDecorator.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/CallbackFilterDecorator.java similarity index 93% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/CallbackFilterDecorator.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/CallbackFilterDecorator.java index faa1bba53e24..2e0abb1f7644 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/CallbackFilterDecorator.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/CallbackFilterDecorator.java @@ -1,6 +1,6 @@ -package edu.internet2.middleware.grouper.plugins.authentication.filter; +package edu.internet2.middleware.grouper.authentication.plugin.filter; -import edu.internet2.middleware.grouper.authentication.ConfigUtils; +import edu.internet2.middleware.grouper.authentication.plugin.ConfigUtils; import edu.internet2.middleware.grouper.cfg.GrouperHibernateConfig; import org.pac4j.jee.filter.CallbackFilter; diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/FilterDecoratorUtils.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/FilterDecoratorUtils.java similarity index 58% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/FilterDecoratorUtils.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/FilterDecoratorUtils.java index 2ff674137fad..55db5e3aa8ba 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/FilterDecoratorUtils.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/FilterDecoratorUtils.java @@ -1,8 +1,6 @@ -package edu.internet2.middleware.grouper.plugins.authentication.filter; +package edu.internet2.middleware.grouper.authentication.plugin.filter; -import edu.internet2.middleware.grouper.authentication.ConfigUtils; - -import java.util.Map; +import edu.internet2.middleware.grouper.authentication.plugin.ConfigUtils; public class FilterDecoratorUtils { protected static boolean isExternalAuthenticationEnabled() { diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/Reinitializable.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/Reinitializable.java new file mode 100644 index 000000000000..60e8d2c63e60 --- /dev/null +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/Reinitializable.java @@ -0,0 +1,5 @@ +package edu.internet2.middleware.grouper.authentication.plugin.filter; + +public interface Reinitializable { + void initDecorator(); +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/ReinitializingTimer.java similarity index 89% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/ReinitializingTimer.java index 1224f27c0164..80852d440f7a 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/ReinitializingTimer.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/ReinitializingTimer.java @@ -1,6 +1,6 @@ -package edu.internet2.middleware.grouper.plugins.authentication.filter; +package edu.internet2.middleware.grouper.authentication.plugin.filter; -import edu.internet2.middleware.grouper.authentication.ConfigUtils; +import edu.internet2.middleware.grouper.authentication.plugin.ConfigUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/SecurityFilterDecorator.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/SecurityFilterDecorator.java similarity index 88% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/SecurityFilterDecorator.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/SecurityFilterDecorator.java index a4b975701d8d..207039d903c3 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/SecurityFilterDecorator.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/filter/SecurityFilterDecorator.java @@ -1,7 +1,7 @@ -package edu.internet2.middleware.grouper.plugins.authentication.filter; +package edu.internet2.middleware.grouper.authentication.plugin.filter; -import edu.internet2.middleware.grouper.authentication.ConfigUtils; -import edu.internet2.middleware.grouper.authentication.Pac4jConfigFactory; +import edu.internet2.middleware.grouper.authentication.plugin.ConfigUtils; +import edu.internet2.middleware.grouper.authentication.plugin.Pac4jConfigFactory; import org.pac4j.core.authorization.authorizer.DefaultAuthorizers; import org.pac4j.core.config.ConfigBuilder; import org.pac4j.core.util.Pac4jConstants; diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/client/ClaimAsUsernameOidcClient.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/client/ClaimAsUsernameOidcClient.java similarity index 62% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/client/ClaimAsUsernameOidcClient.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/client/ClaimAsUsernameOidcClient.java index 22f17df79c66..7cb2c3ec1aa9 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/client/ClaimAsUsernameOidcClient.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/client/ClaimAsUsernameOidcClient.java @@ -1,7 +1,7 @@ -package edu.internet2.middleware.grouper.authentication.oidc.client; +package edu.internet2.middleware.grouper.authentication.plugin.oidc.client; -import edu.internet2.middleware.grouper.authentication.oidc.config.ClaimAsUsernameOidcConfiguration; -import edu.internet2.middleware.grouper.authentication.oidc.profile.ClaimAsUsernameProfileCreator; +import edu.internet2.middleware.grouper.authentication.plugin.oidc.config.ClaimAsUsernameOidcConfiguration; +import edu.internet2.middleware.grouper.authentication.plugin.oidc.profile.ClaimAsUsernameProfileCreator; import org.pac4j.oidc.client.OidcClient; public class ClaimAsUsernameOidcClient extends OidcClient { @@ -15,4 +15,4 @@ protected void clientInit() { super.clientInit(); } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/config/ClaimAsUsernameOidcConfiguration.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/config/ClaimAsUsernameOidcConfiguration.java similarity index 82% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/config/ClaimAsUsernameOidcConfiguration.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/config/ClaimAsUsernameOidcConfiguration.java index 8fab2cfafa2f..e20e2cf2a3c8 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/config/ClaimAsUsernameOidcConfiguration.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/config/ClaimAsUsernameOidcConfiguration.java @@ -1,4 +1,4 @@ -package edu.internet2.middleware.grouper.authentication.oidc.config; +package edu.internet2.middleware.grouper.authentication.plugin.oidc.config; import org.pac4j.oidc.config.OidcConfiguration; @@ -12,4 +12,4 @@ public String getClaimAsUsername() { public void setClaimAsUsername(String claimAsUsername) { this.claimAsUsername = claimAsUsername; } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfile.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfile.java similarity index 83% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfile.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfile.java index df4068b5b043..fa2dfa9872c6 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfile.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfile.java @@ -1,4 +1,4 @@ -package edu.internet2.middleware.grouper.authentication.oidc.profile; +package edu.internet2.middleware.grouper.authentication.plugin.oidc.profile; import org.pac4j.oidc.profile.OidcProfile; @@ -13,4 +13,4 @@ public ClaimAsUsernameProfile(final String claimAsUsername) { public String getUsername() { return this.getAttribute(this.claimAsUsername).toString(); } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfileCreator.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfileCreator.java similarity index 81% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfileCreator.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfileCreator.java index 708297fb4b09..163c983e96ae 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfileCreator.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfileCreator.java @@ -1,6 +1,6 @@ -package edu.internet2.middleware.grouper.authentication.oidc.profile; +package edu.internet2.middleware.grouper.authentication.plugin.oidc.profile; -import edu.internet2.middleware.grouper.authentication.oidc.config.ClaimAsUsernameOidcConfiguration; +import edu.internet2.middleware.grouper.authentication.plugin.oidc.config.ClaimAsUsernameOidcConfiguration; import org.pac4j.core.util.CommonHelper; import org.pac4j.oidc.client.OidcClient; import org.pac4j.oidc.config.OidcConfiguration; @@ -19,4 +19,4 @@ protected void internalInit() { super.internalInit(); } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfileDefinition.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfileDefinition.java similarity index 81% rename from grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfileDefinition.java rename to grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfileDefinition.java index 1e535f6297a2..8981c5a971bb 100644 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/oidc/profile/ClaimAsUsernameProfileDefinition.java +++ b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/authentication/plugin/oidc/profile/ClaimAsUsernameProfileDefinition.java @@ -1,4 +1,4 @@ -package edu.internet2.middleware.grouper.authentication.oidc.profile; +package edu.internet2.middleware.grouper.authentication.plugin.oidc.profile; import org.pac4j.oidc.profile.OidcProfileDefinition; @@ -7,4 +7,4 @@ public ClaimAsUsernameProfileDefinition(final String claimAsUsername) { super(); setProfileFactory(x -> new ClaimAsUsernameProfile(claimAsUsername)); } -} +} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java b/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java deleted file mode 100644 index 643356931c88..000000000000 --- a/grouper-misc/grouper-authentication/src/main/java/edu/internet2/middleware/grouper/plugins/authentication/filter/Reinitializable.java +++ /dev/null @@ -1,5 +0,0 @@ -package edu.internet2.middleware.grouper.plugins.authentication.filter; - -public interface Reinitializable { - void initDecorator(); -} \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/src/test/java/edu/internet2/middleware/grouper/authentication/Pac4JConfigFactoryTest.java b/grouper-misc/grouper-authentication/src/test/java/edu/internet2/middleware/grouper/authentication/Pac4JConfigFactoryTest.java index fc04641cd8ff..51c084e52803 100644 --- a/grouper-misc/grouper-authentication/src/test/java/edu/internet2/middleware/grouper/authentication/Pac4JConfigFactoryTest.java +++ b/grouper-misc/grouper-authentication/src/test/java/edu/internet2/middleware/grouper/authentication/Pac4JConfigFactoryTest.java @@ -1,5 +1,6 @@ package edu.internet2.middleware.grouper.authentication; +import edu.internet2.middleware.grouper.authentication.plugin.Pac4jConfigFactory; import edu.internet2.middleware.grouper.ui.util.GrouperUiConfig; import junit.framework.TestCase; import junit.textui.TestRunner; @@ -252,7 +253,7 @@ public void testPac4jForManualProvider() { GrouperUiConfig.retrieveConfig().properties().clear(); GrouperUiConfig.retrieveConfig().propertiesOverrideMap().clear(); Map overrides = GrouperUiConfig.retrieveConfig().propertiesOverrideMap(); - overrides.put("external.authentication.provider", "edu.internet2.middleware.grouper.authentication.config.SAML2ClientProvider"); + overrides.put("external.authentication.provider", "edu.internet2.middleware.grouper.authentication.plugin.config.SAML2ClientProvider"); Pac4jConfigFactory pac4jConfigFactory = new Pac4jConfigFactory(); Config config = pac4jConfigFactory.build(); @@ -261,4 +262,4 @@ public void testPac4jForManualProvider() { Assert.assertTrue(true); } -} +} \ No newline at end of file diff --git a/grouper/conf/grouper.base.properties b/grouper/conf/grouper.base.properties index a2065503cd00..0b87c40a33a9 100644 --- a/grouper/conf/grouper.base.properties +++ b/grouper/conf/grouper.base.properties @@ -4128,12 +4128,12 @@ grouper.felix.cache.rootdir = /opt/grouper/grouperWebapp/WEB-INF/grouperFelixCac # Callback filter implementation classname # ex: edu.internet2.middleware.grouper.plugins.testImplementation.SamplePluginProviderServiceImpl # ${valueType: "class", required: true} -# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.plugins.authentication.filter.CallbackFilterDecorator +# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.authentication.plugin.filter.CallbackFilterDecorator # Security filter implementation classname # ex: edu.internet2.middleware.grouper.plugins.testImplementation.SamplePluginProviderServiceImpl # ${valueType: "class", required: true} -# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.plugins.authentication.filter.SecurityFilterDecorator +# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.authentication.plugin.filter.SecurityFilterDecorator From cf748f5dfa06be0b06b0d96f28d354d9ed6824cb Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Sat, 9 Apr 2022 17:14:32 -0700 Subject: [PATCH 009/125] SQL provisioning start with --- .../UiV2ProvisionerConfiguration.java | 11 - grouper/conf/grouper-loader.base.properties | 220 +++++++++++++----- .../grouper.textNg.en.us.base.properties | 121 +++++++++- .../app/azure/AzureProvisioningStartWith.java | 2 + .../LdapProvisioningMembershipStartWith.java | 5 +- .../SqlProvisionerConfiguration.java | 3 +- .../SqlProvisioningEntityTableStartWith.java | 121 ---------- ...ith.java => SqlProvisioningStartWith.java} | 0 8 files changed, 292 insertions(+), 191 deletions(-) delete mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningEntityTableStartWith.java rename grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/{SqlProvisioningGroupTableStartWith.java => SqlProvisioningStartWith.java} (100%) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java index b7cbb21f08e5..4a4c3ec28290 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java @@ -851,17 +851,11 @@ public void addProvisionerConfiguration(final HttpServletRequest request, final configSuffixToValues.put(key, startWithValue); } - //Set newKeys = configSuffixToValues.keySet(); Set suffixesUserJustChanged = new HashSet<>(); Map oldSuffixToValue = provisionerStartWith.getCachedConfigKeyToValue(sessionId); if (oldSuffixToValue != null) { -// Set oldKeys = oldSuffixToValue.keySet(); -// newKeys.removeAll(oldKeys); - //now newKeys only have the keys that have been added since the last trip to the server - // compare old values with new values and build suffixesUserJustChanged - for (String key: startWithAttributes.keySet()) { String startWithNewValue = startWithAttributes.get(key).getValue(); String startWithOldValue = oldSuffixToValue.get(key); @@ -890,11 +884,6 @@ public void addProvisionerConfiguration(final HttpServletRequest request, final } - - - - - } // once the start with submit is done diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 70dc8be9e296..d1df6ecd5f66 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -4067,61 +4067,177 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisioner.myGoogleProvisioner.allowWebPosting = -####################################### -## provisioner startWiths - sql group table -####################################### - -# this is the sql external system config id -# {valueType: "string", order: 25, readOnly: true} -# provisionerStartWith.sqlGroupTable.startWith = sqlGroupTable +############################################### +## provisioner startWiths - sql common +############################################### # this is the sql external system config id # {order: 50, valueType: "string", required: true, order: 20, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.loader.db.DatabaseGrouperExternalSystem"} -# provisionerStartWith.sqlGroupTable.dbExternalSystemConfigId = - -# group table name -# {order: 100, valueType: "string", required: true} -# provisionerStartWith.sqlGroupTable.groupTableName = - -# group table id column -# {order: 150, valueType: "string", required: true} -# provisionerStartWith.sqlGroupTable.groupTableIdColumn = +# provisionerStartWith.sqlCommon.dbExternalSystemConfigId = -# column names -# {valueType: "string", order: 200, required: true} -# provisionerStartWith.sqlGroupTable.columnNames = - -# user primary key -# {order: 250, valueType: "string", required: true} -# provisionerStartWith.sqlGroupTable.userPrimaryKey = - -####################################### -## provisioner startWiths - sql entity table -####################################### - # this is the sql external system config id # {valueType: "string", order: 25, readOnly: true} -# provisionerStartWith.sqlEntityTable.startWith = sqlEntityTable - -# this is the sql external system config id -# {order: 50, valueType: "string", required: true, order: 20, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.loader.db.DatabaseGrouperExternalSystem"} -# provisionerStartWith.sqlEntityTable.dbExternalSystemConfigId = - +# provisionerStartWith.sqlCommon.startWith = sqlCommon + +# Sql pattern +# {valueType: "string", order: 50, required: true, formElement: "dropdown", showEl: "${dbExternalSystemConfigId != null}", optionValues: ["entityTable", "entityTableWithAttributeTable", "entityTableWithAttributeTableAndMemberships", "entityTableMembershipTable", "groupTable", "groupTableWithAttributeTable", "groupTableWithAttributeTableAndMemberships", "groupTableMembershipTable", "groupTableEntityTableMembershipTable", "membershipTable", "other"]} +# provisionerStartWith.sqlCommon.sqlPattern = + +# User attributes type +# {valueType: "string", order: 100, required: true, formElement: "dropdown", showEl: "${sqlPattern != null}", optionValues: ["core", "entityResolver", "subjectSource", "subjectSourceAndEntityResolver"]} +# provisionerStartWith.sqlCommon.userAttributesType = + +# Membership structure +# {valueType: "string", order: 200, defaultValue: "membershipObjects", formElement: "dropdown", showEl: "${userAttributesType != null}", optionValues: ["entityAttributes", "groupAttributes", "membershipObjects", "notApplicable"]} +# provisionerStartWith.sqlCommon.membershipStructure = + +# subject source entity resolver attributes +# {valueType: "string", order: 300, required: true, showEl: "${userAttributesType == 'subjectSource' || userAttributesType == 'subjectSourceAndEntityResolver'}"} +# provisionerStartWith.sqlCommon.subjectSourceEntityResolverAttributes = + +# has group table +# {valueType: "boolean", order: 400, defaultValue: "false", showEl: "${userAttributesType != null}"} +# provisionerStartWith.sqlCommon.hasGroupTable = + # group table name -# {order: 100, valueType: "string", required: true} -# provisionerStartWith.sqlEntityTable.entityTableName = - -# group table id column -# {order: 150, valueType: "string", required: true} -# provisionerStartWith.sqlEntityTable.entityTableIdColumn = +# {valueType: "string", order: 500, required: true, showEl: "${hasGroupTable}"} +# provisionerStartWith.sqlCommon.groupTableName = + +# group table primary column +# {valueType: "string", order: 600, required: true, showEl: "${hasGroupTable}"} +# provisionerStartWith.sqlCommon.groupTableIdColumn = + +# group table primary key value +# {valueType: "string", order: 650, required: true, formElement: "dropdown", showEl: "${hasGroupTable}", optionValues: ["groupExtension", "groupIdIndex", "groupName", "groupPrimaryKey", "groupUuid", "other", "script"]} +# provisionerStartWith.sqlCommon.groupTablePrimaryKeyValue = + +# group table column names +# {valueType: "string", order: 700, showEl: "${hasGroupTable}"} +# provisionerStartWith.sqlCommon.groupTableColumnNames = + +# need group link? +# {valueType: "boolean", order: 800, showEl: "${hasGroupTable}"} +# provisionerStartWith.sqlCommon.needGroupLink = -# column names -# {valueType: "string", order: 200, required: true} -# provisionerStartWith.sqlEntityTable.columnNames = +# has group attribute table? +# {valueType: "boolean", order: 900, defaultValue: "false", showEl: "${hasGroupTable}"} +# provisionerStartWith.sqlCommon.hasGroupAttributeTable = -# user primary key -# {order: 250, valueType: "string", required: true} -# provisionerStartWith.sqlEntityTable.userPrimaryKey = +# group attribute table name +# {valueType: "string", order: 1000, required: true, showEl: "${hasGroupAttributeTable}"} +# provisionerStartWith.sqlCommon.groupAttributeTableName = + +# column name which is foreign key to group table +# {valueType: "string", order: 1100, required: true, showEl: "${hasGroupAttributeTable}"} +# provisionerStartWith.sqlCommon.columnNameForeignKeyToGroupTable = + +# column name which is the attribute name +# {valueType: "string", order: 1200, required: true, showEl: "${hasGroupAttributeTable}"} +# provisionerStartWith.sqlCommon.groupAttributeNameColumnName = + +# column name which is the attribute value +# {valueType: "string", order: 1300, required: true, showEl: "${hasGroupAttributeTable}"} +# provisionerStartWith.sqlCommon.groupAttributeValueColumnName = + +# membership attribute name +# {valueType: "string", order: 1400, required: true, showEl: "${hasGroupAttributeTable && membershipStructure == 'groupAttributes'}"} +# provisionerStartWith.sqlCommon.groupMembershipAttributeName = + +# membership attribute value +# {valueType: "string", order: 1500, required: true, formElement: "dropdown", showEl: "${hasGroupAttributeTable && membershipStructure == 'groupAttributes'}", optionValues: ["entityPrimaryKey", "other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} +# provisionerStartWith.sqlCommon.groupMembershipAttributeValue = + +# other attribute names in attribute table +# {valueType: "string", order: 1600, showEl: "${hasGroupAttributeTable}"} +# provisionerStartWith.sqlCommon.groupOtherAttributeNames = + +# has entity table +# {valueType: "boolean", order: 1700, defaultValue: "false", showEl: "${userAttributesType != null}"} +# provisionerStartWith.sqlCommon.hasEntityTable = + +# entity table name +# {valueType: "string", order: 1800, required: true, showEl: "${hasEntityTable}"} +# provisionerStartWith.sqlCommon.entityTableName = + +# entity table primary column +# {valueType: "string", order: 1900, required: true, showEl: "${hasEntityTable}"} +# provisionerStartWith.sqlCommon.entityTableIdColumn = + +# entity table primary key value +# {valueType: "string", order: 2000, required: true, formElement: "dropdown", showEl: "${hasEntityTable}", optionValues: ["email", "entity_uuid", "entity_description", "entity_name", "other", "script", "subject_id", "subject_identifier0", "subject_identifier1", "subject_identifier2"]} +# provisionerStartWith.sqlCommon.entityTablePrimaryKeyValue = + +# other entity table column names +# {valueType: "string", order: 2100, showEl: "${hasEntityTable}"} +# provisionerStartWith.sqlCommon.entityTableColumnNames = + +# need entity link? +# {valueType: "boolean", order: 2200, showEl: "${hasEntityTable}"} +# provisionerStartWith.sqlCommon.needEntityLink = + +# has entity attribute table? +# {valueType: "boolean", order: 2300, defaultValue: "false", showEl: "${hasEntityTable}"} +# provisionerStartWith.sqlCommon.hasEntityAttributeTable = + +# entity attribute table name +# {valueType: "string", order: 2400, required: true, showEl: "${hasEntityAttributeTable}"} +# provisionerStartWith.sqlCommon.entityAttributeTableName = + +# column name which is foreign key to entity table +# {valueType: "string", order: 2500, required: true, showEl: "${hasEntityAttributeTable}"} +# provisionerStartWith.sqlCommon.columnNameForeignKeyToEntityTable = + +# column name which is the attribute name +# {valueType: "string", order: 2600, required: true, showEl: "${hasEntityAttributeTable}"} +# provisionerStartWith.sqlCommon.entityAttributeNameColumnName = + +# column name which is the attribute value +# {valueType: "string", order: 2700, required: true, showEl: "${hasEntityAttributeTable}"} +# provisionerStartWith.sqlCommon.entityAttributeValueColumnName = + +# membership attribute name +# {valueType: "string", order: 2800, required: true, showEl: "${hasEntityAttributeTable && membershipStructure == 'entityAttributes'}"} +# provisionerStartWith.sqlCommon.entityMembershipAttributeName = + +# membership attribute value +# {valueType: "string", order: 2900, required: true, formElement: "dropdown", showEl: "${hasEntityAttributeTable && membershipStructure == 'entityAttributes'}", optionValues: ["groupExtension", "groupIdIndex", "groupName", "groupPrimaryKey", "groupUuid", "other", "script"]} +# provisionerStartWith.sqlCommon.entityMembershipAttributeValue = + +# other attribute names in attribute table +# {valueType: "string", order: 3000, showEl: "${hasEntityAttributeTable}"} +# provisionerStartWith.sqlCommon.entityOtherAttributeNames = + +# has membership table? +# {valueType: "boolean", order: 3100, defaultValue: "false", showEl: "${userAttributesType != null}"} +# provisionerStartWith.sqlCommon.hasMembershipTable = + +# membership table name +# {valueType: "string", order: 3150, required: true, showEl: "${hasMembershipTable}"} +# provisionerStartWith.sqlCommon.membershipTableName = + +# group column +# {valueType: "string", order: 3200, required: true, showEl: "${hasMembershipTable}"} +# provisionerStartWith.sqlCommon.membershipTableGroupColumn = + +# group value +# {valueType: "string", order: 3300, required: true, formElement: "dropdown", showEl: "${hasMembershipTable}", optionValues: ["groupExtension", "groupIdIndex", "groupName", "groupPrimaryKey", "groupUuid", "other", "script"]} +# provisionerStartWith.sqlCommon.membershipTableGroupValue = + +# entity column +# {valueType: "string", order: 3400, required: true, showEl: "${hasMembershipTable}"} +# provisionerStartWith.sqlCommon.membershipTableEntityColumn = + +# entity value +# {valueType: "string", order: 3500, required: true, formElement: "dropdown", showEl: "${hasMembershipTable}", optionValues: ["entityPrimaryKey", "other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} +# provisionerStartWith.sqlCommon.membershipTableEntityValue = + +# add disabled full sync daemon? +# {valueType: "boolean", order: 3600, defaultValue: "true", showEl: "${userAttributesType != null}"} +# provisionerStartWith.sqlCommon.addDisabledFullSyncDaemon = + +# add disabled incremental sync daemon? +# {valueType: "boolean", order: 3700, defaultValue: "true", showEl: "${userAttributesType != null}"} +# provisionerStartWith.sqlCommon.addDisabledIncrementalSyncDaemon = ################################################ ## provisioner startWith - ldap memberships @@ -4140,7 +4256,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisionerStartWith.ldapMemberships.ldapPattern = # Membership structure -# {valueType: "string", order: 300, required: true, formElement: "dropdown", showEl: "${ldapPattern != null}", optionValues: ["groupAttributes", "entityAttributes"]} +# {valueType: "string", order: 300, required: true, formElement: "dropdown", showEl: "${ldapPattern != null}", optionValues: ["entityAttributes", "groupAttributes"]} # provisionerStartWith.ldapMemberships.membershipStructure = # membershipValue is DN? @@ -4152,7 +4268,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisionerStartWith.ldapMemberships.groupOrganization = # User attributes type -# {valueType: "string", order: 550, required: true, formElement: "dropdown", showEl: "${groupOrganization != null}", optionValues: ["core", "subjectSource", "entityResolver", "subjectSourceAndEntityResolver"]} +# {valueType: "string", order: 550, required: true, formElement: "dropdown", showEl: "${groupOrganization != null}", optionValues: ["core", "entityResolver", "subjectSource", "subjectSourceAndEntityResolver"]} # provisionerStartWith.ldapMemberships.userAttributesType = # subject source entity resolver attributes @@ -4172,7 +4288,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisionerStartWith.ldapMemberships.rdnGroupsAttribute = # what is RDN value for groups? -# {valueType: "string", order: 1000, required: true, formElement: "dropdown", showEl: "${groupLinkForAnotherReason || membershipStructure == 'groupAttributes' || membershipValueDn}", optionValues: ["extension", "extensionUnderscoreIdIndex", "idIndex", "name", "nameBackwardsUnderscoreMax64", "other", "script", "uuid", "flat"]} +# {valueType: "string", order: 1000, required: true, formElement: "dropdown", showEl: "${groupLinkForAnotherReason || membershipStructure == 'groupAttributes' || membershipValueDn}", optionValues: ["extension", "extensionUnderscoreIdIndex", "flat", "idIndex", "name", "nameBackwardsUnderscoreMax64", "other", "script", "uuid"]} # provisionerStartWith.ldapMemberships.rdnValueForGroups = # Membership attribute name for groups @@ -4264,11 +4380,11 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisionerStartWith.ldapMemberships.allowMembershipValueOverride = # add disabled full sync daemon? -# {valueType: "boolean", order: 3300, defaultValue: "true", showEl: "${membershipValueDn != null}"} +# {valueType: "boolean", order: 3300, defaultValue: "true", showEl: "${membershipStructure != null}"} # provisionerStartWith.ldapMemberships.addDisabledFullSyncDaemon = # add disabled incremental sync daemon? -# {valueType: "boolean", order: 3400, defaultValue: "true", showEl: "${membershipValueDn != null}"} +# {valueType: "boolean", order: 3400, defaultValue: "true", showEl: "${membershipStructure != null}"} # provisionerStartWith.ldapMemberships.addDisabledIncrementalSyncDaemon = ################################################ @@ -4288,7 +4404,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisionerStartWith.azureCommon.azurePattern = # User attributes type -# {valueType: "string", order: 100, required: true, formElement: "dropdown", showEl: "${azurePattern != null}", optionValues: ["core", "subjectSource", "entityResolver", "subjectSourceAndEntityResolver"]} +# {valueType: "string", order: 100, required: true, formElement: "dropdown", showEl: "${azurePattern != null}", optionValues: ["core", "entityResolver", "subjectSource", "subjectSourceAndEntityResolver"]} # provisionerStartWith.azureCommon.userAttributesType = # subject source entity resolver attributes diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 413a75c0c67c..45115f0aa1b9 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -12685,9 +12685,9 @@ grouperConfigurationValidationConfigIdInvalid = Error: the '$$configIdLabel$$' m grouperConfigurationValidationTestSqlQueryRequired = Error: '${configFieldLabel}' is required when test expected value is provided grouperConfigurationTestExpectedNotMatchingResult = Error: expected '$$expectedValue$$' but received '$$receivedValue$$' -grouperStartWithGroupTableConfigurationValidationGroupTableNotFound = Error: '$$groupTableName$$' not found +grouperStartWithGroupTableConfigurationValidationGroupTableNotFound = Error: '$$tableName$$' not found grouperStartWithEntityTableConfigurationValidationUserTableNotFound = Error: '$$userTableName$$' not found -grouperStartWithGroupTableConfigurationValidationGroupIdColumnNotFound = Error: '$$groupTableIdColumn$$' not found +grouperStartWithGroupTableConfigurationValidationGroupIdColumnNotFound = Error: '$$column$$' not found grouperStartWithEntityTableConfigurationValidationUserIdColumnNotFound = Error: '$$userTableIdColumn$$' not found grouperStartWithGroupTableConfigurationValidationGroupColumnsNotFound = Error: '$$groupTableColumns$$' columns not found grouperStartWithEntityTableConfigurationValidationEntityColumnsNotFound = Error: '$$userTableColumns$$' columns not found @@ -13518,6 +13518,123 @@ config.LdapProvisioningMembershipStartWith.attribute.ldapExternalSystemConfigId. config.GenericConfiguration.attribute.startWith.label = Start with id config.GenericConfiguration.attribute.startWith.description = Start with id +config.SqlProvisioningStartWith.attribute.dbExternalSystemConfigId.label = Db external system config id +config.SqlProvisioningStartWith.attribute.dbExternalSystemConfigId.description = Sql database external system config id. If you do not see your database configuration add it in Miscellaneous -> External systems. You can also provision across database link. + +config.SqlProvisioningStartWith.attribute.sqlPattern.label = Sql pattern +config.SqlProvisioningStartWith.attribute.sqlPattern.description = Sql pattern + +config.SqlProvisioningStartWith.attribute.userAttributesType.label = User attributes type +config.SqlProvisioningStartWith.attribute.userAttributesType.description = User attributes type + +config.SqlProvisioningStartWith.attribute.membershipStructure.label = Membership structure +config.SqlProvisioningStartWith.attribute.membershipStructure.description = Membership structure + +config.SqlProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.label = Subject source entity resolver attributes +config.SqlProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.description = Subject source entity resolver attributes + +config.SqlProvisioningStartWith.attribute.hasGroupTable.label = Has group table? +config.SqlProvisioningStartWith.attribute.hasGroupTable.description = Has group table? + +config.SqlProvisioningStartWith.attribute.groupTableName.label = Group table name +config.SqlProvisioningStartWith.attribute.groupTableName.description = Group table name, e.g. from_grouper_group + +config.SqlProvisioningStartWith.attribute.groupTableIdColumn.label = Group table primary key +config.SqlProvisioningStartWith.attribute.groupTableIdColumn.description = Group table primary key column, e.g. group_id_index + +config.SqlProvisioningStartWith.attribute.groupTablePrimaryKeyValue.label = Group table primary key value +config.SqlProvisioningStartWith.attribute.groupTablePrimaryKeyValue.description = Group table primary key value, e.g. groupIdIndex + +config.SqlProvisioningStartWith.attribute.groupTableColumnNames.label = Group table column names +config.SqlProvisioningStartWith.attribute.groupTableColumnNames.description = Group table column names + +config.SqlProvisioningStartWith.attribute.needGroupLink.label = Need group link? +config.SqlProvisioningStartWith.attribute.needGroupLink.description = Need group link? + +config.SqlProvisioningStartWith.attribute.hasGroupAttributeTable.label = Has group attribute table? +config.SqlProvisioningStartWith.attribute.hasGroupAttributeTable.description = Has group attribute table? + +config.SqlProvisioningStartWith.attribute.groupAttributeTableName.label = Group attribute table name +config.SqlProvisioningStartWith.attribute.groupAttributeTableName.description = Group attribute table name + +config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToGroupTable.label = Column foreign key to group +config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToGroupTable.description = Column name which is foreign key to group table, e.g. group_uuid + +config.SqlProvisioningStartWith.attribute.groupAttributeNameColumnName.label = Attribute name column +config.SqlProvisioningStartWith.attribute.groupAttributeNameColumnName.description = Column name which is the attribute name, e.g. attribute_name + +config.SqlProvisioningStartWith.attribute.groupAttributeValueColumnName.label = Attribute value column +config.SqlProvisioningStartWith.attribute.groupAttributeValueColumnName.description = Column name which is the attribute value, e.g. attribute_value + +config.SqlProvisioningStartWith.attribute.groupMembershipAttributeName.label = Group membership attribute name +config.SqlProvisioningStartWith.attribute.groupMembershipAttributeName.description = Group membership attribute name + +config.SqlProvisioningStartWith.attribute.groupMembershipAttributeValue.label = Group membership attribute value +config.SqlProvisioningStartWith.attribute.groupMembershipAttributeValue.description = Group membership attribute value + +config.SqlProvisioningStartWith.attribute.groupOtherAttributeNames.label = Group other attribute names +config.SqlProvisioningStartWith.attribute.groupOtherAttributeNames.description = Group other attribute names + +config.SqlProvisioningStartWith.attribute.hasEntityTable.label = Has entity table +config.SqlProvisioningStartWith.attribute.hasEntityTable.description = Has entity table + +config.SqlProvisioningStartWith.attribute.entityTableName.label = Entity table name +config.SqlProvisioningStartWith.attribute.entityTableName.description = Entity table name + +config.SqlProvisioningStartWith.attribute.entityTableIdColumn.label = Entity table primary key +config.SqlProvisioningStartWith.attribute.entityTableIdColumn.description = Entity table primary key column, e.g. entity_uuid + +config.SqlProvisioningStartWith.attribute.entityTablePrimaryKeyValue.label = Entity table primary key value +config.SqlProvisioningStartWith.attribute.entityTablePrimaryKeyValue.description = Entity table primary key value, e.g. entity_uuid + +config.SqlProvisioningStartWith.attribute.entityTableColumnNames.label = Entity table column names +config.SqlProvisioningStartWith.attribute.entityTableColumnNames.description = Entity table column names + +config.SqlProvisioningStartWith.attribute.needEntityLink.label = Need entity link? +config.SqlProvisioningStartWith.attribute.needEntityLink.description = Need entity link? + +config.SqlProvisioningStartWith.attribute.hasEntityAttributeTable.label = Has entity attribute table? +config.SqlProvisioningStartWith.attribute.hasEntityAttributeTable.description = Has entity attribute table? + +config.SqlProvisioningStartWith.attribute.entityAttributeTableName.label = Entity attribute table name +config.SqlProvisioningStartWith.attribute.entityAttributeTableName.description = Entity attribute table name + +config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToEntityTable.label = Column foreign key to entity +config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToEntityTable.description = Column name which is foreign key to entity table, e.g. entity_uuid + +config.SqlProvisioningStartWith.attribute.entityAttributeNameColumnName.label = Attribute name column +config.SqlProvisioningStartWith.attribute.entityAttributeNameColumnName.description = Column name which is the attribute name, e.g. attribute_name + +config.SqlProvisioningStartWith.attribute.entityAttributeValueColumnName.label = Attribute value column +config.SqlProvisioningStartWith.attribute.entityAttributeValueColumnName.description = Column name which is the attribute value, e.g. attribute_value + +config.SqlProvisioningStartWith.attribute.entityMembershipAttributeName.label = Entity membership attribute name +config.SqlProvisioningStartWith.attribute.entityMembershipAttributeName.description = Entity membership attribute name + +config.SqlProvisioningStartWith.attribute.entityMembershipAttributeValue.label = Entity membership attribute value +config.SqlProvisioningStartWith.attribute.entityMembershipAttributeValue.description = Entity membership attribute value + +config.SqlProvisioningStartWith.attribute.entityOtherAttributeNames.label = Entity other attribute names +config.SqlProvisioningStartWith.attribute.entityOtherAttributeNames.description = Entity other attribute names + +config.SqlProvisioningStartWith.attribute.hasMembershipTable.label = Has membership table? +config.SqlProvisioningStartWith.attribute.hasMembershipTable.description = Has membership table? + +config.SqlProvisioningStartWith.attribute.membershipTableName.label = Membership table name +config.SqlProvisioningStartWith.attribute.membershipTableName.description = Membership table name + +config.SqlProvisioningStartWith.attribute.membershipTableGroupColumn.label = Membership table group column +config.SqlProvisioningStartWith.attribute.membershipTableGroupColumn.description = Membership table group column + +config.SqlProvisioningStartWith.attribute.membershipTableGroupValue.label = Membership table group value +config.SqlProvisioningStartWith.attribute.membershipTableGroupValue.description = Membership table group value + +config.SqlProvisioningStartWith.attribute.membershipTableEntityColumn.label = Membership table entity column +config.SqlProvisioningStartWith.attribute.membershipTableEntityColumn.description = Membership table entity column + +config.SqlProvisioningStartWith.attribute.membershipTableEntityValue.label = Membership table entity value +config.SqlProvisioningStartWith.attribute.membershipTableEntityValue.description = Membership table entity value + config.LdapProvisioningMembershipStartWith.attribute.ldapPattern.label = Ldap pattern config.LdapProvisioningMembershipStartWith.attribute.ldapPattern.description = Ldap pattern diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/azure/AzureProvisioningStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/azure/AzureProvisioningStartWith.java index 0daf9a2114bc..07c095a90697 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/azure/AzureProvisioningStartWith.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/azure/AzureProvisioningStartWith.java @@ -45,6 +45,8 @@ public Map screenRedraw(Map suffixToValue, result.put("manageEntitiesInAzure", "true"); } else if (StringUtils.equals(valueUserEnteredOnScreen, "manageGroupsReadonlyEntities")) { result.put("manageEntitiesInAzure", "false"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "other")) { + result.clear(); } } } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisioningMembershipStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisioningMembershipStartWith.java index cc995b4e113a..3a585e7011c5 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisioningMembershipStartWith.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisioningMembershipStartWith.java @@ -12,10 +12,7 @@ import edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig; import edu.internet2.middleware.grouper.app.provisioning.ProvisionerStartWithBase; import edu.internet2.middleware.grouper.cfg.text.GrouperTextContainer; -import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClientExt.org.apache.commons.lang3.StringUtils; -import edu.internet2.middleware.subject.Source; -import edu.internet2.middleware.subject.provider.SourceManager; /** */ @@ -144,6 +141,8 @@ public Map screenRedraw(Map suffixToValue, Set startWithConfigClassNames = new LinkedHashSet(); static { - startWithConfigClassNames.add(SqlProvisioningGroupTableStartWith.class.getName()); - startWithConfigClassNames.add(SqlProvisioningEntityTableStartWith.class.getName()); + startWithConfigClassNames.add(SqlProvisioningStartWith.class.getName()); } @Override diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningEntityTableStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningEntityTableStartWith.java deleted file mode 100644 index 5b264c56c08d..000000000000 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningEntityTableStartWith.java +++ /dev/null @@ -1,121 +0,0 @@ -package edu.internet2.middleware.grouper.app.sqlProvisioning; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.lang3.StringUtils; - -import edu.internet2.middleware.grouper.app.config.GrouperConfigurationModuleAttribute; -import edu.internet2.middleware.grouper.app.provisioning.ProvisionerStartWithBase; -import edu.internet2.middleware.grouper.cfg.text.GrouperTextContainer; -import edu.internet2.middleware.grouper.util.GrouperUtil; -import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcTableSyncColumnMetadata; -import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcTableSyncTableMetadata; - -/** - * - */ -public class SqlProvisioningEntityTableStartWith extends ProvisionerStartWithBase { - - @Override - public String getPropertyValueThatIdentifiesThisConfig() { - return "sqlEntityTable"; - } - - @Override - public void validatePreSave(boolean isInsert, List errorsToDisplay, Map validationErrorsToDisplay) { - super.validatePreSave(isInsert, errorsToDisplay, validationErrorsToDisplay); - - GrouperConfigurationModuleAttribute sqlExternalSystemConnectionName = this.retrieveAttributes().get("dbExternalSystemConfigId"); - GrouperConfigurationModuleAttribute userTableName = this.retrieveAttributes().get("userTableName"); - GrouperConfigurationModuleAttribute userTableIdColumn = this.retrieveAttributes().get("userPrimaryKey"); - GrouperConfigurationModuleAttribute columnNames = this.retrieveAttributes().get("columnNames"); - - GcTableSyncTableMetadata tableMetadata = null; - try { - tableMetadata = GcTableSyncTableMetadata.retrieveTableMetadataFromCacheOrDatabase(sqlExternalSystemConnectionName.getValueOrExpressionEvaluation(), - userTableName.getValueOrExpressionEvaluation()); - } catch (Exception e) { - String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithEntityTableConfigurationValidationUserTableNotFound"); - errorMessage = errorMessage.replace("$$userTableName$$", userTableName.getValueOrExpressionEvaluation()); - validationErrorsToDisplay.put(userTableName.getHtmlForElementIdHandle(), errorMessage); - return; - } - - if (tableMetadata == null) { - String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithEntityTableConfigurationValidationUserTableNotFound"); - errorMessage = errorMessage.replace("$$userTableName$$", userTableName.getValueOrExpressionEvaluation()); - validationErrorsToDisplay.put(userTableName.getHtmlForElementIdHandle(), errorMessage); - return; - } - - - String columnNamesCommaSeparated = columnNames.getValueOrExpressionEvaluation(); - Set colNamesSet = GrouperUtil.splitTrimToSet(columnNamesCommaSeparated.toLowerCase(), ","); - - String userTableIdColumnValue = GrouperUtil.trim(userTableIdColumn.getValueOrExpressionEvaluation()).toLowerCase(); - - List columnsMetadata = tableMetadata.getColumnMetadata(); - - boolean userTableIdColumnFound = false; - - for (GcTableSyncColumnMetadata columnMetadata: GrouperUtil.nonNull(columnsMetadata)) { - String columnName = columnMetadata.getColumnName().toLowerCase(); - if (StringUtils.equals(columnName, userTableIdColumnValue)) { - userTableIdColumnFound = true; - } - if (colNamesSet.contains(columnName)) { - colNamesSet.remove(columnName); - } - } - - if (!userTableIdColumnFound) { - String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithEntityTableConfigurationValidationUserIdColumnNotFound"); - errorMessage = errorMessage.replace("$$userTableIdColumn$$", userTableIdColumn.getValueOrExpressionEvaluation()); - validationErrorsToDisplay.put(userTableIdColumn.getHtmlForElementIdHandle(), errorMessage); - } - - if (colNamesSet.size() > 0) { - String notFoundColNames = GrouperUtil.join(colNamesSet.iterator(), ','); - String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithEntityTableConfigurationValidationEntityColumnsNotFound"); - errorMessage = errorMessage.replace("$$userTableColumns$$", notFoundColNames); - validationErrorsToDisplay.put(columnNames.getHtmlForElementIdHandle(), errorMessage); - } - - } - - /** - * return provisioning suffix to value - * @param startWithSuffixToValue - * @param provisionerSuffixToValue - * @return - */ - @Override - public void populateProvisionerConfigurationValuesFromStartWith(Map startWithSuffixToValue, - Map provisionerSuffixToValue) { - - String columnNames = startWithSuffixToValue.get("columnNames"); - String[] colNames = GrouperUtil.splitTrim(columnNames, ","); - provisionerSuffixToValue.put("numberOfGroupAttributes", colNames.length); - - for (int i=0; i screenRedraw(Map suffixToValue, - Set suffixesUserJustChanged) { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningGroupTableStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java similarity index 100% rename from grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningGroupTableStartWith.java rename to grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java From 619387b122880141b48d038a7d9415626baa0d42 Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Sat, 16 Apr 2022 08:11:07 -0700 Subject: [PATCH 010/125] Add Duo provisioning start with --- grouper/conf/grouper-loader.base.properties | 65 ++++ .../grouper.textNg.en.us.base.properties | 34 ++ .../app/duo/DuoProvisionerConfiguration.java | 30 ++ .../app/duo/DuoProvisioningStartWith.java | 66 ++++ .../SqlProvisioningStartWith.java | 301 ++++++++++++++---- 5 files changed, 439 insertions(+), 57 deletions(-) create mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisioningStartWith.java diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index d8126411c9db..92a2302946d1 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -4463,3 +4463,68 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisionerStartWith.azureCommon.addDisabledIncrementalSyncDaemon = +################################################ +## provisioner startWith - Duo +################################################ + +# azure common +# {valueType: "string", order: 25, readOnly: true} +# provisionerStartWith.duoCommon.startWith = duoCommon + +# this is the duo external system config id +# {valueType: "string", required: true, order: 20, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouperDuo.DuoGrouperExternalSystem"} +# provisionerStartWith.duoCommon.duoExternalSystemConfigId = + +# Duo pattern +# {valueType: "string", order: 50, required: true, formElement: "dropdown", showEl: "${duoExternalSystemConfigId != null}", optionValues: ["manageGroupsManageEntities", "manageGroupsReadonlyEntities", "manageEntities", "other"]} +# provisionerStartWith.duoCommon.duoPattern = + +# User attributes type +# {valueType: "string", order: 100, required: true, formElement: "dropdown", showEl: "${duoPattern != null}", optionValues: ["core", "entityResolver", "subjectSource", "subjectSourceAndEntityResolver"]} +# provisionerStartWith.duoCommon.userAttributesType = + +# subject source entity resolver attributes +# {valueType: "string", order: 200, required: true, showEl: "${userAttributesType == 'subjectSource' || userAttributesType == 'subjectSourceAndEntityResolver'}"} +# provisionerStartWith.duoCommon.subjectSourceEntityResolverAttributes = + +# manage groups +# {valueType: "boolean", order: 250, defaultValue: "false", showEl: "${duoPattern != null}"} +# provisionerStartWith.duoCommon.manageGroups = + +# group name attribute value +# {valueType: "string", order: 300, required: true, formElement: "dropdown", showEl: "${manageGroups == true}", optionValues: ["extension", "idIndex", "name", "other", "script", "uuid"]} +# provisionerStartWith.duoCommon.groupNameAttributeValue = + +# use group description +# {valueType: "boolean", order: 400, defaultValue: "true", showEl: "${manageGroups == true}"} +# provisionerStartWith.duoCommon.useGroupDescription = + +# manage entities +# {valueType: "boolean", order: 500, defaultValue: "false", showEl: "${duoPattern != null}"} +# provisionerStartWith.duoCommon.manageEntities = + +# Entity user name +# {valueType: "string", order: 600, formElement: "dropdown", showEl: "${manageEntities == true}", optionValues: ["other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} +# provisionerStartWith.duoCommon.entityUserName = + +# Entity name subject attribute +# {valueType: "string", order: 700, showEl: "${manageEntities == true}"} +# provisionerStartWith.duoCommon.entityNameSubjectAttribute = + +# Entity first name subject attribute +# {valueType: "string", order: 800, showEl: "${manageEntities == true}"} +# provisionerStartWith.duoCommon.entityFirstNameSubjectAttribute = + +# Entity email subject attribute +# {valueType: "string", order: 900, showEl: "${manageEntities == true}"} +# provisionerStartWith.duoCommon.entityEmailSubjectAttribute = + +# add disabled full sync daemon? +# {valueType: "boolean", order: 1700, defaultValue: "true", showEl: "${duoPattern != null}"} +# provisionerStartWith.duoCommon.addDisabledFullSyncDaemon = + +# add disabled incremental sync daemon? +# {valueType: "boolean", order: 1800, defaultValue: "true", showEl: "${duoPattern != null}"} +# provisionerStartWith.duoCommon.addDisabledIncrementalSyncDaemon = + + diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 4bfcd44f03e4..a8ca527bcced 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13807,7 +13807,41 @@ config.AzureProvisioningStartWith.attribute.manageEntitiesInAzure.description = config.AzureProvisioningStartWith.attribute.entityDisplayName.label = Entity display name config.AzureProvisioningStartWith.attribute.entityDisplayName.description = Entity display name +config.DuoProvisioningStartWith.attribute.duoExternalSystemConfigId.label = Duo external system +config.DuoProvisioningStartWith.attribute.duoExternalSystemConfigId.description = Duo external system +config.DuoProvisioningStartWith.attribute.duoPattern.label = Duo pattern +config.DuoProvisioningStartWith.attribute.duoPattern.description = Duo pattern + +config.DuoProvisioningStartWith.attribute.userAttributesType.label = User attributes type +config.DuoProvisioningStartWith.attribute.userAttributesType.description = User attributes type + +config.DuoProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.label = Subject source entity resolver attributes +config.DuoProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.description = Subject source entity resolver attributes + +config.DuoProvisioningStartWith.attribute.manageGroups.label = Manage groups +config.DuoProvisioningStartWith.attribute.manageGroups.description = Manage groups + +config.DuoProvisioningStartWith.attribute.groupNameAttributeValue.label = Group name attribute value +config.DuoProvisioningStartWith.attribute.groupNameAttributeValue.description = Group name attribute value + +config.DuoProvisioningStartWith.attribute.useGroupDescription.label = Use group description +config.DuoProvisioningStartWith.attribute.useGroupDescription.description = Use group description + +config.DuoProvisioningStartWith.attribute.manageEntities.label = Manage entities +config.DuoProvisioningStartWith.attribute.manageEntities.description = Manage entities + +config.DuoProvisioningStartWith.attribute.entityUserName.label = User name +config.DuoProvisioningStartWith.attribute.entityUserName.description = Entity user name + +config.DuoProvisioningStartWith.attribute.entityNameSubjectAttribute.label = Name subject attribute or entity resolver name +config.DuoProvisioningStartWith.attribute.entityNameSubjectAttribute.description = Name subject attribute or entity resolver name + +config.DuoProvisioningStartWith.attribute.entityFirstNameSubjectAttribute.label = First name subject attribute or entity resolver name +config.DuoProvisioningStartWith.attribute.entityFirstNameSubjectAttribute.description = First name subject attribute or entity resolver name + +config.DuoProvisioningStartWith.attribute.entityEmailSubjectAttribute.label = Email subject attribute or entity resolver name +config.DuoProvisioningStartWith.attribute.entityEmailSubjectAttribute.description = Email subject attribute or entity resolver name config.GenericConfiguration.attribute.refreshSubjectLinkIfLessThanAmount.label = Refresh subject link config.GenericConfiguration.attribute.refreshEntityLinkIfLessThanAmount.label = Refresh target entity link diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisionerConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisionerConfiguration.java index 10c38c412399..adac0a0d8a6f 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisionerConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisionerConfiguration.java @@ -1,14 +1,44 @@ package edu.internet2.middleware.grouper.app.duo; +import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.lang3.StringUtils; +import edu.internet2.middleware.grouper.app.provisioning.ProvisionerStartWithBase; import edu.internet2.middleware.grouper.app.provisioning.ProvisioningConfiguration; import edu.internet2.middleware.grouper.cfg.dbConfig.ConfigFileName; +import edu.internet2.middleware.grouper.util.GrouperUtil; public class DuoProvisionerConfiguration extends ProvisioningConfiguration { + + public final static Set startWithConfigClassNames = new LinkedHashSet(); + + static { + startWithConfigClassNames.add(DuoProvisioningStartWith.class.getName()); + } + + @Override + public List getStartWithConfigClasses() { + + List result = new ArrayList(); + + for (String className: startWithConfigClassNames) { + try { + Class configClass = (Class) GrouperUtil.forName(className); + ProvisionerStartWithBase config = GrouperUtil.newInstance(configClass); + result.add(config); + } catch (Exception e) { + //TODO + } + } + + return result; + + } @Override public ConfigFileName getConfigFileName() { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisioningStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisioningStartWith.java new file mode 100644 index 000000000000..8f8f014a9b78 --- /dev/null +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/duo/DuoProvisioningStartWith.java @@ -0,0 +1,66 @@ +package edu.internet2.middleware.grouper.app.duo; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import edu.internet2.middleware.grouper.app.provisioning.ProvisionerStartWithBase; +import edu.internet2.middleware.grouperClientExt.org.apache.commons.lang3.StringUtils; + +public class DuoProvisioningStartWith extends ProvisionerStartWithBase { + + @Override + public String getPropertyValueThatIdentifiesThisConfig() { + return "duoCommon"; + } + + @Override + public void populateProvisionerConfigurationValuesFromStartWith( + Map startWithSuffixToValue, + Map provisionerSuffixToValue) { + // TODO Auto-generated method stub + + } + + @Override + public Map screenRedraw(Map suffixToValue, + Set suffixesUserJustChanged) { + + Map result = new HashMap<>(); + + for (String suffixUserJustChanged: suffixesUserJustChanged) { + + if (StringUtils.equals(suffixUserJustChanged, "duoPattern")) { + String valueUserEnteredOnScreen = suffixToValue.get(suffixUserJustChanged); + if (StringUtils.equals(valueUserEnteredOnScreen, "manageGroupsManageEntities")) { + result.put("manageGroups", "true"); + result.put("manageEntities", "true"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "manageGroupsReadonlyEntities")) { + result.put("manageGroups", "true"); + result.put("manageEntities", "false"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "manageEntities")) { + result.put("manageGroups", "false"); + result.put("manageEntities", "true"); + } + else if (StringUtils.equals(valueUserEnteredOnScreen, "other")) { + result.clear(); + } + } + } + + return result; + } + + @Override + public void validatePreSave(boolean isInsert, List errorsToDisplay, Map validationErrorsToDisplay) { + + super.validatePreSave(isInsert, errorsToDisplay, validationErrorsToDisplay); + + if (errorsToDisplay.size() > 0 || validationErrorsToDisplay.size() > 0) { + return; + } + + } + +} diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java index 4a865ca5b4ed..d7e96acfd63e 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java @@ -1,5 +1,6 @@ package edu.internet2.middleware.grouper.app.sqlProvisioning; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -16,7 +17,7 @@ /** */ -public class SqlProvisioningGroupTableStartWith extends ProvisionerStartWithBase { +public class SqlProvisioningStartWith extends ProvisionerStartWithBase { @Override public ConfigFileName getConfigFileName() { @@ -25,79 +26,279 @@ public ConfigFileName getConfigFileName() { @Override public String getPropertyValueThatIdentifiesThisConfig() { - return "sqlGroupTable"; + return "sqlCommon"; } @Override public Map screenRedraw(Map suffixToValue, Set suffixesUserJustChanged) { - /** - * have a hidden uuid on the form, save the state based on the that on the server side in an expirable cache map - * of Map> - */ + Map result = new HashMap<>(); - return null; + for (String suffixUserJustChanged: suffixesUserJustChanged) { + + if (StringUtils.equals(suffixUserJustChanged, "sqlPattern")) { + String valueUserEnteredOnScreen = suffixToValue.get(suffixUserJustChanged); + if (StringUtils.equals(valueUserEnteredOnScreen, "entityTable")) { + result.put("membershipStructure", "notApplicable"); + result.put("hasEntityTable", "true"); + result.put("entityTableName", "from_grouper_entity"); + result.put("entityTableIdColumn", "entity_uuid"); + result.put("entityTablePrimaryKeyValue", "entityUuid"); + result.put("entityTableColumnNames", "subject_id"); + result.put("needEntityLink", "false"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "entityTableWithAttributeTable")) { + result.put("membershipStructure", "notApplicable"); + result.put("hasEntityTable", "true"); + result.put("entityTableName", "from_grouper_entity"); + result.put("entityTableIdColumn", "entity_uuid"); + result.put("entityTablePrimaryKeyValue", "entityUuid"); + result.put("entityTableColumnNames", "subject_id"); + result.put("needEntityLink", "false"); + result.put("hasEntityAttributeTable", "true"); + result.put("entityAttributeTableName", "from_grouper_entity_attr"); + result.put("columnNameForeignKeyToEntityTable", "entity_uuid"); + result.put("entityAttributeNameColumnName", "attribute_name"); + result.put("entityAttributeNameColumnValue", "attribute_value"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "entityTableWithAttributeTableAndMemberships")) { + result.put("membershipStructure", "entityAttributes"); + result.put("hasEntityTable", "true"); + result.put("entityTableName", "from_grouper_entity"); + result.put("entityTableIdColumn", "entity_uuid"); + result.put("entityTablePrimaryKeyValue", "entityUuid"); + result.put("entityTableColumnNames", "subject_id"); + result.put("hasEntityAttributeTable", "true"); + result.put("entityAttributeTableName", "from_grouper_entity_attr"); + result.put("columnNameForeignKeyToEntityTable", "entity_uuid"); + result.put("entityAttributeNameColumnName", "attribute_name"); + result.put("entityAttributeNameColumnValue", "attribute_value"); + result.put("entityMembershipAttributeName", "memberOf"); + result.put("needEntityLink", "true"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "entityTableMembershipTable")) { + result.put("hasEntityTable", "true"); + result.put("entityTableName", "from_grouper_entity"); + result.put("entityTableIdColumn", "entity_uuid"); + result.put("entityTablePrimaryKeyValue", "entityUuid"); + result.put("entityTableColumnNames", "subject_id"); + result.put("membershipStructure", "membershipObjects"); + result.put("hasMembershipTable", "true"); + result.put("membershipTableName", "from_grouper_mship"); + result.put("membershipTableGroupColumn", "group_name"); + result.put("membershipTableGroupValue", "groupName"); + result.put("membershipTableEntityColumn", "entity_uuid"); + result.put("membershipTableEntityValue", "entityUuid"); + result.put("needGroupLink", "false"); + result.put("needEntityLink", "true"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "groupTable")) { + result.put("membershipStructure", "notApplicable"); + result.put("hasGroupTable", "true"); + result.put("groupTableName", "from_grouper_group"); + result.put("groupTableIdColumn", "group_id_index"); + result.put("groupTableColumnNames", "groupIdIndex"); + result.put("needGroupLink", "false"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "groupTableWithAttributeTable")) { + result.put("membershipStructure", "notApplicable"); + result.put("hasGroupTable", "true"); + result.put("groupTableName", "from_grouper_group"); + result.put("groupTableIdColumn", "group_id_index"); + result.put("groupTableColumnNames", "groupIdIndex"); + result.put("needGroupLink", "false"); + result.put("hasGroupAttributeTable", "true"); + result.put("groupAttributeTableName", "from_grouper_group_attr"); + result.put("columnNameForeignKeyToGroupTable", "group_id_index"); + result.put("groupAttributeNameColumnName", "attribute_name"); + result.put("groupAttributeNameColumnValue", "attribute_value"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "groupTableWithAttributeTableAndMemberships")) { + result.put("membershipStructure", "groupAttributes"); + result.put("hasGroupTable", "true"); + result.put("groupTableName", "from_grouper_group"); + result.put("groupTableIdColumn", "group_id_index"); + result.put("groupTableColumnNames", "groupIdIndex"); + result.put("hasGroupAttributeTable", "true"); + result.put("groupAttributeTableName", "from_grouper_group_attr"); + result.put("columnNameForeignKeyToGroupTable", "group_id_index"); + result.put("groupAttributeNameColumnName", "attribute_name"); + result.put("groupAttributeNameColumnValue", "attribute_value"); + result.put("groupMembershipAttributeName", "hasMember"); + result.put("needGroupLink", "true"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "groupTableMembershipTable")) { + result.put("hasGroupTable", "true"); + result.put("groupTableName", "from_grouper_group"); + result.put("groupTableIdColumn", "group_id_index"); + result.put("groupTableColumnNames", "groupIdIndex"); + result.put("needGroupLink", "true"); + result.put("membershipStructure", "membershipObjects"); + result.put("hasMembershipTable", "true"); + result.put("membershipTableName", "from_grouper_mship"); + result.put("membershipTableGroupColumn", "group_id_index"); + result.put("membershipTableGroupValue", "groupIdIndex"); + result.put("membershipTableEntityColumn", "subject_id"); + result.put("membershipTableEntityValue", "subjectId"); + result.put("needEntityLink", "false"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "groupTableEntityTableMembershipTable")) { + result.put("membershipStructure", "notApplicable"); + result.put("hasEntityTable", "true"); + result.put("entityTableName", "from_grouper_entity"); + result.put("entityTableIdColumn", "entity_uuid"); + result.put("entityTablePrimaryKeyValue", "entityUuid"); + result.put("entityTableColumnNames", "subject_id"); + result.put("needEntityLink", "true"); + result.put("membershipStructure", "notApplicable"); + result.put("hasGroupTable", "true"); + result.put("groupTableName", "from_grouper_group"); + result.put("groupTableIdColumn", "group_id_index"); + result.put("groupTableColumnNames", "groupIdIndex"); + result.put("needGroupLink", "true"); + result.put("membershipStructure", "membershipObjects"); + result.put("hasMembershipTable", "true"); + result.put("membershipTableName", "from_grouper_mship"); + result.put("membershipTableGroupColumn", "group_id_index"); + result.put("membershipTableGroupValue", "groupIdIndex"); + result.put("membershipTableEntityColumn", "entity_uuid"); + result.put("membershipTableEntityValue", "entityUuid"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "membershipTable")) { + result.put("membershipStructure", "membershipObjects"); + result.put("hasMembershipTable", "true"); + result.put("membershipTableName", "from_grouper_mship"); + result.put("membershipTableGroupColumn", "group_name"); + result.put("membershipTableGroupValue", "groupName"); + result.put("membershipTableEntityColumn", "subject_id"); + result.put("membershipTableEntityValue", "subjectId"); + result.put("needGroupLink", "false"); + result.put("needEntityLink", "false"); + } else if (StringUtils.equals(valueUserEnteredOnScreen, "other")) { + result.clear(); + } + } + + } + + return result; } @Override public void validatePreSave(boolean isInsert, List errorsToDisplay, Map validationErrorsToDisplay) { super.validatePreSave(isInsert, errorsToDisplay, validationErrorsToDisplay); - GrouperConfigurationModuleAttribute sqlExternalSystemConnectionName = this.retrieveAttributes().get("dbExternalSystemConfigId"); - GrouperConfigurationModuleAttribute groupTableName = this.retrieveAttributes().get("groupTableName"); - GrouperConfigurationModuleAttribute groupTableIdColumn = this.retrieveAttributes().get("groupTableIdColumn"); - GrouperConfigurationModuleAttribute columnNames = this.retrieveAttributes().get("columnNames"); + GrouperConfigurationModuleAttribute hasGroupTableAttribute = this.retrieveAttributes().get("hasGroupTable"); + + if (hasGroupTableAttribute != null && GrouperUtil.booleanValue(hasGroupTableAttribute.getValue(), false)) { + GrouperConfigurationModuleAttribute sqlExternalSystemConnectionName = this.retrieveAttributes().get("dbExternalSystemConfigId"); + GrouperConfigurationModuleAttribute groupTableName = this.retrieveAttributes().get("groupTableName"); + GrouperConfigurationModuleAttribute groupTableIdColumn = this.retrieveAttributes().get("groupTableIdColumn"); + GrouperConfigurationModuleAttribute groupTableColumnNames = this.retrieveAttributes().get("groupTableColumnNames"); + + validateTableAndColumns(validationErrorsToDisplay, sqlExternalSystemConnectionName, groupTableName, groupTableIdColumn, groupTableColumnNames); + + GrouperConfigurationModuleAttribute hasGroupAttributeTableAttribute = this.retrieveAttributes().get("hasGroupAttributeTable"); + if (GrouperUtil.booleanValue(hasGroupAttributeTableAttribute.getValueOrExpressionEvaluation(), false)) { + + GrouperConfigurationModuleAttribute attributeTableName = this.retrieveAttributes().get("groupAttributeTableName"); + GrouperConfigurationModuleAttribute attributeTableIdColumn = this.retrieveAttributes().get("columnNameForeignKeyToGroupTable"); + GrouperConfigurationModuleAttribute attributeTableColumnName = this.retrieveAttributes().get("groupAttributeNameColumnName"); + GrouperConfigurationModuleAttribute attributeTableValueColumn = this.retrieveAttributes().get("groupAttributeValueColumnName"); + + validateTableAndColumns(validationErrorsToDisplay, sqlExternalSystemConnectionName, attributeTableName, attributeTableColumnName, attributeTableValueColumn); + validateTableAndColumns(validationErrorsToDisplay, sqlExternalSystemConnectionName, attributeTableName, attributeTableIdColumn, null); + + } + } + + GrouperConfigurationModuleAttribute hasEntityTableAttribute = this.retrieveAttributes().get("hasEntityTable"); + + if (hasGroupTableAttribute != null && GrouperUtil.booleanValue(hasEntityTableAttribute.getValue(), false)) { + + GrouperConfigurationModuleAttribute sqlExternalSystemConnectionName = this.retrieveAttributes().get("dbExternalSystemConfigId"); + + GrouperConfigurationModuleAttribute entityTableName = this.retrieveAttributes().get("entityTableName"); + GrouperConfigurationModuleAttribute entityTableIdColumn = this.retrieveAttributes().get("entityTableIdColumn"); + GrouperConfigurationModuleAttribute entityTableColumnNames = this.retrieveAttributes().get("entityTableColumnNames"); + + validateTableAndColumns(validationErrorsToDisplay, sqlExternalSystemConnectionName, entityTableName, entityTableIdColumn, entityTableColumnNames); + + GrouperConfigurationModuleAttribute hasEntityAttributeTableAttribute = this.retrieveAttributes().get("hasEntityAttributeTable"); + if (GrouperUtil.booleanValue(hasEntityAttributeTableAttribute.getValueOrExpressionEvaluation(), false)) { + + GrouperConfigurationModuleAttribute attributeTableName = this.retrieveAttributes().get("entityAttributeTableName"); + GrouperConfigurationModuleAttribute attributeTableIdColumn = this.retrieveAttributes().get("columnNameForeignKeyToEntityTable"); + GrouperConfigurationModuleAttribute attributeTableColumnName = this.retrieveAttributes().get("entityAttributeNameColumnName"); + GrouperConfigurationModuleAttribute attributeTableValueColumn = this.retrieveAttributes().get("entityAttributeValueColumnName"); + + validateTableAndColumns(validationErrorsToDisplay, sqlExternalSystemConnectionName, attributeTableName, attributeTableColumnName, attributeTableValueColumn); + validateTableAndColumns(validationErrorsToDisplay, sqlExternalSystemConnectionName, attributeTableName, attributeTableIdColumn, null); + + } + } + + } + + + private void validateTableAndColumns(Map validationErrorsToDisplay, GrouperConfigurationModuleAttribute sqlExternalSystemConnectionName, + GrouperConfigurationModuleAttribute tableName, GrouperConfigurationModuleAttribute column, GrouperConfigurationModuleAttribute columnNames) { GcTableSyncTableMetadata tableMetadata = null; try { tableMetadata = GcTableSyncTableMetadata.retrieveTableMetadataFromCacheOrDatabase(sqlExternalSystemConnectionName.getValueOrExpressionEvaluation(), - groupTableName.getValueOrExpressionEvaluation()); + tableName.getValueOrExpressionEvaluation()); } catch (Exception e) { String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithGroupTableConfigurationValidationGroupTableNotFound"); - errorMessage = errorMessage.replace("$$groupTableName$$", groupTableName.getValueOrExpressionEvaluation()); - validationErrorsToDisplay.put(groupTableName.getHtmlForElementIdHandle(), errorMessage); + errorMessage = errorMessage.replace("$$tableName$$", tableName.getValueOrExpressionEvaluation()); + validationErrorsToDisplay.put(tableName.getHtmlForElementIdHandle(), errorMessage); return; } if (tableMetadata == null) { String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithGroupTableConfigurationValidationGroupTableNotFound"); - errorMessage = errorMessage.replace("$$groupTableName$$", groupTableName.getValueOrExpressionEvaluation()); - validationErrorsToDisplay.put(groupTableName.getHtmlForElementIdHandle(), errorMessage); + errorMessage = errorMessage.replace("$$tableName$$", tableName.getValueOrExpressionEvaluation()); + validationErrorsToDisplay.put(tableName.getHtmlForElementIdHandle(), errorMessage); return; } - - String columnNamesCommaSeparated = columnNames.getValueOrExpressionEvaluation(); - Set colNamesSet = GrouperUtil.splitTrimToSet(columnNamesCommaSeparated.toLowerCase(), ","); - - String groupTableIdColumnValue = GrouperUtil.trim(groupTableIdColumn.getValueOrExpressionEvaluation()).toLowerCase(); - - List columnsMetadata = tableMetadata.getColumnMetadata(); - - boolean groupTableIdColumnFound = false; - - for (GcTableSyncColumnMetadata columnMetadata: GrouperUtil.nonNull(columnsMetadata)) { - String columnName = columnMetadata.getColumnName().toLowerCase(); - if (StringUtils.equals(columnName, groupTableIdColumnValue)) { - groupTableIdColumnFound = true; + if (columnNames != null && StringUtils.isNotBlank(columnNames.getValueOrExpressionEvaluation())) { + + String columnNamesCommaSeparated = columnNames.getValueOrExpressionEvaluation(); + Set colNamesSet = GrouperUtil.splitTrimToSet(columnNamesCommaSeparated.toLowerCase(), ","); + + List columnsMetadata = tableMetadata.getColumnMetadata(); + + for (GcTableSyncColumnMetadata columnMetadata: GrouperUtil.nonNull(columnsMetadata)) { + String columnName = columnMetadata.getColumnName().toLowerCase(); + + if (colNamesSet.contains(columnName)) { + colNamesSet.remove(columnName); + } } - if (colNamesSet.contains(columnName)) { - colNamesSet.remove(columnName); + + if (colNamesSet.size() > 0) { + String notFoundColNames = GrouperUtil.join(colNamesSet.iterator(), ','); + String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithGroupTableConfigurationValidationGroupIdColumnNotFound"); + errorMessage = errorMessage.replace("$$column$$", notFoundColNames); + validationErrorsToDisplay.put(columnNames.getHtmlForElementIdHandle(), errorMessage); } + } - if (!groupTableIdColumnFound) { - String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithGroupTableConfigurationValidationGroupIdColumnNotFound"); - errorMessage = errorMessage.replace("$$groupTableIdColumn$$", groupTableIdColumn.getValueOrExpressionEvaluation()); - validationErrorsToDisplay.put(groupTableIdColumn.getHtmlForElementIdHandle(), errorMessage); - } - - if (colNamesSet.size() > 0) { - String notFoundColNames = GrouperUtil.join(colNamesSet.iterator(), ','); - String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithGroupTableConfigurationValidationGroupColumnsNotFound"); - errorMessage = errorMessage.replace("$$groupTableColumns$$", notFoundColNames); - validationErrorsToDisplay.put(columnNames.getHtmlForElementIdHandle(), errorMessage); + if (column != null && StringUtils.isNotBlank(column.getValueOrExpressionEvaluation())) { + String groupTableIdColumnValue = GrouperUtil.trim(column.getValueOrExpressionEvaluation()).toLowerCase(); + boolean groupTableIdColumnFound = false; + + List columnsMetadata = tableMetadata.getColumnMetadata(); + + for (GcTableSyncColumnMetadata columnMetadata: GrouperUtil.nonNull(columnsMetadata)) { + String columnName = columnMetadata.getColumnName().toLowerCase(); + if (StringUtils.equals(columnName, groupTableIdColumnValue)) { + groupTableIdColumnFound = true; + break; + } + } + + if (!groupTableIdColumnFound) { + String errorMessage = GrouperTextContainer.textOrNull("grouperStartWithGroupTableConfigurationValidationGroupIdColumnNotFound"); + errorMessage = errorMessage.replace("$$column$$", column.getValueOrExpressionEvaluation()); + validationErrorsToDisplay.put(column.getHtmlForElementIdHandle(), errorMessage); + } + } + } @@ -111,19 +312,5 @@ public void validatePreSave(boolean isInsert, List errorsToDisplay, Map< public void populateProvisionerConfigurationValuesFromStartWith(Map startWithSuffixToValue, Map provisionerSuffixToValue) { - String columnNames = startWithSuffixToValue.get("columnNames"); - String[] colNames = GrouperUtil.splitTrim(columnNames, ","); - provisionerSuffixToValue.put("numberOfGroupAttributes", colNames.length); - - for (int i=0; i Date: Thu, 21 Apr 2022 08:25:12 -0700 Subject: [PATCH 011/125] GRP-3987: Bug fix: Delete attribute def names from attribute def screen --- .../serviceLogic/UiV2AttributeDef.java | 2 +- .../serviceLogic/UiV2AttributeDefName.java | 41 ++----------------- 2 files changed, 5 insertions(+), 38 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDef.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDef.java index c53731368dd7..98f7a8156777 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDef.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDef.java @@ -390,7 +390,7 @@ public void viewAttributeDef(HttpServletRequest request, HttpServletResponse res * @param request * @param response */ - private void filterHelper(HttpServletRequest request, HttpServletResponse response, AttributeDef attributeDef) { + public static void filterHelper(HttpServletRequest request, HttpServletResponse response, AttributeDef attributeDef) { GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDefName.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDefName.java index 10a2d0cf4d4c..a1039a1d56be 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDefName.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2AttributeDefName.java @@ -168,7 +168,7 @@ public void deleteAttributeDefName(HttpServletRequest request, HttpServletRespon * @param request * @param response */ - public void deleteAttributeDefNamesSubmit(HttpServletRequest request, HttpServletResponse response) { + public void deleteAttributeDefNames(HttpServletRequest request, HttpServletResponse response) { final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); @@ -236,6 +236,9 @@ public void deleteAttributeDefNamesSubmit(HttpServletRequest request, HttpServle GrouperRequestContainer.retrieveFromRequestOrCreate().getAttributeDefContainer().setSuccessCount(successes); GrouperRequestContainer.retrieveFromRequestOrCreate().getAttributeDefContainer().setFailureCount(failures); + UiV2AttributeDef.filterHelper(request, response, attributeDef); + //guiResponseJs.addAction(GuiScreenAction.newScript("guiV2link('operation=UiV2AttributeDef.viewAttributeDef&attributeDefId=" + attributeDef.getId() + "')")); + if (failures > 0) { guiResponseJs.addAction(GuiScreenAction.newMessage(GuiMessageType.error, TextContainer.retrieveFromRequest().getText().get("attributeDefDeleteAttributeDefNamesErrors"))); @@ -244,9 +247,6 @@ public void deleteAttributeDefNamesSubmit(HttpServletRequest request, HttpServle TextContainer.retrieveFromRequest().getText().get("attributeDefDeleteAttributeDefNamesSuccesses"))); } - - //filterHelper(request, response, attributeDef); - GrouperUserDataApi.recentlyUsedAttributeDefAdd(GrouperUiUserData.grouperUiGroupNameForUserData(), loggedInSubject, attributeDef); @@ -1805,39 +1805,6 @@ public void removeFromMyFavorites(HttpServletRequest request, HttpServletRespons } - /** - * delete an attribute def name (show confirm screen) - * @param request - * @param response - */ - public void deleteAttributeDefNames(HttpServletRequest request, HttpServletResponse response) { - - final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); - - GrouperSession grouperSession = null; - - try { - - grouperSession = GrouperSession.start(loggedInSubject); - - AttributeDefName attributeDefName = null; - - attributeDefName = retrieveAttributeDefNameHelper(request, AttributeDefPrivilege.ATTR_ADMIN, true).getAttributeDefName(); - - if (attributeDefName == null) { - return; - } - - GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); - - guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#grouperMainContentDivId", - "/WEB-INF/grouperUi2/attributeDefName/attributeDefNamesDelete.jsp")); - - } finally { - GrouperSession.stopQuietly(grouperSession); - } - } - /** * show attribute def name inheritance screen * @param request From 46707f22f957fc8095977129237ec5a39563f167 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Fri, 22 Apr 2022 15:08:16 -0400 Subject: [PATCH 012/125] GRP-3990: colons in basic auth passwords with WS LDAP doesnt work --- .../WsGrouperKerberosAuthentication.java | 34 ++-------------- .../security/WsGrouperLdapAuthentication.java | 40 ++----------------- .../grouper/j2ee/Authentication.java | 31 ++++++++++++++ 3 files changed, 37 insertions(+), 68 deletions(-) diff --git a/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperKerberosAuthentication.java b/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperKerberosAuthentication.java index 5404265fdddc..37a5cf316bd1 100644 --- a/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperKerberosAuthentication.java +++ b/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperKerberosAuthentication.java @@ -35,6 +35,7 @@ import org.apache.commons.logging.LogFactory; import edu.internet2.middleware.grouper.cache.GrouperCache; +import edu.internet2.middleware.grouper.j2ee.Authentication; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouper.ws.GrouperWsConfig; import edu.internet2.middleware.grouper.ws.util.GrouperServiceUtils; @@ -82,15 +83,6 @@ public static void main(String[] args) throws Exception { /** logger */ private static final Log LOG = LogFactory.getLog(WsGrouperKerberosAuthentication.class); - /** - * this should be something like: Basic QWxhZGRabcdefGVuIHNlc2FtZQ== - * ^\\s*Basic\\s+([^\\s]+)$ - * "^\\s* Start of string and optional whitespace - * Basic\\s+ Must be basic auth, and have some whitespace after this - * ([^\\s]+)$ Capture the next non-whitespace string, then end of input - */ - private static Pattern regexPattern = Pattern.compile("^\\s*Basic\\s+([^\\s]+)$"); - /** * cache the logins in a hash cache */ @@ -122,28 +114,8 @@ public String retrieveLoggedInSubjectId(HttpServletRequest httpServletRequest) } LOG.debug("Login not in cache"); - Matcher matcher = regexPattern.matcher(authHeader); - String authHeaderBase64Part = null; - if (matcher.matches()) { - authHeaderBase64Part = matcher.group(1); - } - - //either not basic or something else wrong - if (StringUtils.isBlank(authHeaderBase64Part)) { - //dont log password - LOG.error("Cant find base64 part in auth header"); - return null; - } - - //unencrypt this - byte[] base64Bytes = authHeaderBase64Part.getBytes(); - byte[] unencodedBytes = Base64.decodeBase64(base64Bytes); - - String unencodedString = new String(unencodedBytes); - - //split based on user/pass - String user = GrouperUtil.prefixOrSuffix(unencodedString, ":", true); - String pass = GrouperUtil.prefixOrSuffix(unencodedString, ":", false); + String user = Authentication.retrieveUsername(authHeader); + String pass = Authentication.retrievePassword(authHeader); if (authenticateKerberos(user, pass)) { diff --git a/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperLdapAuthentication.java b/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperLdapAuthentication.java index e2d01fd4603a..5d01fe79a8b7 100644 --- a/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperLdapAuthentication.java +++ b/grouper-ws/grouper-ws/src/grouper-ws/edu/internet2/middleware/grouper/ws/security/WsGrouperLdapAuthentication.java @@ -23,12 +23,9 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; -import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.commons.logging.Log; @@ -36,6 +33,7 @@ import org.ldaptive.SearchFilter; import edu.internet2.middleware.grouper.cache.GrouperCache; +import edu.internet2.middleware.grouper.j2ee.Authentication; import edu.internet2.middleware.grouper.ldap.LdapEntry; import edu.internet2.middleware.grouper.ldap.LdapSearchScope; import edu.internet2.middleware.grouper.ldap.LdapSessionUtils; @@ -69,15 +67,6 @@ public static void main(String[] args) throws Exception { /** logger */ private static final Log LOG = LogFactory.getLog(WsGrouperLdapAuthentication.class); - /** - * this should be something like: Basic QWxhZGRabcdefGVuIHNlc2FtZQ== - * ^\\s*Basic\\s+([^\\s]+)$ - * "^\\s* Start of string and optional whitespace - * Basic\\s+ Must be basic auth, and have some whitespace after this - * ([^\\s]+)$ Capture the next non-whitespace string, then end of input - */ - private static Pattern regexPattern = Pattern.compile("^\\s*Basic\\s+([^\\s]+)$"); - /** * cache the logins in a hash cache */ @@ -132,36 +121,13 @@ public String retrieveLoggedInSubjectId(HttpServletRequest httpServletRequest) } } - Matcher matcher = regexPattern.matcher(authHeader); - String authHeaderBase64Part = null; - if (matcher.matches()) { - authHeaderBase64Part = matcher.group(1); - } - - //either not basic or something else wrong - if (StringUtils.isBlank(authHeaderBase64Part)) { - //dont log password - if (LOG.isDebugEnabled()) { - debugMap.put("Cant find base64 part in auth header", true); - } - LOG.error("Cant find base64 part in auth header"); - return null; - } - - //unencrypt this - byte[] base64Bytes = authHeaderBase64Part.getBytes(); - byte[] unencodedBytes = Base64.decodeBase64(base64Bytes); - - String unencodedString = new String(unencodedBytes); - //split based on user/pass - String user = GrouperUtil.prefixOrSuffix(unencodedString, ":", true); - String pass = GrouperUtil.prefixOrSuffix(unencodedString, ":", false); + String user = Authentication.retrieveUsername(authHeader); + String pass = Authentication.retrievePassword(authHeader); if (LOG.isDebugEnabled()) { debugMap.put("user", user); } - if (authenticateLdap(user, pass)) { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/Authentication.java b/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/Authentication.java index aa851d6299b4..3036a0b5657a 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/Authentication.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/j2ee/Authentication.java @@ -134,6 +134,37 @@ public static final String retrieveUsername(final String authHeader) { return null; } + public static final String retrievePassword(final String authHeader) { + + if (StringUtils.isBlank(authHeader)) { + return null; + } + + try { + StringTokenizer st = new StringTokenizer(authHeader); + + if (st.hasMoreTokens()) { + String basic = st.nextToken(); + if (basic.equalsIgnoreCase("Basic")) { + + String credentials = new String(Base64.getDecoder().decode(st.nextToken()), "UTF-8"); + int p = colonIndexOf(credentials); + if (p != -1) { + String password = credentials.substring(p + 1).trim(); + password = unescapeColons(password); + return password; + } + + } + + } + } catch (Exception e) { + LOG.error("Error retrieving username from authHeader"); + return null; + } + return null; + } + /** * system enum, user, and encrypted password */ From 55d89af870f53a58c7d6b44dcaa744883add0e07 Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Fri, 22 Apr 2022 12:56:11 -0700 Subject: [PATCH 013/125] Fix test --- .../sqlProvisioning/SqlProvisioningGroupTableStartWithTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningGroupTableStartWithTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningGroupTableStartWithTest.java index 5dbc3bb38390..afc70763d003 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningGroupTableStartWithTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningGroupTableStartWithTest.java @@ -14,7 +14,7 @@ public class SqlProvisioningGroupTableStartWithTest extends GrouperTest { * */ public void testPopulateProvisionerConfigurationValuesFromStartWith() { - SqlProvisioningGroupTableStartWith sqlProvisioningGroupTableStartWith = new SqlProvisioningGroupTableStartWith(); + SqlProvisioningStartWith sqlProvisioningGroupTableStartWith = new SqlProvisioningStartWith(); Map startWithSuffixToValue = new HashMap<>(); From c3e4ca2da4295b80848c9f03df6bc9c048550df2 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sat, 23 Apr 2022 11:59:18 -0400 Subject: [PATCH 014/125] provisioner screen doesnt work with no start with --- .../grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java index 4a4c3ec28290..cebd4381bcb2 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java @@ -809,7 +809,7 @@ public void addProvisionerConfiguration(final HttpServletRequest request, final String previousProvisionerStartWithClass = request.getParameter("previousProvisionerStartWithClass"); - boolean skipStartWith = false; + boolean skipStartWith = StringUtils.isBlank(provisionerStartWithClass); if (StringUtils.isNotBlank(provisionerStartWithClass) && StringUtils.equals(provisionerStartWithClass, "blank")) { skipStartWith = true; } From 58cdbe1f25f56c982ad669177ca00d998c61a4a4 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sat, 23 Apr 2022 12:12:40 -0400 Subject: [PATCH 015/125] fix quotes on documentation hide/show in provisioning --- .../grouperText/grouper.textNg.en.us.base.properties | 10 +++++----- .../app/config/GrouperConfigurationModuleBase.java | 4 ++-- .../config/GrouperConfigurationModuleSubSection.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index a8ca527bcced..2ad67b7a9e30 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13135,11 +13135,11 @@ startWithBlankConfiguration = Blank configuration config.SqlProvisioningGroupTableStartWith.startWithDescription = This is the description for group table start with config.SqlProvisioningGroupTableStartWith.startWithDocumentation = This is the documentation for group table start with -config.SqlProvisionerConfiguration.description = This is the description for Sql provisioner -config.SqlProvisionerConfiguration.documentation = This is the documentation for Sql provisioner +config.SqlProvisionerConfiguration.description = The Grouper SQL provisioner will provision group / entity / membership information to a SQL database. +config.SqlProvisionerConfiguration.documentation = The database can be of any type and must be defined as an external system. The table structure can consist of: a group table, a group attribute table, an entity table, and entity attribute table, and a membership table. -config.LdapGrouperExternalSystem.description = This is the description for Ldap external system -config.LdapGrouperExternalSystem.documentation = This is the documentation for Ldap external system +config.LdapGrouperExternalSystem.description = The Grouper LDAP provisioner will provision group / entity / membership information to an LDAP or AD. +config.LdapGrouperExternalSystem.documentation = The LDAP or AD must be defined as an external system. The memberships can be represented as attribute values of a group (groupAttributes), or attribute values of an LDAP user (entityAttributes). config.AzureProvisionerConfiguration.title = Azure config.AzureProvisionerConfiguration.description = This is the description for Azure provisioner @@ -13241,7 +13241,7 @@ grouperProvisioningMetadataDuoEmailDescription = Add an email address config.GenericConfiguration.subSection.entityAttributes.title = External entity attributes configuration config.GenericConfiguration.subSection.entityAttributes.description = If you are provisioning data items about users which need to be retrieved from a SQL or LDAP call. -config.GenericConfiguration.subSection.entityAttributes.documentation = This is the test documentation +config.GenericConfiguration.subSection.entityAttributes.documentation = When provisioning user (entity) data, the data might be built-in to Grouper (e.g. subject id, name, description, subject identifier), or need a subject link (retrieve arbitrary subject API attributes), or use this, make a SQL or LDAP call to get attributes about a user. Generally this is 'false' and will be removed in a future Grouper release as we transition to user data fields. config.GenericConfiguration.subSection.group.title = Group configuration config.GenericConfiguration.subSection.group.description = Configuration dealing with groups in the target config.GenericConfiguration.subSection.entity.title = Entity configuration diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java index f3780d5d7fda..3f87ecbef90a 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java @@ -1519,7 +1519,7 @@ public String getDocumentation() { if (StringUtils.isNotBlank(documentation)) { String id = GrouperUtil.uniqueId(); String documentationLink = GrouperTextContainer.textOrNull("provisioning.documentationLink"); - return "
"+documentationLink+"
"; + return "
"+documentationLink+"
"; } return ""; @@ -1548,7 +1548,7 @@ public String getStartWithDocumentation() { if (StringUtils.isNotBlank(documentation)) { String id = GrouperUtil.uniqueId(); String documentationLink = GrouperTextContainer.textOrNull("provisioning.documentationLink"); - return "
"+documentationLink+"
"; + return "
"+documentationLink+"
"; } return ""; diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleSubSection.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleSubSection.java index b4e6049bea48..2808343b717c 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleSubSection.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleSubSection.java @@ -118,7 +118,7 @@ public String getDocumentation() { if (StringUtils.isNotBlank(documentation)) { String id = GrouperUtil.uniqueId(); String documentationLink = GrouperTextContainer.textOrNull("provisioning.documentationLink"); - return ""+documentationLink+" "; + return ""+documentationLink+" "; } return documentation; From ad9112af2f2b3f82ac9005098c4fa2e39b8bc948 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sat, 23 Apr 2022 20:33:23 -0400 Subject: [PATCH 016/125] GRP-3999: provisioning: add advanced entity attribute configuration --- grouper/conf/grouper-loader.base.properties | 100 +++++++++++--------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 92a2302946d1..079d312d3ee5 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2626,7 +2626,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "boolean", order: 24000, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (updateGroups == null || updateGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.update = -# Show membership attribute validation +# Show group attribute validation # {valueType: "boolean", order: 25000, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAttributeValueSettings = @@ -2754,102 +2754,112 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", order: 61000, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.name = -# Value type -# {valueType: "string", order: 62000, defaultValue: "string", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetEntityAttribute", repeatCount: 20 } -# provisioner.genericProvisioner.targetEntityAttribute.$i$.valueType = +# Translate type +# {valueType: "string", order: 61100, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionType = -# Multi-valued attribute? -# {valueType: "boolean", order: 62200, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.multiValued = +# Translate from field +# {valueType: "string", order: 61200, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromGrouperProvisioningEntityField = + +# Translate from static values +# {valueType: "string", order: 61300, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromStaticValues = + +# Translate expression +# {valueType: "string", order: 61400, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpression = + +# Advanced options +# {valueType: "boolean", order: 61500, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.showAdvancedAttribute = # Show entity attribute crud -# {valueType: "boolean", order: 62800, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 62000, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeCrud = # Select attribute? -# {valueType: "boolean", order: 63000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && (selectEntities == null || selectEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 63000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && (selectEntities == null || selectEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.select = # Insert attribute? -# {valueType: "boolean", order: 64000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && makeChangesToEntities && (insertEntities == null || insertEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 64000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && makeChangesToEntities && (insertEntities == null || insertEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.insert = # Update attribute? -# {valueType: "boolean", order: 65000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && makeChangesToEntities && (updateEntities == null || updateEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 65000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && makeChangesToEntities && (updateEntities == null || updateEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.update = -# Ignore entity if this attribute matches any of these values (comma separated) -# {valueType: "string", order: 66000, multiple: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.ignoreIfMatchesValue = +# Show entity attribute validation +# {valueType: "boolean", order: 67100, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeValueSettings = -# Matching id attribute? -# {valueType: "boolean", order: 67000, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.matchingId = +# Value type +# {valueType: "string", order: 62000, defaultValue: "string", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetEntityAttribute", repeatCount: 20 } +# provisioner.genericProvisioner.targetEntityAttribute.$i$.valueType = + +# Multi-valued attribute? +# {valueType: "boolean", order: 62200, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.multiValued = # Default value if there is not a value -# {valueType: "string", order: 69000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 69000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.defaultValue = # Show entity attribute validation -# {valueType: "boolean", order: 69125, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 69125, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeValidation = +# Ignore entity if this attribute matches any of these values (comma separated) +# {valueType: "string", order: 66000, multiple: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.ignoreIfMatchesValue = + + # If a value is required to provision this entity -# {valueType: "boolean", order: 69250, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 69250, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.required = # Maximum length of this field to be valid for provisioning -# {valueType: "string", order: 69500, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 69500, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.maxlength = # Validate value with jexl to see if valid for provisioning -# {valueType: "string", order: 69750, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 69750, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.validExpression = # Search attribute? -# {valueType: "boolean", order: 70500, defaultValue: "false", showEl: "${operateOnGrouperEntities && selectEntities && numberOfEntityAttributes > $i$ && !targetEntityAttribute.$i$.multiValued && targetEntityAttribute.$i$.select}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 70500, defaultValue: "false", showEl: "${operateOnGrouperEntities && selectEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && !targetEntityAttribute.$i$.multiValued && targetEntityAttribute.$i$.select}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.searchAttribute = # Translate expression create only type -# {valueType: "string", order: 70650, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 70650, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionTypeCreateOnly = # Translate from field create only -# {valueType: "string", order: 70750, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 70750, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromGrouperProvisioningEntityFieldCreateOnly = # Translate from static values create only -# {valueType: "string", order: 70850, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 70850, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromStaticValuesCreateOnly = # Translate expression create only -# {valueType: "string", order: 72000, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 72000, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionCreateOnly = -# Translate type -# {valueType: "string", order: 72300, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionType = - -# Translate from field -# {valueType: "string", order: 72600, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromGrouperProvisioningEntityField = - -# Translate from static values -# {valueType: "string", order: 72800, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromStaticValues = - -# Translate expression -# {valueType: "string", order: 73000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.translateExpressionType == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpression = - # During the entity link, copy this attribute to the sync field -# {valueType: "string", order: 76000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateToMemberSyncField = # After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 76200, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76200, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateGrouperToMemberSyncField = +# Matching id attribute? +# {valueType: "boolean", order: 76300, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.matchingId = + + # subject sources to provision # {valueType: "string", required: true, order: 77000, multiple: true, formElement: "checkbox", checkboxValuesFromClass: "edu.internet2.middleware.grouper.SubjectFinder", subSection: "general2", showEl: "${operateOnGrouperEntities || operateOnGrouperMemberships}"} # provisioner.genericProvisioner.subjectSourcesToProvision = From aa9149d39c9646832f410b9c32429086adcff530 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sat, 23 Apr 2022 20:39:59 -0400 Subject: [PATCH 017/125] GRP-4000: provisioning entity attribute value settings --- grouper/conf/grouper-loader.base.properties | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 079d312d3ee5..ced72fb85665 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2795,25 +2795,25 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeValueSettings = # Value type -# {valueType: "string", order: 62000, defaultValue: "string", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetEntityAttribute", repeatCount: 20 } +# {valueType: "string", order: 67200, defaultValue: "string", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetEntityAttribute", repeatCount: 20 } # provisioner.genericProvisioner.targetEntityAttribute.$i$.valueType = # Multi-valued attribute? -# {valueType: "boolean", order: 62200, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 67300, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.multiValued = # Default value if there is not a value -# {valueType: "string", order: 69000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 67400, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.defaultValue = +# Ignore entity if this attribute matches any of these values (comma separated) +# {valueType: "string", order: 67500, multiple: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# provisioner.genericProvisioner.targetEntityAttribute.$i$.ignoreIfMatchesValue = + # Show entity attribute validation # {valueType: "boolean", order: 69125, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeValidation = -# Ignore entity if this attribute matches any of these values (comma separated) -# {valueType: "string", order: 66000, multiple: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.ignoreIfMatchesValue = - # If a value is required to provision this entity # {valueType: "boolean", order: 69250, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} From 63d307eaff794482a51bef64b5ffe30f9133165c Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 24 Apr 2022 17:41:43 -0400 Subject: [PATCH 018/125] GRP-4001: configure provisioning sql foreign keys in the membership2 section --- grouper/conf/grouper-loader.base.properties | 12 +++++------- .../grouper.textNg.en.us.base.properties | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index ced72fb85665..facf59b2028f 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -3204,7 +3204,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # Subsections to ignore for box provisioner # {valueType: "string"} -provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user +# provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # provisioner class # {valueType: "class", required: true, readOnly: true, order: 10} @@ -3325,16 +3325,14 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.subsections = group,user # {valueType: "string", order: 5606, subSection: "membership", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects'}"} # provisioner.someSqlProvisioner.membershipPrimaryKey = -# column from group table which is the foreign key in membership table. Include schema name if necessary. -# {valueType: "string", required: false, order: 5610, subSection: "membership", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }"} +# column from membership table which is the foreign key to the group table +# {valueType: "string", required: false, order: 78050, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} # provisioner.someSqlProvisioner.membershipGroupForeignKeyColumn = - -# column from entity/user table which is the foreign key in membership table. Include schema name if necessary. -# {valueType: "string", required: false, order: 5620, subSection: "membership", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }"} +# column from membership table which is the foreign key to the entity table +# {valueType: "string", required: false, order: 78050, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} # provisioner.someSqlProvisioner.membershipEntityForeignKeyColumn = - # if this is more complicated than just a simple select, put the query here optional, select * from memberships where ... # {valueType: "string", order: 5630, subSection: "membership", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects'}"} # provisioner.someSqlProvisioner.membershipSearchQuery = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 2ad67b7a9e30..51146b2d3ca7 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13244,31 +13244,41 @@ config.GenericConfiguration.subSection.entityAttributes.description = If you are config.GenericConfiguration.subSection.entityAttributes.documentation = When provisioning user (entity) data, the data might be built-in to Grouper (e.g. subject id, name, description, subject identifier), or need a subject link (retrieve arbitrary subject API attributes), or use this, make a SQL or LDAP call to get attributes about a user. Generally this is 'false' and will be removed in a future Grouper release as we transition to user data fields. config.GenericConfiguration.subSection.group.title = Group configuration config.GenericConfiguration.subSection.group.description = Configuration dealing with groups in the target +config.GenericConfiguration.subSection.group.documentation = A group consists of attributes and a collection of entities. Grouper provisions groups in the format that the target uses to represent them. config.GenericConfiguration.subSection.entity.title = Entity configuration config.GenericConfiguration.subSection.entity.description = Configuration dealing with entities in the target +config.GenericConfiguration.subSection.entity.documentation = An entity is a subject or a user. Entities can be in groups as memberships. Grouper provisions entities in the format that the target uses to represent them. By default Grouper assumes another provisioning system is provisioning entities and uses them readonly, but Grouper can insert/update/delete entities if needed. config.GenericConfiguration.subSection.membership.title = Membership configuration config.GenericConfiguration.subSection.membership.description = Configuration dealing with memberships in the target +config.GenericConfiguration.subSection.membership.documentation = Group provisions the effective relationship of an entity in a group in the form of memberships. Grouper will provision memberships is the format that the target uses to represent memberships. config.GenericConfiguration.subSection.assigningProvisioning.title = Assigning provisioning config.GenericConfiguration.subSection.assigningProvisioning.description = Settings regarding how objects are marked provisionable +config.GenericConfiguration.subSection.assigningProvisioning.documentation = You can configure how users assign objects to be provisionable in grouper, who can assign, view, etc. config.GenericConfiguration.subSection.provisioningDiagnostics.title = Provisioning diagnostics -config.GenericConfiguration.subSection.provisioningDiagnostics.description = Provisioning diagnostics +config.GenericConfiguration.subSection.provisioningDiagnostics.description = Check to see if your provisioner is configured correctly +config.GenericConfiguration.subSection.provisioningDiagnostics.documentation = Run the diagnostics for insights into how the translations and target operations are functioning to make sure the provisioner is working how you want it to work. config.GenericConfiguration.subSection.advanced.title = Advanced -config.GenericConfiguration.subSection.advanced.description = Advanced +config.GenericConfiguration.subSection.advanced.description = Less common settings +config.GenericConfiguration.subSection.advanced.documentation = Configure logging and other settings config.GenericConfiguration.subSection.general2.title = General configuration section 2 config.GenericConfiguration.subSection.general2.description = Provisioning configuration after attributes configured for memberships / groups / entities +config.GenericConfiguration.subSection.general2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those config.GenericConfiguration.subSection.group2.title = Group configuration section 2 config.GenericConfiguration.subSection.group2.description = Group configuration after attributes configured for memberships / groups / entities +config.GenericConfiguration.subSection.group2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those config.GenericConfiguration.attribute.group2advanced.label = Advanced options config.GenericConfiguration.attribute.group2advanced.description = Advanced options for group section 2 config.GenericConfiguration.subSection.membership2.title = Membership configuration section 2 config.GenericConfiguration.subSection.membership2.description = Membership configuration after attributes configured for memberships / groups / entities +config.GenericConfiguration.subSection.membership2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those config.GenericConfiguration.subSection.entity2.title = Entity configuration section 2 config.GenericConfiguration.subSection.entity2.description = Entity configuration after attributes configured for memberships / groups / entities +config.GenericConfiguration.subSection.entity2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those config.GenericConfiguration.subSection.targetGroupAttribute.i.title = Target __i+1__ config.GenericConfiguration.subSection.targetGroupAttribute.i.description = Configuration for the group field / attribute @@ -14273,7 +14283,9 @@ config.SqlProvisionerConfiguration.attribute.insertEntities.label = Insert entit config.SqlProvisionerConfiguration.attribute.membershipPrimaryKey.label = Membership primary key config.SqlProvisionerConfiguration.attribute.membershipGroupForeignKeyColumn.label = Membership group foreign key +config.SqlProvisionerConfiguration.attribute.membershipGroupForeignKeyColumn.description = Column from membership table which is the foreign key to the group table config.SqlProvisionerConfiguration.attribute.membershipEntityForeignKeyColumn.label = Membership entity foreign key +config.SqlProvisionerConfiguration.attribute.membershipEntityForeignKeyColumn.description = Column from membership table which is the foreign key to the entity table config.SqlProvisionerConfiguration.attribute.groupTableName.label = Group table name config.SqlProvisionerConfiguration.attribute.groupTableName.description = Table name of the group table, could have a schema qualifier From ae3b8a71ad20da9fcbbf67f9059a3812ae55a229 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 24 Apr 2022 18:36:06 -0400 Subject: [PATCH 019/125] GRP-4002: provisioning add membership advanced sections and move sql search query there --- grouper/conf/grouper-loader.base.properties | 22 +++++++++++-------- .../grouper.textNg.en.us.base.properties | 3 +++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index facf59b2028f..de87fc0ee11b 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2440,9 +2440,13 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "boolean", order: 5600, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud && deleteMemberships && !deleteMembershipsIfNotExistInGrouper && !deleteMembershipsIfGrouperDeleted}"} # provisioner.genericProvisioner.deleteMembershipsIfGrouperCreated = +# Advanced options, note, there might not be any +# {valueType: "boolean", order: 5625, defaultValue: "false", subSection: "membership", showEl: "${operateOnGrouperMemberships}"} +# provisioner.genericProvisioner.membershipAdvancedOptions = + # number of attributes for memberships -# {valueType: "integer", order: 5650, subSection: "membership", defaultValue: "0", showEl:"${operateOnGrouperMemberships && provisioningType == 'membershipObjects'}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5700, subSection: "membership", defaultValue: "0", showEl:"${operateOnGrouperMemberships && provisioningType == 'membershipObjects'}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.genericProvisioner.numberOfMembershipAttributes = # Name of the attribute @@ -3223,7 +3227,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myBoxProvisioner.memberViewabilityLevel = # number of attributes for memberships -# {valueType: "integer", order: 5601, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5701, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.myBoxProvisioner.numberOfMembershipAttributes = ######################################## @@ -3244,7 +3248,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myLdapProvisioner.provisioningType = # number of attributes for memberships -# {valueType: "integer", order: 5601, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5701, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.myLdapProvisioner.numberOfMembershipAttributes = # where users are @@ -3334,7 +3338,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.membershipEntityForeignKeyColumn = # if this is more complicated than just a simple select, put the query here optional, select * from memberships where ... -# {valueType: "string", order: 5630, subSection: "membership", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects'}"} +# {valueType: "string", order: 5630, subSection: "membership", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' && membershipAdvancedOptions}"} # provisioner.someSqlProvisioner.membershipSearchQuery = # groups table to query to lookup users required if hasTargetEntityLink @@ -3450,7 +3454,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myScimProvisioner.updateGroups = false # number of attributes for memberships -# {valueType: "integer", order: 5601, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5701, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.myScimProvisioner.numberOfMembershipAttributes = # Name of the attribute @@ -3788,7 +3792,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myAzureProvisioner.provisioningType = # number of attributes for memberships -# {valueType: "integer", order: 5601, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5701, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.myAzureProvisioner.numberOfMembershipAttributes = # Name of the attribute @@ -3837,7 +3841,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myDuoProvisioner.duoExternalSystemConfigId = # number of attributes for memberships -# {valueType: "integer", order: 5601, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5701, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.myDuoProvisioner.numberOfMembershipAttributes = # Name of the attribute @@ -3865,7 +3869,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myDuoRoleProvisioner.duoExternalSystemConfigId = # number of attributes for memberships -# {valueType: "integer", order: 5601, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5701, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.myDuoRoleProvisioner.numberOfMembershipAttributes = # Insert groups @@ -3950,7 +3954,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myMessagingProvisioner.deleteMembershipsIfNotExistInGrouper = # number of attributes for memberships -# {valueType: "integer", order: 5601, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 5701, subSection: "membership", defaultValue: "0", showEl:"${false}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.myMessagingProvisioner.numberOfMembershipAttributes = # Select groups diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 51146b2d3ca7..df3bf8139a15 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13312,6 +13312,9 @@ config.GenericConfiguration.attribute.deleteMembershipsIfGrouperCreated.descript config.GenericConfiguration.attribute.operateOnGrouperGroups.label = Operate on groups config.GenericConfiguration.attribute.operateOnGrouperGroups.description = If the provisioner involves group objects. This might not be true if you are provisioning memberships or entityAttributes without a target group link. +config.GenericConfiguration.attribute.membershipAdvancedOptions.label = Advanced options +config.GenericConfiguration.attribute.membershipAdvancedOptions.description = Advanced membership options, note, there might not be any + config.GenericConfiguration.attribute.customizeGroupCrud.label = Customize group CRUD config.GenericConfiguration.attribute.customizeGroupCrud.description = Customize Create/Read/Update/Delete characteristics of groups. By default groups will SELECT / INSERT / UPDATE / DELETE_IF_GROUPER_CREATED_THEN_DELETED From 2a63f94b671bf539be04d2546b401c0367ff09ec Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Sun, 24 Apr 2022 08:19:43 -0700 Subject: [PATCH 020/125] Add group assign to view for provisioning --- .../api/GuiMembershipSubjectContainer.java | 71 ++++++ .../beans/ui/ProvisioningContainer.java | 225 +++++++++++++++--- .../grouperUi/beans/ui/StemContainer.java | 29 +++ .../serviceLogic/UiV2Provisioning.java | 107 +++------ .../grouperUi2/group/groupContents.jsp | 3 +- .../group/groupMoreActionsButtonContents.jsp | 4 +- ...sioningFolderMoreActionsButtonContents.jsp | 2 +- ...oupMembershipMoreActionsButtonContents.jsp | 2 +- ...isioningGroupMoreActionsButtonContents.jsp | 2 +- ...ovisioningGroupProvisionersTableHelper.jsp | 5 +- ...ectMembershipMoreActionsButtonContents.jsp | 2 +- ...ioningSubjectMoreActionsButtonContents.jsp | 2 +- .../stem/stemMoreActionsButtonContents2.jsp | 6 +- .../grouperUi2/subject/subjectContents.jsp | 6 +- .../subjectMoreActionsButtonContents.jsp | 2 +- grouper/conf/grouper-loader.base.properties | 4 + .../grouper.textNg.en.us.base.properties | 1 + .../GrouperProvisioningService.java | 123 ++++++++-- .../GrouperProvisioningSettings.java | 2 + .../GrouperProvisioningTarget.java | 21 ++ 20 files changed, 474 insertions(+), 145 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiMembershipSubjectContainer.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiMembershipSubjectContainer.java index d30416e75803..c15c7382267f 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiMembershipSubjectContainer.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiMembershipSubjectContainer.java @@ -12,15 +12,29 @@ import org.apache.commons.lang.StringUtils; +import edu.internet2.middleware.grouper.GrouperSession; +import edu.internet2.middleware.grouper.Member; +import edu.internet2.middleware.grouper.MemberFinder; import edu.internet2.middleware.grouper.Membership; +import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningAttributeValue; +import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningService; +import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningSettings; +import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningTarget; +import edu.internet2.middleware.grouper.exception.GrouperSessionException; +import edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperRequestContainer; import edu.internet2.middleware.grouper.grouperUi.beans.ui.TextContainer; import edu.internet2.middleware.grouper.membership.MembershipResult; import edu.internet2.middleware.grouper.membership.MembershipSubjectContainer; +import edu.internet2.middleware.grouper.misc.GrouperObject; +import edu.internet2.middleware.grouper.misc.GrouperSessionHandler; import edu.internet2.middleware.grouper.privs.AccessPrivilege; import edu.internet2.middleware.grouper.privs.AttributeDefPrivilege; import edu.internet2.middleware.grouper.privs.NamingPrivilege; import edu.internet2.middleware.grouper.privs.Privilege; +import edu.internet2.middleware.grouper.privs.PrivilegeHelper; +import edu.internet2.middleware.grouper.ui.GrouperUiFilter; import edu.internet2.middleware.grouper.util.GrouperUtil; +import edu.internet2.middleware.subject.Subject; /** @@ -291,4 +305,61 @@ public Map> getAllGuiMemberships() { public void setAllGuiMemberships(Map> allGuiMemberships) { this.allGuiMemberships = allGuiMemberships; } + + public boolean isCanReadProvisioningForMembership() { + + Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); + + if (PrivilegeHelper.isWheelOrRootOrViewonlyRoot(loggedInSubject)) { + return true; + } + + if (guiGroup != null && guiMember != null) { +// if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().isCanRead()) { +// return false; +// } +// +// Member member = (Member)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { +// +// @Override +// public Object callback(GrouperSession theGrouperSession) throws GrouperSessionException { +// return MemberFinder.findBySubject(theGrouperSession, loggedInSubject, true); +// +// } +// }); +// + List provisioningAttributeValues = GrouperProvisioningService.getProvisioningAttributeValues(guiGroup.getGroup(), guiMember.getMember()); + + boolean canViewProvisioningMenu = canViewProvisioningMenu(provisioningAttributeValues, loggedInSubject, null); + if (canViewProvisioningMenu) { + return true; + } + + return false; + } + + return false; + + } + + private boolean canViewProvisioningMenu(List provisioningAttributeValues, Subject loggedInSubject, GrouperObject grouperObject) { + + Map targets = GrouperProvisioningSettings.getTargets(true); + + // out of all the provisioners that have been configured on this group/stem/subject/membership, if one of them is viewable by the logged in user + // we need to show the Provisioning option in the menu item + + for(GrouperProvisioningAttributeValue provisioningAttributeValue: provisioningAttributeValues) { + + String localTargetName = provisioningAttributeValue.getTargetName(); + GrouperProvisioningTarget provisioningTarget = targets.get(localTargetName); + if (provisioningTarget != null && GrouperProvisioningService.isTargetViewable(provisioningTarget, loggedInSubject, grouperObject)) { + return true; + } + + } + + return false; + } + } diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisioningContainer.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisioningContainer.java index af007a2000df..32748b0f1737 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisioningContainer.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisioningContainer.java @@ -12,18 +12,28 @@ import org.apache.commons.lang3.StringUtils; +import edu.internet2.middleware.grouper.GrouperSession; +import edu.internet2.middleware.grouper.Member; +import edu.internet2.middleware.grouper.MemberFinder; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioner; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningAttributeValue; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningObjectMetadataItem; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningService; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningSettings; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningTarget; +import edu.internet2.middleware.grouper.exception.GrouperSessionException; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiGroup; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiStem; +import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiSubject; import edu.internet2.middleware.grouper.grouperUi.beans.api.provisioning.GuiGrouperProvisioningAttributeValue; import edu.internet2.middleware.grouper.grouperUi.beans.api.provisioning.GuiGrouperSyncObject; import edu.internet2.middleware.grouper.grouperUi.beans.json.GuiPaging; +import edu.internet2.middleware.grouper.grouperUi.serviceLogic.UiV2Group; +import edu.internet2.middleware.grouper.grouperUi.serviceLogic.UiV2Stem; import edu.internet2.middleware.grouper.misc.GrouperObject; +import edu.internet2.middleware.grouper.misc.GrouperSessionHandler; +import edu.internet2.middleware.grouper.privs.AccessPrivilege; +import edu.internet2.middleware.grouper.privs.NamingPrivilege; import edu.internet2.middleware.grouper.privs.PrivilegeHelper; import edu.internet2.middleware.grouper.ui.GrouperUiFilter; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncGroup; @@ -214,52 +224,163 @@ public List getGuiGrouperProvisioningAttri public void setGuiGrouperProvisioningAttributeValues(List guiGrouperProvisioningAttributeValues) { this.guiGrouperProvisioningAttributeValues = guiGrouperProvisioningAttributeValues; } + + private boolean canViewProvisioningMenu(List provisioningAttributeValues, Subject loggedInSubject, GrouperObject grouperObject) { - /** - * - * @return true if can read - */ - public boolean isCanReadProvisioning() { + Map targets = GrouperProvisioningSettings.getTargets(true); + + // out of all the provisioners that have been configured on this group/stem/subject/membership, if one of them is viewable by the logged in user + // we need to show the Provisioning option in the menu item + + for(GrouperProvisioningAttributeValue provisioningAttributeValue: provisioningAttributeValues) { + + String localTargetName = provisioningAttributeValue.getTargetName(); + GrouperProvisioningTarget provisioningTarget = targets.get(localTargetName); + if (provisioningTarget != null && GrouperProvisioningService.isTargetViewable(provisioningTarget, loggedInSubject, grouperObject)) { + return true; + } + + } + + return false; + } + + + public boolean isCanReadProvisioningForMembership() { Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); - if (PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { + + if (PrivilegeHelper.isWheelOrRootOrViewonlyRoot(loggedInSubject)) { return true; } + + GuiGroup guiGroup = GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().getGuiGroup(); + GuiSubject guiSubject = GrouperRequestContainer.retrieveFromRequestOrCreate().getSubjectContainer().getGuiSubject(); -// Boolean allowedInProvisioningGroup = null; -// if (!StringUtils.isBlank(GrouperUiConfig.retrieveConfig().propertyValueString("uiV2.provisioning.must.be.in.group"))) { -// String error = GrouperUiFilter.requireUiGroup("uiV2.provisioning.must.be.in.group", loggedInSubject, false); -// //null error means allow -// allowedInProvisioningGroup = ( error == null ); -// } -// -// GuiGroup guiGroup = GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().getGuiGroup(); -// -// if (guiGroup != null) { -// if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().isCanRead()) { -// return false; -// } -// if (allowedInProvisioningGroup != null) { -// return allowedInProvisioningGroup; -// } -// return true; -// } -// -// GuiStem guiStem = GrouperRequestContainer.retrieveFromRequestOrCreate().getStemContainer().getGuiStem(); -// -// if (guiStem != null) { -// if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getStemContainer().isCanAdminPrivileges()) { -// return false; -// } -// if (allowedInProvisioningGroup != null) { -// return allowedInProvisioningGroup; -// } -// return true; -// } + if (guiGroup != null && guiSubject != null) { + if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().isCanRead()) { + return false; + } + + Member member = (Member)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { + + @Override + public Object callback(GrouperSession theGrouperSession) throws GrouperSessionException { + return MemberFinder.findBySubject(theGrouperSession, guiSubject.getSubject(), true); + + } + }); + + List provisioningAttributeValues = GrouperProvisioningService.getProvisioningAttributeValues(guiGroup.getGroup(), member); + + boolean canViewProvisioningMenu = canViewProvisioningMenu(provisioningAttributeValues, loggedInSubject, null); + if (canViewProvisioningMenu) { + return true; + } + + return false; + } return false; + } + public boolean isCanReadProvisioningForGroup() { + + Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); + + if (PrivilegeHelper.isWheelOrRootOrViewonlyRoot(loggedInSubject)) { + return true; + } + + GuiGroup guiGroup = GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().getGuiGroup(); + + if (guiGroup != null) { + if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().isCanView()) { + return false; + } + + List provisioningAttributeValues = GrouperProvisioningService.getProvisioningAttributeValues(guiGroup.getGroup()); + boolean canViewProvisioningMenu = canViewProvisioningMenu(provisioningAttributeValues, loggedInSubject, null); + if (canViewProvisioningMenu) { + return true; + } + + return false; + } + + return false; + + } + + public boolean isCanReadProvisioningForSubject() { + + Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); + + if (PrivilegeHelper.isWheelOrRootOrViewonlyRoot(loggedInSubject)) { + return true; + } + + GuiSubject guiSubject = GrouperRequestContainer.retrieveFromRequestOrCreate().getSubjectContainer().getGuiSubject(); + + if (guiSubject != null) { + + Member member = (Member)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { + + @Override + public Object callback(GrouperSession theGrouperSession) throws GrouperSessionException { + + return MemberFinder.findBySubject(theGrouperSession, guiSubject.getSubject(), true); + + } + }); + + if (member != null) { + List provisioningAttributeValues = GrouperProvisioningService.getProvisioningAttributeValues(member); + boolean canViewProvisioningMenu = canViewProvisioningMenu(provisioningAttributeValues, loggedInSubject, null); + + if (canViewProvisioningMenu) { + return true; + } + } + + + return false; + } + + return false; + + } + + public boolean isCanReadProvisioningForStem() { + + Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); + + if (PrivilegeHelper.isWheelOrRootOrViewonlyRoot(loggedInSubject)) { + return true; + } + + GuiStem guiStem = GrouperRequestContainer.retrieveFromRequestOrCreate().getStemContainer().getGuiStem(); + + if (guiStem != null) { + + if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getStemContainer().isCanViewPrivileges()) { + return false; + } + + List provisioningAttributeValues = GrouperProvisioningService.getProvisioningAttributeValues(guiStem.getStem()); + boolean canViewProvisioningMenu = canViewProvisioningMenu(provisioningAttributeValues, loggedInSubject, guiStem.getStem()); + if (canViewProvisioningMenu) { + return true; + } + + return false; + } + + return false; + + } + /** * * @return true if can write @@ -381,6 +502,38 @@ public Set getEditableTargets() { return editableTargets; } + /** + * get viewable targets for current group/stem and logged in subject + * @return + */ + public Set getViewableTargets() { + + GrouperObject grouperObject = null; + + GuiGroup guiGroup = GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().getGuiGroup(); + GuiStem guiStem = GrouperRequestContainer.retrieveFromRequestOrCreate().getStemContainer().getGuiStem(); + + if (guiGroup != null) { + grouperObject = guiGroup.getGrouperObject(); + } + if (guiStem != null) { + grouperObject = guiStem.getGrouperObject(); + } + + Map targets = GrouperProvisioningSettings.getTargets(true); + Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); + + Set viewableTargets = new HashSet(); + + for (GrouperProvisioningTarget target: targets.values()) { + if (GrouperProvisioningService.isTargetViewable(target, loggedInSubject, grouperObject)) { + viewableTargets.add(target); + } + } + + return viewableTargets; + } + /** * number of groups in a folder for a provisioner target * @return diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/StemContainer.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/StemContainer.java index 54c5b04b96f9..031edb7d7f8b 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/StemContainer.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/StemContainer.java @@ -278,6 +278,11 @@ public Object callback(GrouperSession grouperSession) throws GrouperSessionExcep */ private Boolean canAdminPrivileges; + /** + * if the logged in user can view privileges, lazy loaded + */ + private Boolean canViewPrivileges; + /** * if the logged in user can read attributes, lazy loaded * @return if can read attributes @@ -351,6 +356,30 @@ public Object callback(GrouperSession grouperSession) throws GrouperSessionExcep return this.canAdminPrivileges; } + + /** + * if the logged in user can view privileges, lazy loaded + * @return if can view privileges + */ + public boolean isCanViewPrivileges() { + + if (this.canViewPrivileges == null) { + + final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); + + this.canViewPrivileges = (Boolean)GrouperSession.callbackGrouperSession( + GrouperSession.staticGrouperSession().internal_getRootSession(), new GrouperSessionHandler() { + + @Override + public Object callback(GrouperSession grouperSession) throws GrouperSessionException { + return StemContainer.this.getGuiStem().getStem().canHavePrivilege(loggedInSubject, NamingPrivilege.STEM_VIEW.getName(), false); + } + }); + + } + + return this.canViewPrivileges; + } /** * subjects and what privs they have on this stem diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Provisioning.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Provisioning.java index 255c4f24557d..eabe5a61deff 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Provisioning.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Provisioning.java @@ -91,18 +91,20 @@ public void viewProvisioningOnFolder(final HttpServletRequest request, final Htt grouperSession = GrouperSession.start(loggedInSubject); - stem = UiV2Stem.retrieveStemHelper(request, true).getStem(); + stem = UiV2Stem.retrieveStemHelper(request, false).getStem(); if (stem == null) { return; } + + if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getStemContainer().isCanViewPrivileges()) { + return; + } + + final Stem STEM = stem; final GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); - - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } final ProvisioningContainer provisioningContainer = GrouperRequestContainer.retrieveFromRequestOrCreate().getProvisioningContainer(); @@ -243,10 +245,6 @@ public void viewProvisioningConfigurationOnGroup(final HttpServletRequest reques return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final Group GROUP = group; final GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); @@ -267,7 +265,7 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx return null; } - setGrouperProvisioningAttributeValues(GROUP, targetName); + setGrouperProvisioningAttributeValues(GROUP, targetName, loggedInSubject); GuiGroup guiGroup = GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().getGuiGroup(); addProvisioningBreadcrumbs(guiGroup, targetName, "viewProvisioningOnGroup", "groupId", GROUP.getId()); @@ -308,10 +306,6 @@ public void viewProvisioningOnGroup(final HttpServletRequest request, final Http return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final Group GROUP = group; final GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); @@ -326,7 +320,7 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx return null; } - setGrouperProvisioningAttributeValues(GROUP, null); + setGrouperProvisioningAttributeValues(GROUP, null, loggedInSubject); GuiGroup guiGroup = GrouperRequestContainer.retrieveFromRequestOrCreate().getGroupContainer().getGuiGroup(); addProvisioningBreadcrumbs(guiGroup, null, null, null, null); @@ -359,10 +353,6 @@ public void viewProvisioningOnSubject(final HttpServletRequest request, final Ht try { - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - grouperSession = GrouperSession.start(loggedInSubject); subject = UiV2Subject.retrieveSubjectHelper(request, true); @@ -473,10 +463,6 @@ public void viewProvisioningTargetDetailsOnSubject(final HttpServletRequest requ return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final String targetName = request.getParameter("provisioningTargetName"); if (StringUtils.isBlank(targetName)) { @@ -577,10 +563,6 @@ public void viewProvisioningTargetDetailsOnGroupMembership(final HttpServletRequ return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final Group GROUP = group; final String targetName = request.getParameter("provisioningTargetName"); @@ -690,10 +672,6 @@ public void viewProvisioningOnGroupMembership(final HttpServletRequest request, return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); final ProvisioningContainer provisioningContainer = GrouperRequestContainer.retrieveFromRequestOrCreate().getProvisioningContainer(); @@ -802,10 +780,6 @@ public void viewProvisioningTargetDetailsOnSubjectMembership(final HttpServletRe return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final String targetName = request.getParameter("provisioningTargetName"); if (StringUtils.isBlank(targetName)) { @@ -917,10 +891,6 @@ public void viewProvisioningOnSubjectMembership(final HttpServletRequest request return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final Group GROUP = group; final Subject SUBJECT = subject; @@ -1003,7 +973,7 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx } - private final void setGrouperProvisioningAttributeValues(Group group, String targetName) { + private final void setGrouperProvisioningAttributeValues(Group group, String targetName, Subject loggedInSubject) { List provisioningAttributeValues = new ArrayList(); @@ -1014,8 +984,23 @@ private final void setGrouperProvisioningAttributeValues(Group group, String tar provisioningAttributeValues.add(grouperProvisioningAttributeValue); } + + Map allTargets = GrouperProvisioningSettings.getTargets(true); + + List provisioningAttributeValuesViewable = new ArrayList(); + + for (GrouperProvisioningAttributeValue grouperProvisioningAttributeValue: provisioningAttributeValues) { + + String localTargetName = grouperProvisioningAttributeValue.getTargetName(); + GrouperProvisioningTarget grouperProvisioningTarget = allTargets.get(localTargetName); + if (grouperProvisioningTarget != null && GrouperProvisioningService.isTargetViewable(grouperProvisioningTarget, loggedInSubject, group)) { + provisioningAttributeValuesViewable.add(grouperProvisioningAttributeValue); + } + + } + // convert from raw to gui - List guiGrouperProvisioningAttributeValues = GuiGrouperProvisioningAttributeValue.convertFromGrouperProvisioningAttributeValues(provisioningAttributeValues); + List guiGrouperProvisioningAttributeValues = GuiGrouperProvisioningAttributeValue.convertFromGrouperProvisioningAttributeValues(provisioningAttributeValuesViewable); for (GuiGrouperProvisioningAttributeValue guiGrouperProvisioningAttributeValue: guiGrouperProvisioningAttributeValues) { String provisionerName = guiGrouperProvisioningAttributeValue.getGrouperProvisioningAttributeValue().getTargetName(); @@ -2679,14 +2664,14 @@ public void viewProvisioningTargetDetailsOnFolder(final HttpServletRequest reque grouperSession = GrouperSession.start(loggedInSubject); - stem = UiV2Stem.retrieveStemHelper(request, true).getStem(); + stem = UiV2Stem.retrieveStemHelper(request, false).getStem(); if (stem == null) { return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); + if (!GrouperRequestContainer.retrieveFromRequestOrCreate().getStemContainer().isCanViewPrivileges()) { + return; } final GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); @@ -2703,12 +2688,6 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx return false; } - if (!provisioningContainer.isCanWriteProvisioning()) { - guiResponseJs.addAction(GuiScreenAction.newMessage(GuiMessageType.error, - TextContainer.retrieveFromRequest().getText().get("provisioningNotAllowedToWriteStem"))); - return false; - } - return true; } }); @@ -2863,16 +2842,12 @@ public void viewProvisioningTargetLogsOnGroup(final HttpServletRequest request, grouperSession = GrouperSession.start(loggedInSubject); - group = UiV2Group.retrieveGroupHelper(request, AccessPrivilege.UPDATE).getGroup(); + group = UiV2Group.retrieveGroupHelper(request, AccessPrivilege.VIEW).getGroup(); if (group == null) { return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); final ProvisioningContainer provisioningContainer = GrouperRequestContainer.retrieveFromRequestOrCreate().getProvisioningContainer(); @@ -2887,12 +2862,6 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx return false; } - if (!provisioningContainer.isCanWriteProvisioning()) { - guiResponseJs.addAction(GuiScreenAction.newMessage(GuiMessageType.error, - TextContainer.retrieveFromRequest().getText().get("provisioningNotAllowedToWriteGroup"))); - return false; - } - return true; } }); @@ -2924,7 +2893,7 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx List gcGrouperSyncLogs = GrouperProvisioningService.retrieveGcGrouperSyncLogs(targetName, GROUP.getUuid(), queryOptions); provisioningContainer.setGcGrouperSyncLogs(gcGrouperSyncLogs); - setGrouperProvisioningAttributeValues(GROUP, targetName); + setGrouperProvisioningAttributeValues(GROUP, targetName, loggedInSubject); guiPaging.setTotalRecordCount(queryOptions.getQueryPaging().getTotalRecordCount()); return null; @@ -2971,16 +2940,12 @@ public void viewProvisioningTargetDetailsOnGroup(final HttpServletRequest reques grouperSession = GrouperSession.start(loggedInSubject); - group = UiV2Group.retrieveGroupHelper(request, AccessPrivilege.UPDATE).getGroup(); + group = UiV2Group.retrieveGroupHelper(request, AccessPrivilege.VIEW).getGroup(); if (group == null) { return; } - if (!PrivilegeHelper.isWheelOrRoot(loggedInSubject)) { - throw new RuntimeException("Cannot access provisioning."); - } - final GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); final ProvisioningContainer provisioningContainer = GrouperRequestContainer.retrieveFromRequestOrCreate().getProvisioningContainer(); @@ -2995,12 +2960,6 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx return false; } - if (!provisioningContainer.isCanWriteProvisioning()) { - guiResponseJs.addAction(GuiScreenAction.newMessage(GuiMessageType.error, - TextContainer.retrieveFromRequest().getText().get("provisioningNotAllowedToWriteGroup"))); - return false; - } - return true; } }); @@ -3029,7 +2988,7 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx provisioningContainer.setUsersCount(usersCount); provisioningContainer.setGcGrouperSyncGroup(gcGrouperSyncGroup); - setGrouperProvisioningAttributeValues(GROUP, targetName); + setGrouperProvisioningAttributeValues(GROUP, targetName, loggedInSubject); return null; diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp index 252cd9e28f2d..0b2c08e4c5dd 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp @@ -83,6 +83,7 @@
  • ${textContainer.text['groupViewMembershipAttributeAssignments'] }
  • - +
  • ${textContainer.text['provisioningMoreActionsMenuLabel'] }
  • diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupMoreActionsButtonContents.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupMoreActionsButtonContents.jsp index 590978dfd728..269fd1291ea2 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupMoreActionsButtonContents.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupMoreActionsButtonContents.jsp @@ -116,7 +116,7 @@ || grouperRequestContainer.deprovisioningContainer.canReadDeprovisioning || (grouperRequestContainer.groupContainer.canView && grouperRequestContainer.workflowContainer.canViewElectronicForm) || grouperRequestContainer.grouperLoaderContainer.canSeeLoader - || grouperRequestContainer.provisioningContainer.canReadProvisioning + || grouperRequestContainer.provisioningContainer.canReadProvisioningForGroup || grouperRequestContainer.objectTypeContainer.canReadObjectType || grouperRequestContainer.grouperReportContainer.reportingEnabled }"> @@ -151,7 +151,7 @@ >${textContainer.text['groupViewPermissionsButton'] }
    - +
  • ${textContainer.text['provisioningMoreActionsMenuLabel'] }
  • diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningFolderMoreActionsButtonContents.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningFolderMoreActionsButtonContents.jsp index 79e335b898a4..b8360ae50b9e 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningFolderMoreActionsButtonContents.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningFolderMoreActionsButtonContents.jsp @@ -8,7 +8,7 @@
    diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/subject/subjectMoreActionsButtonContents.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/subject/subjectMoreActionsButtonContents.jsp index 8996222c6600..b5471e4c3733 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/subject/subjectMoreActionsButtonContents.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/subject/subjectMoreActionsButtonContents.jsp @@ -86,7 +86,7 @@
  • ${textContainer.text['visualization.title'] }
  • - +
  • ${textContainer.text['subjectViewProvisioningButton'] }
  • diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index de87fc0ee11b..038f3dbc5e9e 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2936,6 +2936,10 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", subSection: "assigningProvisioning", order: 86550, showEl: "${showAssigningProvisioning}"} # provisioner.genericProvisioner.groupAllowedToAssign = +# Group allowed to view +# {valueType: "string", subSection: "assigningProvisioning", order: 86560, showEl: "${showAssigningProvisioning}"} +# provisioner.genericProvisioner.groupAllowedToView = + # Allow assignment only on one stem # {valueType: "boolean", subSection: "assigningProvisioning", defaultValue: "false", order: 86600, showEl: "${showAssigningProvisioning}"} # provisioner.genericProvisioner.allowAssignmentsOnlyOnOneStem = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index df3bf8139a15..ff04b543da27 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13369,6 +13369,7 @@ config.GenericConfiguration.attribute.logCommandsAlways.description = Log the lo config.GenericConfiguration.attribute.logCommandsOnError.label = Log target commands on error config.GenericConfiguration.attribute.logCommandsOnError.description = Log the low level commands to the target for errors. This should only be enabled while troubleshooting. This has performance implications even for non error transactions. config.GenericConfiguration.attribute.groupAllowedToAssign.label = Group allowed to assign +config.GenericConfiguration.attribute.groupAllowedToView.label = Group allowed to view config.GenericConfiguration.attribute.allowAssignmentsOnlyOnOneStem.label = Allow assignments only on one stem config.GenericConfiguration.attribute.readOnly.label = Read only config.GenericConfiguration.attribute.readOnly.description = Run this provisioner in read only mode meaning no changes will be made to the target. The "log all objects verbose" will show what the provisioner would have done. diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java index 1b8bd8b9e7e2..b2fad2253b0a 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java @@ -9,6 +9,7 @@ import static edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningAttributeNames.retrieveAttributeDefNameBase; import static edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningSettings.provisioningConfigStemName; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -62,6 +63,10 @@ public class GrouperProvisioningService { + + private static final ExpirableCache> viewableGroupToSubject = new ExpirableCache>(5); + private static final ExpirableCache> editableGroupToSubject = new ExpirableCache>(5); + /** * find all groups provisionable in target @@ -387,6 +392,7 @@ public static GrouperProvisioningAttributeValue getProvisioningAttributeValue(Gr GrouperProvisioner provisioner = GrouperProvisioner.retrieveProvisioner(targetName); provisioner.retrieveGrouperProvisioningConfiguration().configureProvisionableSettings(); + GrouperProvisioningObjectAttributes grouperProvisioningObjectAttributes; String parentStemId; @@ -824,12 +830,6 @@ public static boolean saveOrUpdateProvisioningAttributes(GrouperProvisioningAttr */ public static boolean isTargetEditable(GrouperProvisioningTarget target, Subject subject, GrouperObject grouperObject) { - boolean readOnly = target.isReadOnly(); - - if(readOnly) { - return false; - } - boolean isEditable = true; if (grouperObject != null) { @@ -843,6 +843,22 @@ public static boolean isTargetEditable(GrouperProvisioningTarget target, Subject return isEditable && isTargetEditableBySubject(target, subject); } + /** + * is given target viewable for given subject and grouper object + * @param target + * @param subject + * @param grouperObject + * @return + */ + public static boolean isTargetViewable(GrouperProvisioningTarget target, Subject subject, GrouperObject grouperObject) { + + if (isTargetEditable(target, subject, grouperObject)) { + return true; + } + + return isTargetViewableBySubject(target, subject); + } + /** * delete all the attribute assigns where the config doesn't exist */ @@ -1528,28 +1544,95 @@ private static boolean isTargetEditableBySubject(GrouperProvisioningTarget targe return PrivilegeHelper.isWheelOrRoot(subject); // only grouper system admin is allowed when no specific group is allowed to assign the given target } - Group group = GroupFinder.findByName(GrouperSession.staticGrouperSession(), groupAllowedToAssign, false); - if (group == null) { - try { // try looking up group by id - Long groupId = Long.valueOf(groupAllowedToAssign); - group = GroupFinder.findByIdIndexSecure(groupId, false, new QueryOptions()); + Set cachedSubjects = editableGroupToSubject.get(groupAllowedToAssign); + if (cachedSubjects != null && cachedSubjects.contains(subject)) { + return true; + } + + Boolean isMember = (Boolean)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { + + @Override + public Object callback(GrouperSession grouperSession) + throws GrouperSessionException { + + + Group group = GroupFinder.findByName(grouperSession, groupAllowedToAssign, false); if (group == null) { - throw new RuntimeException(groupAllowedToAssign+" is not a valid group id or group name"); + group = GroupFinder.findByUuid(grouperSession, groupAllowedToAssign, false); + if (group == null) { + throw new RuntimeException(groupAllowedToAssign+" is not a valid group id or group name"); + } } - } catch (NumberFormatException e) { - throw new RuntimeException(groupAllowedToAssign+" is not a valid group id or group name"); + + return group.hasMember(subject); + } - + + }); + + if (isMember) { + if (cachedSubjects == null) { + cachedSubjects = new HashSet<>(); + } + cachedSubjects.add(subject); + editableGroupToSubject.put(groupAllowedToAssign, cachedSubjects); + } + + return isMember; + + } + + /** + * can the given subject view the given target + * @param target + * @param subject + * @return + */ + private static boolean isTargetViewableBySubject(GrouperProvisioningTarget target, Subject subject) { + + if (PrivilegeHelper.isWheelOrRootOrViewonlyRoot(subject)) { + return true; + } + + String groupAllowedToView = target.getGroupAllowedToView(); + if (StringUtils.isBlank(groupAllowedToView)) { + return false; + } + + Set cachedSubjects = viewableGroupToSubject.get(groupAllowedToView); + if (cachedSubjects != null && cachedSubjects.contains(subject)) { + return true; } - for (Member member: group.getMembers()) { - Subject groupSubject = member.getSubject(); - if (subject.getId().equals(groupSubject.getId())) { - return true; + Boolean isMember = (Boolean)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { + + @Override + public Object callback(GrouperSession grouperSession) + throws GrouperSessionException { + + Group group = GroupFinder.findByName(grouperSession, groupAllowedToView, false); + if (group == null) { + group = GroupFinder.findByUuid(grouperSession, groupAllowedToView, false); + if (group == null) { + throw new RuntimeException(groupAllowedToView+" is not a valid group id or group name"); + } + } + + return group.hasMember(subject); + + } + + }); + + if (isMember) { + if (cachedSubjects == null) { + cachedSubjects = new HashSet<>(); } + cachedSubjects.add(subject); + viewableGroupToSubject.put(groupAllowedToView, cachedSubjects); } - return false; + return isMember; } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningSettings.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningSettings.java index 822cb59b56f6..8a77a49cfde2 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningSettings.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningSettings.java @@ -57,11 +57,13 @@ private static Map populateTargets() { String name = matcher.group(1); String groupAllowedToAssign = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner."+name+".groupAllowedToAssign", null); + String groupAllowedToView = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner."+name+".groupAllowedToView", null); boolean allowAssignmentsOnlyOnOneStem = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner."+name+".allowAssignmentsOnlyOnOneStem", false); boolean readOnly = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner."+name+".readOnly", false); GrouperProvisioningTarget target = new GrouperProvisioningTarget(name, name); target.setGroupAllowedToAssign(groupAllowedToAssign); + target.setGroupAllowedToView(groupAllowedToView); target.setAllowAssignmentsOnlyOnOneStem(allowAssignmentsOnlyOnOneStem); target.setReadOnly(readOnly); result.put(name, target); diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTarget.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTarget.java index ddf5805faf5b..4410df3ba590 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTarget.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTarget.java @@ -19,6 +19,11 @@ public class GrouperProvisioningTarget { */ private String groupAllowedToAssign; + /** + * group whose members are allowed to view this target + */ + private String groupAllowedToView; + /** * should the target be assignable to only one stem */ @@ -91,6 +96,22 @@ public void setGroupAllowedToAssign(String groupAllowedToAssign) { public String getGroupAllowedToAssign() { return groupAllowedToAssign; } + + /** + * group whose members are allowed to view this target + * @return + */ + public String getGroupAllowedToView() { + return groupAllowedToView; + } + + /** + * group whose members are allowed to view this target + * @param groupAllowedToView + */ + public void setGroupAllowedToView(String groupAllowedToView) { + this.groupAllowedToView = groupAllowedToView; + } /** * should the target be assignable to only one stem From c095454f47aaad9eca505ebf009895c73ff3c78e Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Sun, 24 Apr 2022 15:18:59 -0700 Subject: [PATCH 021/125] Use group subject as multikey in group allowed to view/assign cache --- .../GrouperProvisioningService.java | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java index b2fad2253b0a..98bc02c503bb 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningService.java @@ -9,7 +9,6 @@ import static edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningAttributeNames.retrieveAttributeDefNameBase; import static edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningSettings.provisioningConfigStemName; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -49,6 +48,7 @@ import edu.internet2.middleware.grouper.misc.GrouperSessionHandler; import edu.internet2.middleware.grouper.privs.PrivilegeHelper; import edu.internet2.middleware.grouper.util.GrouperUtil; +import edu.internet2.middleware.grouperClient.collections.MultiKey; import edu.internet2.middleware.grouperClient.jdbc.GcDbAccess; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSync; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncDao; @@ -64,8 +64,8 @@ public class GrouperProvisioningService { - private static final ExpirableCache> viewableGroupToSubject = new ExpirableCache>(5); - private static final ExpirableCache> editableGroupToSubject = new ExpirableCache>(5); + private static final ExpirableCache viewableGroupToSubject = new ExpirableCache(5); + private static final ExpirableCache editableGroupToSubject = new ExpirableCache(5); /** @@ -1544,9 +1544,11 @@ private static boolean isTargetEditableBySubject(GrouperProvisioningTarget targe return PrivilegeHelper.isWheelOrRoot(subject); // only grouper system admin is allowed when no specific group is allowed to assign the given target } - Set cachedSubjects = editableGroupToSubject.get(groupAllowedToAssign); - if (cachedSubjects != null && cachedSubjects.contains(subject)) { - return true; + MultiKey multiKey = new MultiKey(groupAllowedToAssign, subject.getId()); + + Boolean isEditable = viewableGroupToSubject.get(multiKey); + if (isEditable != null) { + return isEditable; } Boolean isMember = (Boolean)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { @@ -1570,13 +1572,7 @@ public Object callback(GrouperSession grouperSession) }); - if (isMember) { - if (cachedSubjects == null) { - cachedSubjects = new HashSet<>(); - } - cachedSubjects.add(subject); - editableGroupToSubject.put(groupAllowedToAssign, cachedSubjects); - } + editableGroupToSubject.put(multiKey, isMember); return isMember; @@ -1595,13 +1591,16 @@ private static boolean isTargetViewableBySubject(GrouperProvisioningTarget targe } String groupAllowedToView = target.getGroupAllowedToView(); + if (StringUtils.isBlank(groupAllowedToView)) { return false; } - Set cachedSubjects = viewableGroupToSubject.get(groupAllowedToView); - if (cachedSubjects != null && cachedSubjects.contains(subject)) { - return true; + MultiKey multiKey = new MultiKey(groupAllowedToView, subject.getId()); + + Boolean isViewable = viewableGroupToSubject.get(multiKey); + if (isViewable != null) { + return isViewable; } Boolean isMember = (Boolean)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { @@ -1624,13 +1623,7 @@ public Object callback(GrouperSession grouperSession) }); - if (isMember) { - if (cachedSubjects == null) { - cachedSubjects = new HashSet<>(); - } - cachedSubjects.add(subject); - viewableGroupToSubject.put(groupAllowedToView, cachedSubjects); - } + viewableGroupToSubject.put(multiKey, isMember); return isMember; From cacbf43e7a0e02e1239b844fd263e779e55734f1 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Mon, 25 Apr 2022 09:12:06 -0400 Subject: [PATCH 022/125] GRP-4004: provisioning sql membership primary key config move to membership2 and drop down --- grouper/conf/grouper-loader.base.properties | 8 ++++++-- .../conf/grouperText/grouper.textNg.en.us.base.properties | 4 ++++ .../app/sqlProvisioning/SqlProvisioningConfiguration.java | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 038f3dbc5e9e..c7d86c4e2b3f 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2868,6 +2868,10 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", required: true, order: 77000, multiple: true, formElement: "checkbox", checkboxValuesFromClass: "edu.internet2.middleware.grouper.SubjectFinder", subSection: "general2", showEl: "${operateOnGrouperEntities || operateOnGrouperMemberships}"} # provisioner.genericProvisioner.subjectSourcesToProvision = +# Advanced options, note, there might not be any +# {valueType: "boolean", order: 78500, defaultValue: "false", subSection: "membership2", showEl: "${operateOnGrouperMemberships}"} +# provisioner.genericProvisioner.membership2AdvancedOptions = + # membership attribute name for groups # {valueType: "string", required: true, order: 79200, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupMembershipAttributeName = @@ -3330,7 +3334,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.membershipTableName = # memberships table primary key column(s) of membership table -# {valueType: "string", order: 5606, subSection: "membership", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects'}"} +# {valueType: "string", order: 78510, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' && membership2AdvancedOptions}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} # provisioner.someSqlProvisioner.membershipPrimaryKey = # column from membership table which is the foreign key to the group table @@ -3338,7 +3342,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.membershipGroupForeignKeyColumn = # column from membership table which is the foreign key to the entity table -# {valueType: "string", required: false, order: 78050, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} +# {valueType: "string", required: false, order: 78051, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} # provisioner.someSqlProvisioner.membershipEntityForeignKeyColumn = # if this is more complicated than just a simple select, put the query here optional, select * from memberships where ... diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index ff04b543da27..6ab4d87c51f2 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13315,6 +13315,9 @@ config.GenericConfiguration.attribute.operateOnGrouperGroups.description = If th config.GenericConfiguration.attribute.membershipAdvancedOptions.label = Advanced options config.GenericConfiguration.attribute.membershipAdvancedOptions.description = Advanced membership options, note, there might not be any +config.GenericConfiguration.attribute.membership2AdvancedOptions.label = Advanced options +config.GenericConfiguration.attribute.membership2AdvancedOptions.description = Advanced membership2 options, note, there might not be any + config.GenericConfiguration.attribute.customizeGroupCrud.label = Customize group CRUD config.GenericConfiguration.attribute.customizeGroupCrud.description = Customize Create/Read/Update/Delete characteristics of groups. By default groups will SELECT / INSERT / UPDATE / DELETE_IF_GROUPER_CREATED_THEN_DELETED @@ -14286,6 +14289,7 @@ config.SqlProvisionerConfiguration.attribute.userSearchQuery.label = Entity sear config.SqlProvisionerConfiguration.attribute.insertEntities.label = Insert entities config.SqlProvisionerConfiguration.attribute.membershipPrimaryKey.label = Membership primary key +config.SqlProvisionerConfiguration.attribute.membershipPrimaryKey.description = Leave blank and the primary key will be the tuple of the group and entity foreign keys. Or select a column if it is a uuid or something. config.SqlProvisionerConfiguration.attribute.membershipGroupForeignKeyColumn.label = Membership group foreign key config.SqlProvisionerConfiguration.attribute.membershipGroupForeignKeyColumn.description = Column from membership table which is the foreign key to the group table config.SqlProvisionerConfiguration.attribute.membershipEntityForeignKeyColumn.label = Membership entity foreign key diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java index 435fb744a12e..5bdba5008baf 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java @@ -258,6 +258,7 @@ public void configureSpecificSettings() { this.entityAttributesLastModifiedColumn = this.retrieveConfigString("entityAttributesLastModifiedColumn", false); this.entityAttributesLastModifiedColumnType = this.retrieveConfigString("entityAttributesLastModifiedColumnType", false); + // TODO is this used???? this.membershipTableIdColumn = this.retrieveConfigString("membershipPrimaryKey", false); //setMembershipMatchingIdExpression("${new edu.internet2.middleware.grouperClient.collections.MultiKey(targetMembership.getProvisioningGroup().retrieveAttributeValueString('"+groupTableIdColumn+"'), targetMembership.getProvisioningEntity().retrieveAttributeValueString('"+entityTableIdColumn+"'))}"); From 5079a6bb54dcb1d17d99bd432f84eb2b159337ae Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Mon, 25 Apr 2022 14:58:18 -0400 Subject: [PATCH 023/125] GRP-4006: current buckets to be refactored from fromId2, toId2 to be AttributeValueCache0-3 --- .../jdbc/tableSync/GcGrouperSyncGroup.java | 100 ++++--- .../jdbc/tableSync/GcGrouperSyncMember.java | 112 +++---- .../provisioningConfigActivityGroup.jsp | 16 +- .../provisioningConfigActivityMember.jsp | 16 +- .../provisioningGroupTargetDetailsHelper.jsp | 24 +- ...provisioningSubjectTargetDetailsHelper.jsp | 24 +- grouper/conf/grouper-loader.base.properties | 64 ++-- .../grouper.textNg.en.us.base.properties | 95 +++--- .../grouper.textNg.fr.fr.base.properties | 92 +++--- .../GrouperProvisioningBehavior.java | 108 +++---- .../GrouperProvisioningConfiguration.java | 144 ++++----- ...erProvisioningConfigurationValidation.java | 18 +- .../GrouperProvisioningGrouperSyncDao.java | 60 ++-- .../GrouperProvisioningLinkLogic.java | 274 ++++++++--------- .../GrouperProvisioningTranslator.java | 32 +- .../middleware/grouper/app/usdu/UsduJob.java | 50 ++-- .../dao/hib3/Hib3GrouperSyncGroupDAO.hbm.xml | 8 +- .../dao/hib3/Hib3GrouperSyncMemberDAO.hbm.xml | 8 +- .../app/azure/AzureProvisionerTestUtils.java | 8 +- .../azure/GrouperAzureProvisionerTest.java | 2 +- .../app/duo/DuoProvisionerTestUtils.java | 4 +- .../app/duo/GrouperDuoProvisionerTest.java | 2 +- .../duo/role/DuoRoleProvisionerTestUtils.java | 4 +- .../google/GoogleProvisionerTestUtils.java | 6 +- .../google/GrouperGoogleProvisionerTest.java | 4 +- .../LdapProvisionerTestUtils.java | 12 +- .../SimpleLdapProvisionerTest.java | 68 ++--- ...rProvisioningAttributePropagationTest.java | 72 ++--- .../GrouperProvisioningLogicTest.java | 46 +-- .../GrouperProvisioningServiceTest.java | 6 +- .../ProvisionerConfigurationTest.java | 6 +- .../app/scim/GrouperScimProvisionerTest.java | 100 +++---- .../scim/ScimProvisionerTestConfigInput.java | 6 +- .../app/scim/ScimProvisionerTestUtils.java | 6 +- .../sqlProvisioning/SqlProvisionerTest.java | 18 +- .../SqlProvisionerTestUtils.java | 14 +- .../app/tableSync/ProvisioningToSyncTest.java | 32 +- .../app/upgradeTasks/UpgradeTasksJobTest.java | 6 +- .../app/usdu/UsduJobProvisionerSyncTest.java | 282 +++++++++--------- 39 files changed, 981 insertions(+), 968 deletions(-) diff --git a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncGroup.java b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncGroup.java index 7ba224ba5786..3c13a139b7e7 100644 --- a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncGroup.java +++ b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncGroup.java @@ -69,13 +69,13 @@ public GcGrouperSyncGroup clone() { gcGrouperSyncGroup.errorCodeDb = this.errorCodeDb; gcGrouperSyncGroup.errorMessage = this.errorMessage; gcGrouperSyncGroup.errorTimestamp = this.errorTimestamp; - gcGrouperSyncGroup.groupFromId2 = this.groupFromId2; - gcGrouperSyncGroup.groupFromId3 = this.groupFromId3; + gcGrouperSyncGroup.groupAttributeValueCache0 = this.groupAttributeValueCache0; + gcGrouperSyncGroup.groupAttributeValueCache1 = this.groupAttributeValueCache1; gcGrouperSyncGroup.groupId = this.groupId; gcGrouperSyncGroup.groupIdIndex = this.groupIdIndex; gcGrouperSyncGroup.groupName = this.groupName; - gcGrouperSyncGroup.groupToId2 = this.groupToId2; - gcGrouperSyncGroup.groupToId3 = this.groupToId3; + gcGrouperSyncGroup.groupAttributeValueCache2 = this.groupAttributeValueCache2; + gcGrouperSyncGroup.groupAttributeValueCache3 = this.groupAttributeValueCache3; //grouperSync DONT CLONE gcGrouperSyncGroup.grouperSyncId = this.grouperSyncId; @@ -129,13 +129,13 @@ public boolean equalsDeep(Object obj) { .append(this.errorMessage, other.errorMessage) .append(this.errorTimestamp, other.errorTimestamp) - .append(this.groupFromId2, other.groupFromId2) - .append(this.groupFromId3, other.groupFromId3) + .append(this.groupAttributeValueCache0, other.groupAttributeValueCache0) + .append(this.groupAttributeValueCache1, other.groupAttributeValueCache1) .append(this.groupId, other.groupId) .append(this.groupIdIndex, other.groupIdIndex) .append(this.groupName, other.groupName) - .append(this.groupToId2, other.groupToId2) - .append(this.groupToId3, other.groupToId3) + .append(this.groupAttributeValueCache2, other.groupAttributeValueCache2) + .append(this.groupAttributeValueCache3, other.groupAttributeValueCache3) //grouperSync DONT EQUALS .append(this.grouperSyncId, other.grouperSyncId) @@ -835,70 +835,74 @@ public void setGroupIdIndex(Long groupIdIndex1) { /** * metadata on groups */ - private String groupFromId2; + @GcPersistableField(columnName = "group_from_id2") + private String groupAttributeValueCache0; /** * metadata on groups * @return group from id 2 */ - public String getGroupFromId2() { - return this.groupFromId2; + public String getGroupAttributeValueCache0() { + return this.groupAttributeValueCache0; } /** * metadata on groups - * @param groupFromId2_1 + * @param groupAttributeValueCache0_1 */ - public void setGroupFromId2(String groupFromId2_1) { - this.groupFromId2 = groupFromId2_1; + public void setGroupAttributeValueCache0(String groupAttributeValueCache0_1) { + this.groupAttributeValueCache0 = groupAttributeValueCache0_1; } /** * other metadata on groups */ - private String groupFromId3; + @GcPersistableField(columnName = "group_from_id3") + private String groupAttributeValueCache1; /** * other metadata on groups * @return id3 */ - public String getGroupFromId3() { - return this.groupFromId3; + public String getGroupAttributeValueCache1() { + return this.groupAttributeValueCache1; } /** * other metadata on groups - * @param groupFromId3_1 + * @param groupAttributeValueCache1_1 */ - public void setGroupFromId3(String groupFromId3_1) { - this.groupFromId3 = groupFromId3_1; + public void setGroupAttributeValueCache1(String groupAttributeValueCache1_1) { + this.groupAttributeValueCache1 = groupAttributeValueCache1_1; } /** * other metadata on groups */ - private String groupToId2; + @GcPersistableField(columnName = "group_to_id2") + private String groupAttributeValueCache2; /** * other metadata on groups * @return metadata */ - public String getGroupToId2() { - return this.groupToId2; + public String getGroupAttributeValueCache2() { + return this.groupAttributeValueCache2; } /** * other metadata on groups - * @param groupToId2_1 + * @param groupAttributeValueCache2_1 */ - public void setGroupToId2(String groupToId2_1) { - this.groupToId2 = groupToId2_1; + public void setGroupAttributeValueCache2(String groupAttributeValueCache2_1) { + this.groupAttributeValueCache2 = groupAttributeValueCache2_1; } /** * other metadata on groups */ - private String groupToId3; + @GcPersistableField(columnName = "group_to_id3") + private String groupAttributeValueCache3; // /** // * T if inserted on the in_grouper_start date, or F if it existed then and not sure when inserted @@ -1030,16 +1034,16 @@ public void setGroupToId2(String groupToId2_1) { * other metadata on groups * @return group id */ - public String getGroupToId3() { - return this.groupToId3; + public String getGroupAttributeValueCache3() { + return this.groupAttributeValueCache3; } /** * other metadata on groups - * @param groupToId3_1 + * @param groupAttributeValueCache3_1 */ - public void setGroupToId3(String groupToId3_1) { - this.groupToId3 = groupToId3_1; + public void setGroupAttributeValueCache3(String groupAttributeValueCache3_1) { + this.groupAttributeValueCache3 = groupAttributeValueCache3_1; } /** @@ -1060,14 +1064,14 @@ public boolean gcSqlAssignNewPrimaryKeyForInsert() { * @param result */ public void assignField(String syncField, Object result) { - if (GrouperClientUtils.equals("groupFromId2", syncField)) { - this.setGroupFromId2(GrouperClientUtils.stringValue(result)); - } else if (GrouperClientUtils.equals("groupFromId3", syncField)) { - this.setGroupFromId3(GrouperClientUtils.stringValue(result)); - } else if (GrouperClientUtils.equals("groupToId2", syncField)) { - this.setGroupToId2(GrouperClientUtils.stringValue(result)); - } else if (GrouperClientUtils.equals("groupToId3", syncField)) { - this.setGroupToId3(GrouperClientUtils.stringValue(result)); + if (GrouperClientUtils.equals("groupAttributeValueCache0", syncField)) { + this.setGroupAttributeValueCache0(GrouperClientUtils.stringValue(result)); + } else if (GrouperClientUtils.equals("groupAttributeValueCache1", syncField)) { + this.setGroupAttributeValueCache1(GrouperClientUtils.stringValue(result)); + } else if (GrouperClientUtils.equals("groupAttributeValueCache2", syncField)) { + this.setGroupAttributeValueCache2(GrouperClientUtils.stringValue(result)); + } else if (GrouperClientUtils.equals("groupAttributeValueCache3", syncField)) { + this.setGroupAttributeValueCache3(GrouperClientUtils.stringValue(result)); } else { throw new RuntimeException("Not expecting groupSyncField: '" + syncField + "'"); } @@ -1080,14 +1084,14 @@ public void assignField(String syncField, Object result) { * @param result */ public String retrieveField(String syncField) { - if (GrouperClientUtils.equals("groupFromId2", syncField)) { - return this.getGroupFromId2(); - } else if (GrouperClientUtils.equals("groupFromId3", syncField)) { - return this.getGroupFromId3(); - } else if (GrouperClientUtils.equals("groupToId2", syncField)) { - return this.getGroupToId2(); - } else if (GrouperClientUtils.equals("groupToId3", syncField)) { - return this.getGroupToId3(); + if (GrouperClientUtils.equals("groupAttributeValueCache0", syncField)) { + return this.getGroupAttributeValueCache0(); + } else if (GrouperClientUtils.equals("groupAttributeValueCache1", syncField)) { + return this.getGroupAttributeValueCache1(); + } else if (GrouperClientUtils.equals("groupAttributeValueCache2", syncField)) { + return this.getGroupAttributeValueCache2(); + } else if (GrouperClientUtils.equals("groupAttributeValueCache3", syncField)) { + return this.getGroupAttributeValueCache3(); } else { throw new RuntimeException("Not expecting groupSyncField: '" + syncField + "'"); } diff --git a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncMember.java b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncMember.java index 20bbd463b954..01850d549438 100644 --- a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncMember.java +++ b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcGrouperSyncMember.java @@ -86,11 +86,11 @@ public GcGrouperSyncMember clone() { gcGrouperSyncMember.lastUserMetadataSync = this.lastUserMetadataSync; gcGrouperSyncMember.lastUserSyncStart = this.lastUserSyncStart; gcGrouperSyncMember.lastUserSync = this.lastUserSync; - gcGrouperSyncMember.memberFromId2 = this.memberFromId2; - gcGrouperSyncMember.memberFromId3 = this.memberFromId3; + gcGrouperSyncMember.entityAttributeValueCache0 = this.entityAttributeValueCache0; + gcGrouperSyncMember.entityAttributeValueCache1 = this.entityAttributeValueCache1; gcGrouperSyncMember.memberId = this.memberId; - gcGrouperSyncMember.memberToId2 = this.memberToId2; - gcGrouperSyncMember.memberToId3 = this.memberToId3; + gcGrouperSyncMember.entityAttributeValueCache2 = this.entityAttributeValueCache2; + gcGrouperSyncMember.entityAttributeValueCache3 = this.entityAttributeValueCache3; gcGrouperSyncMember.metadataUpdated = this.metadataUpdated; gcGrouperSyncMember.provisionableDb = this.provisionableDb; gcGrouperSyncMember.provisionableEnd = this.provisionableEnd; @@ -144,11 +144,11 @@ public boolean equalsDeep(Object obj) { .append(this.lastUserMetadataSyncStart, other.lastUserMetadataSyncStart) .append(this.lastUserSync, other.lastUserSync) .append(this.lastUserSyncStart, other.lastUserSyncStart) - .append(this.memberFromId2, other.memberFromId2) - .append(this.memberFromId3, other.memberFromId3) + .append(this.entityAttributeValueCache0, other.entityAttributeValueCache0) + .append(this.entityAttributeValueCache1, other.entityAttributeValueCache1) .append(this.memberId, other.memberId) - .append(this.memberToId2, other.memberToId2) - .append(this.memberToId3, other.memberToId3) + .append(this.entityAttributeValueCache2, other.entityAttributeValueCache2) + .append(this.entityAttributeValueCache3, other.entityAttributeValueCache3) .append(this.metadataUpdated, other.metadataUpdated) .append(this.provisionableDb, other.provisionableDb) .append(this.provisionableEnd, other.provisionableEnd) @@ -610,10 +610,10 @@ public static void main(String[] args) { gcGrouperSyncMember.sourceId = "sourceId"; gcGrouperSyncMember.subjectId = "subjectId"; gcGrouperSyncMember.subjectIdentifier = "subjectIdentifier"; - gcGrouperSyncMember.memberFromId2 = "from2"; - gcGrouperSyncMember.memberFromId3 = "from3"; - gcGrouperSyncMember.memberToId2 = "toId2"; - gcGrouperSyncMember.memberToId3 = "toId3"; + gcGrouperSyncMember.entityAttributeValueCache0 = "from2"; + gcGrouperSyncMember.entityAttributeValueCache1 = "from3"; + gcGrouperSyncMember.entityAttributeValueCache2 = "toId2"; + gcGrouperSyncMember.entityAttributeValueCache3 = "toId3"; gcGrouperSyncMember.inTargetDb = "T"; gcGrouperSyncMember.inTargetInsertOrExistsDb = "T"; gcGrouperSyncMember.inTargetEnd = new Timestamp(123L); @@ -629,7 +629,7 @@ public static void main(String[] args) { gcGrouperSyncMember = gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId("memId"); System.out.println(gcGrouperSyncMember); - gcGrouperSyncMember.setMemberToId2("from2a"); + gcGrouperSyncMember.setEntityAttributeValueCache2("from2a"); gcGrouperSync.getGcGrouperSyncMemberDao().internal_memberStore(gcGrouperSyncMember); System.out.println("updated"); @@ -957,74 +957,80 @@ public void setProvisionableStart(Timestamp provisionableStartMillis1) { /** * for users this is the group idIndex */ - private String memberFromId2; + @GcPersistableField(columnName = "member_from_id2") + private String entityAttributeValueCache0; /** * for users this is the group idIndex * @return group from id 2 */ - public String getMemberFromId2() { - return this.memberFromId2; + public String getEntityAttributeValueCache0() { + return this.entityAttributeValueCache0; } /** * for users this is the group idIndex - * @param groupFromId2_1 + * @param groupAttributeValueCache0_1 */ - public void setMemberFromId2(String groupFromId2_1) { - this.memberFromId2 = groupFromId2_1; + public void setEntityAttributeValueCache0(String groupAttributeValueCache0_1) { + this.entityAttributeValueCache0 = groupAttributeValueCache0_1; } /** * other metadata on users */ - private String memberFromId3; + @GcPersistableField(columnName = "member_from_id3") + private String entityAttributeValueCache1; /** * other metadata on users * @return id3 */ - public String getMemberFromId3() { - return this.memberFromId3; + public String getEntityAttributeValueCache1() { + return this.entityAttributeValueCache1; } /** * other metadata on users - * @param groupFromId3_1 + * @param groupAttributeValueCache1_1 */ - public void setMemberFromId3(String groupFromId3_1) { - this.memberFromId3 = groupFromId3_1; + public void setEntityAttributeValueCache1(String groupAttributeValueCache1_1) { + this.entityAttributeValueCache1 = groupAttributeValueCache1_1; } /** * other metadata on users */ - private String memberToId2; + @GcPersistableField(columnName = "member_to_id2") + private String entityAttributeValueCache2; /** * other metadata on users * @return metadata */ - public String getMemberToId2() { - return this.memberToId2; + public String getEntityAttributeValueCache2() { + return this.entityAttributeValueCache2; } /** * other metadata on users - * @param groupToId2_1 + * @param groupAttributeValueCache2_1 */ - public void setMemberToId2(String groupToId2_1) { - this.memberToId2 = groupToId2_1; + public void setEntityAttributeValueCache2(String groupAttributeValueCache2_1) { + this.entityAttributeValueCache2 = groupAttributeValueCache2_1; } /** * other metadata on users */ - private String memberToId3; + @GcPersistableField(columnName = "member_to_id3") + private String entityAttributeValueCache3; + /** * when this group was removed from target */ private Timestamp inTargetEnd; + /** * when this group was provisioned to target */ @@ -1034,16 +1040,16 @@ public void setMemberToId2(String groupToId2_1) { * other metadata on users * @return group id */ - public String getMemberToId3() { - return this.memberToId3; + public String getEntityAttributeValueCache3() { + return this.entityAttributeValueCache3; } /** * other metadata on users - * @param groupToId3_1 + * @param groupAttributeValueCache3_1 */ - public void setMemberToId3(String groupToId3_1) { - this.memberToId3 = groupToId3_1; + public void setEntityAttributeValueCache3(String groupAttributeValueCache3_1) { + this.entityAttributeValueCache3 = groupAttributeValueCache3_1; } /** @@ -1135,14 +1141,14 @@ public void setMetadataJson(String metadataJson) { * @param result */ public void assignField(String syncField, Object result) { - if (GrouperClientUtils.equals("memberFromId2", syncField)) { - this.setMemberFromId2(GrouperClientUtils.stringValue(result)); - } else if (GrouperClientUtils.equals("memberFromId3", syncField)) { - this.setMemberFromId3(GrouperClientUtils.stringValue(result)); - } else if (GrouperClientUtils.equals("memberToId2", syncField)) { - this.setMemberToId2(GrouperClientUtils.stringValue(result)); - } else if (GrouperClientUtils.equals("memberToId3", syncField)) { - this.setMemberToId3(GrouperClientUtils.stringValue(result)); + if (GrouperClientUtils.equals("entityAttributeValueCache0", syncField)) { + this.setEntityAttributeValueCache0(GrouperClientUtils.stringValue(result)); + } else if (GrouperClientUtils.equals("entityAttributeValueCache1", syncField)) { + this.setEntityAttributeValueCache1(GrouperClientUtils.stringValue(result)); + } else if (GrouperClientUtils.equals("entityAttributeValueCache2", syncField)) { + this.setEntityAttributeValueCache2(GrouperClientUtils.stringValue(result)); + } else if (GrouperClientUtils.equals("entityAttributeValueCache3", syncField)) { + this.setEntityAttributeValueCache3(GrouperClientUtils.stringValue(result)); } else { throw new RuntimeException("Not expecting groupSyncField: '" + syncField + "'"); } @@ -1155,14 +1161,14 @@ public void assignField(String syncField, Object result) { * @param result */ public String retrieveField(String syncField) { - if (GrouperClientUtils.equals("memberFromId2", syncField)) { - return this.getMemberFromId2(); - } else if (GrouperClientUtils.equals("memberFromId3", syncField)) { - return this.getMemberFromId3(); - } else if (GrouperClientUtils.equals("memberToId2", syncField)) { - return this.getMemberToId2(); - } else if (GrouperClientUtils.equals("memberToId3", syncField)) { - return this.getMemberToId3(); + if (GrouperClientUtils.equals("entityAttributeValueCache0", syncField)) { + return this.getEntityAttributeValueCache0(); + } else if (GrouperClientUtils.equals("entityAttributeValueCache1", syncField)) { + return this.getEntityAttributeValueCache1(); + } else if (GrouperClientUtils.equals("entityAttributeValueCache2", syncField)) { + return this.getEntityAttributeValueCache2(); + } else if (GrouperClientUtils.equals("entityAttributeValueCache3", syncField)) { + return this.getEntityAttributeValueCache3(); } else { throw new RuntimeException("Not expecting memberSyncField: '" + syncField + "'"); } diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityGroup.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityGroup.jsp index 8ab41c80d999..5a81eebb1874 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityGroup.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityGroup.jsp @@ -24,10 +24,10 @@ ${textContainer.text['provisionerActivityTableHeaderLastGroupSync']} ${textContainer.text['provisionerActivityTableHeaderLastGroupMetadataSyncStart']} ${textContainer.text['provisionerActivityTableHeaderLastGroupMetadataSync']} - ${textContainer.text['provisionerActivityTableHeaderGroupFromId2']} - ${textContainer.text['provisionerActivityTableHeaderGroupFromId3']} - ${textContainer.text['provisionerActivityTableHeaderGroupToId2']} - ${textContainer.text['provisionerActivityTableHeaderGroupToId3']} + ${textContainer.text['provisionerActivityTableHeaderGroupAttributeValueCache0']} + ${textContainer.text['provisionerActivityTableHeaderGroupAttributeValueCache1']} + ${textContainer.text['provisionerActivityTableHeaderGroupAttributeValueCache2']} + ${textContainer.text['provisionerActivityTableHeaderGroupAttributeValueCache3']} ${textContainer.text['provisionerActivityTableHeaderMetadataUpdated']} ${textContainer.text['provisionerActivityTableHeaderErrorMessage']} ${textContainer.text['provisionerActivityTableHeaderErrorTimestamp']} @@ -123,19 +123,19 @@ - ${grouperSyncGroup.groupFromId2} + ${grouperSyncGroup.groupAttributeValueCache0} - ${grouperSyncGroup.groupFromId3} + ${grouperSyncGroup.groupAttributeValueCache1} - ${grouperSyncGroup.groupToId2} + ${grouperSyncGroup.groupAttributeValueCache2} - ${grouperSyncGroup.groupToId3} + ${grouperSyncGroup.groupAttributeValueCache3} diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityMember.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityMember.jsp index 7c31273e35f3..8112694d5215 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityMember.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisioningConfigActivityMember.jsp @@ -25,10 +25,10 @@ ${textContainer.text['provisionerActivityTableHeaderLastUserSync']} ${textContainer.text['provisionerActivityTableHeaderLastUserMetadataSyncStart']} ${textContainer.text['provisionerActivityTableHeaderLastUserMetadataSync']} - ${textContainer.text['provisionerActivityTableHeaderMemberFromId2']} - ${textContainer.text['provisionerActivityTableHeaderMemberFromId3']} - ${textContainer.text['provisionerActivityTableHeaderMemberToId2']} - ${textContainer.text['provisionerActivityTableHeaderMemberToId3']} + ${textContainer.text['provisionerActivityTableHeaderEntityAttributeValueCache0']} + ${textContainer.text['provisionerActivityTableHeaderEntityAttributeValueCache1']} + ${textContainer.text['provisionerActivityTableHeaderEntityAttributeValueCache2']} + ${textContainer.text['provisionerActivityTableHeaderEntityAttributeValueCache3']} ${textContainer.text['provisionerActivityTableHeaderMetadataUpdated']} ${textContainer.text['provisionerActivityTableHeaderErrorMessage']} ${textContainer.text['provisionerActivityTableHeaderErrorTimestamp']} @@ -128,19 +128,19 @@ - ${grouperSyncMember.memberFromId2} + ${grouperSyncMember.entityAttributeValueCache0} - ${grouperSyncGroup.memberFromId3} + ${grouperSyncGroup.entityAttributeValueCache1} - ${grouperSyncMember.memberToId2} + ${grouperSyncMember.entityAttributeValueCache2} - ${grouperSyncMember.memberToId3} + ${grouperSyncMember.entityAttributeValueCache3} diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningGroupTargetDetailsHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningGroupTargetDetailsHelper.jsp index 85ecc413f1e4..9a94aef5d5e5 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningGroupTargetDetailsHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningGroupTargetDetailsHelper.jsp @@ -162,38 +162,38 @@ - ${textContainer.text['privsioningConfigDetailsGroupFromId2'] } + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache0'] } - ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupFromId2} + ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupAttributeValueCache0}
    - ${textContainer.text['privsioningConfigDetailsGroupFromId2Description']} + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache0Description']} - ${textContainer.text['privsioningConfigDetailsGroupFromId3'] } + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache1'] } - ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupFromId3} + ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupAttributeValueCache1}
    - ${textContainer.text['privsioningConfigDetailsGroupFromId3Description']} + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache1Description']} - ${textContainer.text['privsioningConfigDetailsGroupToId2'] } + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache2'] } - ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupToId2} + ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupAttributeValueCache2}
    - ${textContainer.text['privsioningConfigDetailsGroupToId2Description']} + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache2Description']} - ${textContainer.text['privsioningConfigDetailsGroupToId3'] } + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache3'] } - ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupToId3} + ${grouperRequestContainer.provisioningContainer.gcGrouperSyncGroup.groupAttributeValueCache3}
    - ${textContainer.text['privsioningConfigDetailsGroupToId3Description']} + ${textContainer.text['privsioningConfigDetailsGroupAttributeValueCache3Description']} diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningSubjectTargetDetailsHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningSubjectTargetDetailsHelper.jsp index cab6934cc83a..2dcbc78d308f 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningSubjectTargetDetailsHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisioning/provisioningSubjectTargetDetailsHelper.jsp @@ -162,38 +162,38 @@ - ${textContainer.text['privsioningConfigDetailsMemberFromId2'] } + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache0'] } - ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.memberFromId2} + ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.entityAttributeValueCache0}
    - ${textContainer.text['privsioningConfigDetailsMemberFromId2Description']} + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache0Description']} - ${textContainer.text['privsioningConfigDetailsMemberFromId3'] } + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache1'] } - ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.memberFromId3} + ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.entityAttributeValueCache1}
    - ${textContainer.text['privsioningConfigDetailsMemberFromId3Description']} + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache1Description']} - ${textContainer.text['privsioningConfigDetailsMemberToId2'] } + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache2'] } - ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.memberToId2} + ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.entityAttributeValueCache2}
    - ${textContainer.text['privsioningConfigDetailsMemberToId2Description']} + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache2Description']} - ${textContainer.text['privsioningConfigDetailsMemberToId3'] } + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache3'] } - ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.memberToId3} + ${grouperRequestContainer.provisioningContainer.guiGrouperSyncObject.gcGrouperSyncMember.entityAttributeValueCache3}
    - ${textContainer.text['privsioningConfigDetailsMemberToId3Description']} + ${textContainer.text['privsioningConfigDetailsEntityAttributeValueCache3Description']} diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index c7d86c4e2b3f..a15763b5290f 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2458,11 +2458,11 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateExpressionType = # Translate from field -# {valueType: "string", order: 5734, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupFromId2", "groupFromId3", "groupToId2", "groupToId3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 5734, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningGroupField = # Translate from field -# {valueType: "string", order: 5738, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "memberId", "memberFromId2", "memberFromId3", "memberToId2", "memberToId3", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 5738, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionType == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "memberId", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningEntityField = # Translate from static values @@ -2531,11 +2531,11 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly = # Translate from field create only -# {valueType: "string", order: 6200, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupFromId2", "groupFromId3", "groupToId2", "groupToId3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6200, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningGroupFieldCreateOnly = # Translate from field create only -# {valueType: "string", order: 6250, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "memberFromId2", "memberFromId3", "memberToId2", "memberToId3", "memberId", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6250, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "memberId", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningEntityFieldCreateOnly = # Translate from static values create only @@ -2691,11 +2691,11 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetGroupAttribute.$i$.matchingId = # During 'group link' copy this value from the target into the sync field -# {valueType: "string", order: 36200, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && hasTargetGroupLink}", formElement: "dropdown", optionValues: ["groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 36200, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && hasTargetGroupLink}", formElement: "dropdown", optionValues: ["groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateToGroupSyncField = # After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 36300, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["groupFromId2", "groupFromId3", "groupToId2", "groupToId3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 36300, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateGrouperToGroupSyncField = # Operate on grouper entities @@ -2852,11 +2852,11 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionCreateOnly = # During the entity link, copy this attribute to the sync field -# {valueType: "string", order: 76000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateToMemberSyncField = # After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 76200, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["memberFromId2", "memberFromId3", "memberToId2", "memberToId3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76200, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateGrouperToMemberSyncField = # Matching id attribute? @@ -3129,61 +3129,61 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "integer", defaultValue: 20, subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139500} # provisioner.genericProvisioner.refreshGroupLinkIfLessThanAmount = -# Target group link - groupFromId2 +# Target group link - groupAttributeValueCache0 # {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139600} -# provisioner.genericProvisioner.common.groupLink.groupFromId2 = +# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache0 = -# Target group link - groupFromId3 +# Target group link - groupAttributeValueCache1 # {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139700} -# provisioner.genericProvisioner.common.groupLink.groupFromId3 = +# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache1 = -# Target group link - groupToId2 +# Target group link - groupAttributeValueCache2 # {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139800} -# provisioner.genericProvisioner.common.groupLink.groupToId2 = +# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache2 = -# Target group link - groupToId3 +# Target group link - groupAttributeValueCache3 # {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139900} -# provisioner.genericProvisioner.common.groupLink.groupToId3 = +# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache3 = # refresh subject link if less than this amount # {valueType: "integer", defaultValue: 20, showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 140000, subSection: "advanced"} # provisioner.genericProvisioner.refreshSubjectLinkIfLessThanAmount = -# Subject link - memberFromId2 +# Subject link - entityAttributeValueCache0 # {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 141000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.memberFromId2 = +# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache0 = -# Subject link - memberFromId3 +# Subject link - entityAttributeValueCache1 # {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 142000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.memberFromId3 = +# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache1 = -# Subject link - memberToId2 +# Subject link - entityAttributeValueCache2 # {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 143000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.memberToId2 = +# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache2 = -# Subject link - memberToId3 +# Subject link - entityAttributeValueCache3 # {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 144000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.memberToId3 = +# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache3 = # refresh target user link if less than this amount # {valueType: "integer", defaultValue: 20, showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 145000, subSection: "advanced"} # provisioner.genericProvisioner.refreshEntityLinkIfLessThanAmount = -# Target user link - memberFromId2 +# Target user link - entityAttributeValueCache0 # {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 146000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.memberFromId2 = +# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache0 = -# Target user link - memberFromId3 +# Target user link - entityAttributeValueCache1 # {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 147000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.memberFromId3 = +# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache1 = -# Target user link - memberToId2 +# Target user link - entityAttributeValueCache2 # {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 148000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.memberToId2 = +# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache2 = -# Target user link - memberToId3 +# Target user link - entityAttributeValueCache3 # {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 149000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.memberToId3 = +# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache3 = # if provisioning normal memberships or privileges # {valueType: "string", order: 150000, formElement: "dropdown", subSection: "advanced", showEl: "${operateOnGrouperMemberships && showAdvanced}", defaultValue: "members", optionValues: ["members", "read, admin", "update, admin", "admin"]} diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 6ab4d87c51f2..ba30965265b8 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -8935,14 +8935,14 @@ privsioningConfigDetailsLastGroupMetadataSync = Last metadata sync time privsioningConfigDetailsLastGroupMetadataSyncStart = Last metadata sync start time privsioningConfigDetailsLastGroupMetadataSyncDescription = Last time when this group's name and description and metadata was synced (not including memberships) privsioningConfigDetailsLastGroupMetadataSyncStartDescription = Last time when this group's name and description and metadata was started to be synced (not including memberships) -privsioningConfigDetailsGroupFromId2 = Group from id2 -privsioningConfigDetailsGroupFromId2Description = Group from id2 -privsioningConfigDetailsGroupFromId3 = Group from id3 -privsioningConfigDetailsGroupFromId3Description = Group from id3 -privsioningConfigDetailsGroupToId2 = Group to id2 -privsioningConfigDetailsGroupToId2Description = Group to id2 -privsioningConfigDetailsGroupToId3 = Group to id3 -privsioningConfigDetailsGroupToId3Description = Group to id3 +privsioningConfigDetailsGroupAttributeValueCache0 = Group from id2 +privsioningConfigDetailsGroupAttributeValueCache0Description = Group from id2 +privsioningConfigDetailsGroupAttributeValueCache1 = Group from id3 +privsioningConfigDetailsGroupAttributeValueCache1Description = Group from id3 +privsioningConfigDetailsGroupAttributeValueCache2 = Group to id2 +privsioningConfigDetailsGroupAttributeValueCache2Description = Group to id2 +privsioningConfigDetailsGroupAttributeValueCache3 = Group to id3 +privsioningConfigDetailsGroupAttributeValueCache3Description = Group to id3 privsioningConfigDetailsMetadataUpdated = Sync link last updated privsioningConfigDetailsMetadataUpdatedDescription = If this object has a link data cached, this is the last time it was updated from the target privsioningConfigDetailsErrorMessage = Error message @@ -8995,14 +8995,14 @@ privsioningConfigDetailsMembershipId2 = Membership id2 privsioningConfigDetailsMembershipId2Description = Membership id2 privsioningConfigDetailsProvisionable = Provisionable -privsioningConfigDetailsMemberFromId2 = Member from id2 -privsioningConfigDetailsMemberFromId2Description = Member from id2 -privsioningConfigDetailsMemberFromId3 = Member from id3 -privsioningConfigDetailsMemberFromId3Description = Member from id3 -privsioningConfigDetailsMemberToId2 = Member to id2 -privsioningConfigDetailsMemberToId2Description = Member to id2 -privsioningConfigDetailsMemberToId3 = Member to id3 -privsioningConfigDetailsMemberToId3Description = Member to id3 +privsioningConfigDetailsEntityAttributeValueCache0 = Member from id2 +privsioningConfigDetailsEntityAttributeValueCache0Description = Member from id2 +privsioningConfigDetailsEntityAttributeValueCache1 = Member from id3 +privsioningConfigDetailsEntityAttributeValueCache1Description = Member from id3 +privsioningConfigDetailsEntityAttributeValueCache2 = Member to id2 +privsioningConfigDetailsEntityAttributeValueCache2Description = Member to id2 +privsioningConfigDetailsEntityAttributeValueCache3 = Member to id3 +privsioningConfigDetailsEntityAttributeValueCache3Description = Member to id3 provisioningGroupSyncSuccess = Provisioner group sync message was sent successfully @@ -9022,10 +9022,10 @@ provisioningSubjectProvsionableEndLabel = Provisionable end provisioningSubjectLastUpdatedLabel = Last updated provisioningSubjectLastUserSyncLabel = Last user sync provisioningSubjectLastUserMetadataSyncLabel = Last user metadata sync -provisioningSubjectMemberFromId2Label = Member from id2 -provisioningSubjectMemberFromId3Label = Member from id3 -provisioningSubjectMemberToId2Label = Member to id2 -provisioningSubjectMemberToId3Label = Member to id3 +provisioningSubjectEntityAttributeValueCache0Label = Member from id2 +provisioningSubjectEntityAttributeValueCache1Label = Member from id3 +provisioningSubjectEntityAttributeValueCache2Label = Member to id2 +provisioningSubjectEntityAttributeValueCache3Label = Member to id3 provisioningSubjectMembershipIdLabel = Membership id provisioningSubjectMembershipId2Label = Membership id2 @@ -11574,10 +11574,10 @@ provisionerActivityTableHeaderLastGroupSyncStart = Last group sync start time provisionerActivityTableHeaderLastGroupSync = Last group sync time provisionerActivityTableHeaderLastGroupMetadataSyncStart = Last group metadata sync start time provisionerActivityTableHeaderLastGroupMetadataSync = Last group metadata sync time -provisionerActivityTableHeaderGroupFromId2 = Group from id2 -provisionerActivityTableHeaderGroupFromId3 = Group from id3 -provisionerActivityTableHeaderGroupToId2 = Group to id2 -provisionerActivityTableHeaderGroupToId3 = Group to id3 +provisionerActivityTableHeaderGroupAttributeValueCache0 = Group from id2 +provisionerActivityTableHeaderGroupAttributeValueCache1 = Group from id3 +provisionerActivityTableHeaderGroupAttributeValueCache2 = Group to id2 +provisionerActivityTableHeaderGroupAttributeValueCache3 = Group to id3 provisionerActivityTableHeaderMetadataUpdated = Metdata updated time provisionerActivityTableHeaderErrorMessage = Error message time provisionerActivityTableHeaderErrorTimestamp = Error time @@ -11592,10 +11592,10 @@ provisionerActivityTableHeaderLastUserSyncStart = Last user sync start time provisionerActivityTableHeaderLastUserSync = Last user sync time provisionerActivityTableHeaderLastUserMetadataSyncStart = Last metadata sync start time provisionerActivityTableHeaderLastUserMetadataSync = Last metadata sync time -provisionerActivityTableHeaderMemberFromId2 = Member from id2 -provisionerActivityTableHeaderMemberFromId3 = Member from id3 -provisionerActivityTableHeaderMemberToId2 = Member to id2 -provisionerActivityTableHeaderMemberToId3 = Member to id3 +provisionerActivityTableHeaderEntityAttributeValueCache0 = Member from id2 +provisionerActivityTableHeaderEntityAttributeValueCache1 = Member from id3 +provisionerActivityTableHeaderEntityAttributeValueCache2 = Member to id2 +provisionerActivityTableHeaderEntityAttributeValueCache3 = Member to id3 provisionerActivityTableHeaderMembershipId = Membership id provisionerActivityTableHeaderMembershipId2 = Membership id2 @@ -13865,22 +13865,22 @@ config.GenericConfiguration.attribute.refreshEntityLinkIfLessThanAmount.label = config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.label = Refresh target group link config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.description = Target group links will be refreshed when they can be (full sync retrieve all groups), or when they must be (group link data is not cached in Grouper). Otherwise if there are groups to operate on, if there are only a few (less than this amount), then refresh the group link, otherwise for expediency just use the cached data. Generally you do not need to edit this value. This is an integer. -config.GenericConfiguration.attribute.common.subjectLink.memberFromId2.label = Subject link - memberFromId2 -config.GenericConfiguration.attribute.common.subjectLink.memberFromId3.label = Subject link - memberFromId3 -config.GenericConfiguration.attribute.common.subjectLink.memberToId2.label = Subject link - memberToId2 -config.GenericConfiguration.attribute.common.subjectLink.memberToId3.label = Subject link - memberToId3 -config.GenericConfiguration.attribute.common.entityLink.memberFromId2.label = Target entity link - memberFromId2 -config.GenericConfiguration.attribute.common.entityLink.memberFromId3.label = Target entity link - memberFromId3 -config.GenericConfiguration.attribute.common.entityLink.memberToId2.label = Target entity link - memberToId2 -config.GenericConfiguration.attribute.common.entityLink.memberToId3.label = Target entity link - memberToId3 -config.GenericConfiguration.attribute.common.groupLink.groupFromId2.label = Target group link - groupFromId2 -config.GenericConfiguration.attribute.common.groupLink.groupFromId2.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupFromId3.label = Target group link - groupFromId3 -config.GenericConfiguration.attribute.common.groupLink.groupFromId3.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupToId2.label = Target group link - groupToId2 -config.GenericConfiguration.attribute.common.groupLink.groupToId2.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupToId3.label = Target group link - groupToId3 -config.GenericConfiguration.attribute.common.groupLink.groupToId3.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache0.label = Subject link - entityAttributeValueCache0 +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache1.label = Subject link - entityAttributeValueCache1 +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache2.label = Subject link - entityAttributeValueCache2 +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache3.label = Subject link - entityAttributeValueCache3 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache0.label = Target entity link - entityAttributeValueCache0 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache1.label = Target entity link - entityAttributeValueCache1 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache2.label = Target entity link - entityAttributeValueCache2 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache3.label = Target entity link - entityAttributeValueCache3 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.label = Target group link - groupAttributeValueCache0 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.label = Target group link - groupAttributeValueCache1 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.label = Target group link - groupAttributeValueCache2 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.label = Target group link - groupAttributeValueCache3 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} config.GenericConfiguration.attribute.targetGroupAttribute.i.name.label = __i+1__ - name config.GenericConfiguration.attribute.targetGroupAttribute.i.name.description = Attribute name is the key in the key/value pairs for this group @@ -13994,7 +13994,7 @@ config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromG provisioning.helper.variable.grouperProvisioningGroup = grouperProvisioningGroup (ProvisioningGroup.java): this is the Grouper representation of the group. Fields include: id, idIndex, name, displayName. Attributes include: description. Here is an example of a regex replace all non alphanumeric ids: ${grouperProvisioningGroup.name.replaceAll('[^a-zA-Z0-9]', '_')} -provisioning.helper.variable.gcGrouperSyncGroup = gcGrouperSyncGroup (GcGrouperSyncGroup.java): this is the "sync" group object. Fields include: groupFromId2, groupFromId3, groupToId2, groupToId3 +provisioning.helper.variable.gcGrouperSyncGroup = gcGrouperSyncGroup (GcGrouperSyncGroup.java): this is the "sync" group object. Fields include: groupAttributeValueCache0, groupAttributeValueCache1, groupAttributeValueCache2, groupAttributeValueCache3 provisioning.helper.variable.provisioningGroupWrapper = provisioningGroupWrapper (ProvisioningGroupWrapper.java): holds references to all group data. Fields include: create, delete, recalc, gcGrouperSyncGroup, grouperProvisioningGroup, grouperTargetGroup, targetProvisioningGroup, targetNativeGroup provisioning.helper.variable.grouperTargetGroup = grouperTargetGroup (ProvisioningGroup.java): generally this is not needed since it is being built by the translation process. Fields and attributes depend on the provisioner. @@ -14113,7 +14113,7 @@ config.GenericConfiguration.attribute.targetEntityAttribute.i.name.description = config.GenericConfiguration.attribute.option.targetEntityAttribute.i.attributePrefix = attr provisioning.helper.variable.grouperProvisioningEntity = grouperProvisioningEntity (ProvisioningEntity.java): this is the Grouper representation of the entity. Fields include: email (needs configuration), id, loginId (needs configuration), name, subjectId. Attributes include: subjectSourceId, description, subjectIdentifier0 -provisioning.helper.variable.gcGrouperSyncMember = gcGrouperSyncMember (GcGrouperSyncMember.java): this is the "sync" entity object. Fields include: memberFromId2, memberFromId3, memberToId2, memberToId3 +provisioning.helper.variable.gcGrouperSyncMember = gcGrouperSyncMember (GcGrouperSyncMember.java): this is the "sync" entity object. Fields include: entityAttributeValueCache0, entityAttributeValueCache1, entityAttributeValueCache2, entityAttributeValueCache3 provisioning.helper.variable.provisioningEntityWrapper = provisioningEntityWrapper (ProvisioningGroupWrapper.java): holds references to all entity data. Fields include: create, delete, recalc, gcGrouperSyncMember, grouperProvisioningEntity, grouperTargetEntity, targetProvisioningEntity, targetNativeEntity provisioning.helper.variable.grouperTargetEntity = grouperTargetEntity (ProvisioningEntity.java): generally this is not needed since it is being built by the translation process. Fields and attributes depend on the provisioner. @@ -14280,6 +14280,9 @@ config.SqlProvisionerConfiguration.attribute.provisioningType.label = Sql provis config.SqlProvisionerConfiguration.attribute.dbExternalSystemConfigId.label = Db external system config id config.SqlProvisionerConfiguration.attribute.dbExternalSystemConfigId.description = Sql database external system config id. If you do not see your database configuration add it in Miscellaneous -> External systems. You can also provision across database link. +config.SqlProvisionerConfiguration.attribute.provisioningType.label = SQL provisioning type +config.SqlProvisionerConfiguration.attribute.provisioningType.description = membershipObjects: memberships table holds memberships (most common)
    groupAttributes: group attribute table to hold memberships (similar to LDAP)
    entityAttributes: entity attribute table to hold memberships (similar to LDAP) + config.SqlProvisionerConfiguration.attribute.membershipTableName.label = Membership table name config.SqlProvisionerConfiguration.attribute.membershipSearchQuery.label = Membership search query diff --git a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties index 7de4ea2c79a6..343704b4bb1c 100644 --- a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties @@ -8771,14 +8771,14 @@ privsioningConfigDetailsLastGroupMetadataSync=Date de dernière synchro des mét privsioningConfigDetailsLastGroupMetadataSyncStart=Dernière date de début de synchro des métadonnées privsioningConfigDetailsLastGroupMetadataSyncDescription=Date à laquelle le nom, la description et les métadonnées du groupe ont été synchronisés pour la dernières fois (sans inclure l'appartenance) privsioningConfigDetailsLastGroupMetadataSyncStartDescription=Date à laquelle la dernière synchronisation du nom, de la description et des metadonnées du groupe a commencé (sans inclure l'appartenance) -privsioningConfigDetailsGroupFromId2=Groupe provenant d'id2 -privsioningConfigDetailsGroupFromId2Description=Groupe provenant d'id2 -privsioningConfigDetailsGroupFromId3=Groupe provenant d'id3 -privsioningConfigDetailsGroupFromId3Description=Groupe provenant d'id3 -privsioningConfigDetailsGroupToId2=Grouper vers id2 -privsioningConfigDetailsGroupToId2Description=Grouper vers id2 -privsioningConfigDetailsGroupToId3=Grouper vers id3 -privsioningConfigDetailsGroupToId3Description=Grouper vers id3 +privsioningConfigDetailsGroupAttributeValueCache0=Groupe provenant d'id2 +privsioningConfigDetailsGroupAttributeValueCache0Description=Groupe provenant d'id2 +privsioningConfigDetailsGroupAttributeValueCache1=Groupe provenant d'id3 +privsioningConfigDetailsGroupAttributeValueCache1Description=Groupe provenant d'id3 +privsioningConfigDetailsGroupAttributeValueCache2=Grouper vers id2 +privsioningConfigDetailsGroupAttributeValueCache2Description=Grouper vers id2 +privsioningConfigDetailsGroupAttributeValueCache3=Grouper vers id3 +privsioningConfigDetailsGroupAttributeValueCache3Description=Grouper vers id3 privsioningConfigDetailsMetadataUpdated=Dernière mise à jour du lien (link) privsioningConfigDetailsMetadataUpdatedDescription=Si cet objet à des données de lien (link data) en cache, c'est la dernière fois qu'il a été mis à jour à partir de la cible privsioningConfigDetailsErrorMessage=Message d'erreur @@ -8831,14 +8831,14 @@ privsioningConfigDetailsMembershipId2=id2 d'appartenance privsioningConfigDetailsMembershipId2Description=id2 d'appartenance privsioningConfigDetailsProvisionable=Provisionnable -privsioningConfigDetailsMemberFromId2=Membre de id2 -privsioningConfigDetailsMemberFromId2Description=Membre de id2 -privsioningConfigDetailsMemberFromId3=Membre de id3 -privsioningConfigDetailsMemberFromId3Description=Membre de id3 -privsioningConfigDetailsMemberToId2=Membre vers id2 -privsioningConfigDetailsMemberToId2Description=Membre vers id2 -privsioningConfigDetailsMemberToId3=Member vers id3 -privsioningConfigDetailsMemberToId3Description=Membre vers id3 +privsioningConfigDetailsEntityAttributeValueCache0=Membre de id2 +privsioningConfigDetailsEntityAttributeValueCache0Description=Membre de id2 +privsioningConfigDetailsEntityAttributeValueCache1=Membre de id3 +privsioningConfigDetailsEntityAttributeValueCache1Description=Membre de id3 +privsioningConfigDetailsEntityAttributeValueCache2=Membre vers id2 +privsioningConfigDetailsEntityAttributeValueCache2Description=Membre vers id2 +privsioningConfigDetailsEntityAttributeValueCache3=Member vers id3 +privsioningConfigDetailsEntityAttributeValueCache3Description=Membre vers id3 provisioningGroupSyncSuccess=Le message de synchro pour le provisionnement de groupe a été envoyé avec succès @@ -8858,10 +8858,10 @@ provisioningSubjectProvsionableEndLabel=Fin provisionnable provisioningSubjectLastUpdatedLabel=Dernière mise à jour provisioningSubjectLastUserSyncLabel=Dernière synchro utilisateur provisioningSubjectLastUserMetadataSyncLabel=Dernière synchronisation des métadonnées de l'utilisateur -provisioningSubjectMemberFromId2Label=Membre de id2 -provisioningSubjectMemberFromId3Label=Membre de id3 -provisioningSubjectMemberToId2Label=Membre vers id2 -provisioningSubjectMemberToId3Label=Membre vers id3 +provisioningSubjectEntityAttributeValueCache0Label=Membre de id2 +provisioningSubjectEntityAttributeValueCache1Label=Membre de id3 +provisioningSubjectEntityAttributeValueCache2Label=Membre vers id2 +provisioningSubjectEntityAttributeValueCache3Label=Membre vers id3 provisioningSubjectMembershipIdLabel=Id d'appartenance provisioningSubjectMembershipId2Label=id2 d'appartenance @@ -11379,10 +11379,10 @@ provisionerActivityTableHeaderLastGroupSyncStart=Heure de début de la dernière provisionerActivityTableHeaderLastGroupSync=Heure de la dernière synchronisation du groupe provisionerActivityTableHeaderLastGroupMetadataSyncStart=Heure de début de la dernière synchronisation des métadonnées du groupe provisionerActivityTableHeaderLastGroupMetadataSync=Heure de la dernière synchronisation des métadonnées du groupe -provisionerActivityTableHeaderGroupFromId2=Groupe provenant d'id2 -provisionerActivityTableHeaderGroupFromId3=Groupe provenant d'id3 -provisionerActivityTableHeaderGroupToId2=Grouper vers id2 -provisionerActivityTableHeaderGroupToId3=Grouper vers id3 +provisionerActivityTableHeaderGroupAttributeValueCache0=Groupe provenant d'id2 +provisionerActivityTableHeaderGroupAttributeValueCache1=Groupe provenant d'id3 +provisionerActivityTableHeaderGroupAttributeValueCache2=Grouper vers id2 +provisionerActivityTableHeaderGroupAttributeValueCache3=Grouper vers id3 provisionerActivityTableHeaderMetadataUpdated=Heure de mise à jour des métadonnées provisionerActivityTableHeaderErrorMessage=Heure du message d'erreur provisionerActivityTableHeaderErrorTimestamp=Date de l'erreur @@ -11397,10 +11397,10 @@ provisionerActivityTableHeaderLastUserSyncStart=Date de début de la dernière s provisionerActivityTableHeaderLastUserSync=Heure de la dernière synchronisation de l'utilisateur provisionerActivityTableHeaderLastUserMetadataSyncStart=Heure de début de la dernière synchronisation des métadonnées provisionerActivityTableHeaderLastUserMetadataSync=Heure de la dernière synchronisation des métadonnées -provisionerActivityTableHeaderMemberFromId2=Membre de id2 -provisionerActivityTableHeaderMemberFromId3=Membre de id3 -provisionerActivityTableHeaderMemberToId2=Membre vers id2 -provisionerActivityTableHeaderMemberToId3=Membre vers id3 +provisionerActivityTableHeaderEntityAttributeValueCache0=Membre de id2 +provisionerActivityTableHeaderEntityAttributeValueCache1=Membre de id3 +provisionerActivityTableHeaderEntityAttributeValueCache2=Membre vers id2 +provisionerActivityTableHeaderEntityAttributeValueCache3=Membre vers id3 provisionerActivityTableHeaderMembershipId=Id d'appartenance provisionerActivityTableHeaderMembershipId2=id2 d'appartenance @@ -12739,22 +12739,22 @@ config.GenericConfiguration.attribute.refreshEntityLinkIfLessThanAmount.label=Ac config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.label=Actualiser le lien du groupe cible config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.description = Target group links will be refreshed when they can be (full sync retrieve all groups), or when they must be (group link data is not cached in Grouper). Otherwise if there are groups to operate on, if there are only a few (less than this amount), then refresh the group link, otherwise for expediency just use the cached data. Generally you do not need to edit this value. This is an integer. -config.GenericConfiguration.attribute.common.subjectLink.memberFromId2.label=Lien du sujet - memberFromId2 -config.GenericConfiguration.attribute.common.subjectLink.memberFromId3.label=Lien du sujet - memberFromId3 -config.GenericConfiguration.attribute.common.subjectLink.memberToId2.label=Lien du sujet - memberToId2 -config.GenericConfiguration.attribute.common.subjectLink.memberToId3.label=Lien du sujet - memberToId3 -config.GenericConfiguration.attribute.common.entityLink.memberFromId2.label=Lien d'entité cible - memberFromId2 -config.GenericConfiguration.attribute.common.entityLink.memberFromId3.label=Lien d'entité cible - memberFromId3 -config.GenericConfiguration.attribute.common.entityLink.memberToId2.label=Lien d'entité cible - memberToId2 -config.GenericConfiguration.attribute.common.entityLink.memberToId3.label=Lien d'entité cible - memberToId3 -config.GenericConfiguration.attribute.common.groupLink.groupFromId2.label=Lien du groupe cible - groupFromId2 -config.GenericConfiguration.attribute.common.groupLink.groupFromId2.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupFromId3.label=Lien du groupe cible - groupFromId3 -config.GenericConfiguration.attribute.common.groupLink.groupFromId3.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupToId2.label=Lien du groupe cible - groupToId2 -config.GenericConfiguration.attribute.common.groupLink.groupToId2.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupToId3.label=Lien du groupe cible - groupToId3 -config.GenericConfiguration.attribute.common.groupLink.groupToId3.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache0.label=Lien du sujet - entityAttributeValueCache0 +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache1.label=Lien du sujet - entityAttributeValueCache1 +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache2.label=Lien du sujet - entityAttributeValueCache2 +config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache3.label=Lien du sujet - entityAttributeValueCache3 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache0.label=Lien d'entité cible - entityAttributeValueCache0 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache1.label=Lien d'entité cible - entityAttributeValueCache1 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache2.label=Lien d'entité cible - entityAttributeValueCache2 +config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache3.label=Lien d'entité cible - entityAttributeValueCache3 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.label=Lien du groupe cible - groupAttributeValueCache0 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.label=Lien du groupe cible - groupAttributeValueCache1 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.label=Lien du groupe cible - groupAttributeValueCache2 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.label=Lien du groupe cible - groupAttributeValueCache3 +config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} config.GenericConfiguration.attribute.targetGroupAttribute.i.name.label=__i+1__ - nom config.GenericConfiguration.attribute.targetGroupAttribute.i.name.description=Le nom de l'attribut est la clé dans les paires clé/valeur pour ce groupe @@ -12771,7 +12771,7 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.fieldName.label=__i config.GenericConfiguration.attribute.targetGroupAttribute.i.fieldName.description = ProvisioningGroup.java field name. provisioning.helper.variable.grouperProvisioningGroup=grouperProvisioningGroup (ProvisioningGroup.java) : il s’agit de la représentation Grouper du groupe. Les champs incluent : id, idIndex, name, displayName. Les attributs comprennent : description -provisioning.helper.variable.gcGrouperSyncGroup=gcGrouperSyncGroup (GcGrouperSyncGroup.java) : il s’agit de l’objet de groupe "sync". Les champs comprennent : groupFromId2, groupFromId3, groupToId2, groupToId3 +provisioning.helper.variable.gcGrouperSyncGroup=gcGrouperSyncGroup (GcGrouperSyncGroup.java) : il s’agit de l’objet de groupe "sync". Les champs comprennent : groupAttributeValueCache0, groupAttributeValueCache1, groupAttributeValueCache2, groupAttributeValueCache3 provisioning.helper.variable.provisioningGroupWrapper=provisioningGroupWrapper (ProvisioningGroupWrapper.java) : contient des références à toutes les données du groupe. Les champs incluent : create, delete, recalc, gcGrouperSyncGroup, grouperProvisioningGroup, grouperTargetGroup, targetProvisioningGroup, targetNativeGroup provisioning.helper.variable.grouperTargetGroup=grouperTargetGroup (ProvisioningGroup.java) : généralement ce n’est pas nécessaire car il est construit par le processus de traduction. Les champs et attributs dépendent du provisionneur. @@ -12870,7 +12870,7 @@ config.GenericConfiguration.attribute.targetEntityAttribute.i.fieldName.label=__ config.GenericConfiguration.attribute.targetEntityAttribute.i.fieldName.description = ProvisioningEntity.java field name. provisioning.helper.variable.grouperProvisioningEntity = grouperProvisioningEntity (ProvisioningEntity.java): this is the Grouper representation of the entity. Fields include: email (needs configuration), id, loginId (needs configuration), name, subjectId. Attributes include: subjectSourceId, description, subjectIdentifier0 -provisioning.helper.variable.gcGrouperSyncMember=gcGrouperSyncMember (GcGrouperSyncMember.java) : c'est l'objet entité "sync". Les champs incluent : memberFromId2, memberFromId3, memberToId2, memberToId3 +provisioning.helper.variable.gcGrouperSyncMember=gcGrouperSyncMember (GcGrouperSyncMember.java) : c'est l'objet entité "sync". Les champs incluent : entityAttributeValueCache0, entityAttributeValueCache1, entityAttributeValueCache2, entityAttributeValueCache3 provisioning.helper.variable.provisioningEntityWrapper=provisioningEntityWrapper (ProvisioningGroupWrapper.java) : contient des références à toutes les données d'entité. Les champs incluent : créer, supprimer, recalc, gcGrouperSyncMember, grouperProvisioningEntity, grouperTargetEntity, targetProvisioningEntity, targetNativeEntity provisioning.helper.variable.grouperTargetEntity=grouperTargetEntity (ProvisioningEntity.java) : en général, il n'est pas nécessaire car il est construit par le processus de traduction. Les champs et les attributs dépendent du fournisseur. diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java index 3f812c92ecdb..fb19bdc44c21 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java @@ -281,13 +281,13 @@ public void setHasSubjectLink(Boolean hasSubjectLink) { * * @return true if has script or an attribute mapped */ - public boolean isHasGroupLinkGroupFromId2() { + public boolean isHasGroupLinkGroupAttributeValueCache0() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupFromId2())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache0())) { return true; } - if (null != getGroupLinkGroupFromId2Attribute()) { + if (null != getGroupLinkGroupAttributeValueCache0Attribute()) { return true; } @@ -295,128 +295,128 @@ public boolean isHasGroupLinkGroupFromId2() { } - public GrouperProvisioningConfigurationAttribute getEntityLinkMemberToId2Attribute() { + public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache2Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberToId2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberToId2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } return null; } - public GrouperProvisioningConfigurationAttribute getEntityLinkMemberFromId2Attribute() { + public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache0Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberFromId2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberFromId2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } return null; } - public GrouperProvisioningConfigurationAttribute getEntityLinkMemberFromId3Attribute() { + public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache1Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberFromId3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberFromId3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } return null; } - public GrouperProvisioningConfigurationAttribute getEntityLinkMemberToId3Attribute() { + public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache3Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberToId3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("memberToId3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (StringUtils.equals("entityAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { return grouperProvisioningConfigurationAttribute; } } return null; } - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupToId2Attribute() { + public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache2Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupToId2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupToId2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } return null; } - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupToId3Attribute() { + public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache3Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupToId3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupToId3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } return null; } - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupFromId2Attribute() { + public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache0Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupFromId2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupFromId2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } return null; } - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupFromId3Attribute() { + public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache1Attribute() { for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupFromId3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupFromId3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (StringUtils.equals("groupAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { return grouperProvisioningConfigurationAttribute; } } @@ -427,13 +427,13 @@ public GrouperProvisioningConfigurationAttribute getGroupLinkGroupFromId3Attribu * * @return true if has script or an attribute mapped */ - public boolean isHasGroupLinkGroupFromId3() { + public boolean isHasGroupLinkGroupAttributeValueCache1() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupFromId3())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache1())) { return true; } - if (null != getGroupLinkGroupFromId3Attribute()) { + if (null != getGroupLinkGroupAttributeValueCache1Attribute()) { return true; } @@ -445,13 +445,13 @@ public boolean isHasGroupLinkGroupFromId3() { * * @return true if has script or an attribute mapped */ - public boolean isHasGroupLinkGroupToId2() { + public boolean isHasGroupLinkGroupAttributeValueCache2() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupToId2())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache2())) { return true; } - if (null != getGroupLinkGroupToId2Attribute()) { + if (null != getGroupLinkGroupAttributeValueCache2Attribute()) { return true; } @@ -464,13 +464,13 @@ public boolean isHasGroupLinkGroupToId2() { * * @return true if has script or an attribute mapped */ - public boolean isHasGroupLinkGroupToId3() { + public boolean isHasGroupLinkGroupAttributeValueCache3() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupToId3())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache3())) { return true; } - if (null != getGroupLinkGroupToId3Attribute()) { + if (null != getGroupLinkGroupAttributeValueCache3Attribute()) { return true; } @@ -483,13 +483,13 @@ public boolean isHasGroupLinkGroupToId3() { * * @return true if has script or an attribute mapped */ - public boolean isHasEntityLinkMemberToId2() { + public boolean isHasEntityLinkEntityAttributeValueCache2() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkMemberToId2())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache2())) { return true; } - if (null != getEntityLinkMemberToId2Attribute()) { + if (null != getEntityLinkEntityAttributeValueCache2Attribute()) { return true; } @@ -501,13 +501,13 @@ public boolean isHasEntityLinkMemberToId2() { * * @return true if has script or an attribute mapped */ - public boolean isHasEntityLinkMemberFromId2() { + public boolean isHasEntityLinkEntityAttributeValueCache0() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkMemberFromId2())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache0())) { return true; } - if (null != getEntityLinkMemberFromId2Attribute()) { + if (null != getEntityLinkEntityAttributeValueCache0Attribute()) { return true; } @@ -519,13 +519,13 @@ public boolean isHasEntityLinkMemberFromId2() { * * @return true if has script or an attribute mapped */ - public boolean isHasEntityLinkMemberFromId3() { + public boolean isHasEntityLinkEntityAttributeValueCache1() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkMemberFromId3())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache1())) { return true; } - if (null != getEntityLinkMemberFromId3Attribute()) { + if (null != getEntityLinkEntityAttributeValueCache1Attribute()) { return true; } @@ -538,13 +538,13 @@ public boolean isHasEntityLinkMemberFromId3() { * * @return true if has script or an attribute mapped */ - public boolean isHasEntityLinkMemberToId3() { + public boolean isHasEntityLinkEntityAttributeValueCache3() { - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkMemberToId3())) { + if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache3())) { return true; } - if (null != getEntityLinkMemberToId3Attribute()) { + if (null != getEntityLinkEntityAttributeValueCache3Attribute()) { return true; } @@ -1649,12 +1649,12 @@ public String toString() { result.append(fieldName).append(" = '").append(GrouperUtil.toStringForLog(value, false)).append("'"); } } - for (String propertyName : new String[] {"hasEntityLinkMemberFromId2", - "hasEntityLinkMemberFromId3", "hasEntityLinkMemberToId2", "hasEntityLinkMemberToId3", - "hasGroupLinkGroupFromId2", "hasGroupLinkGroupFromId3", "hasGroupLinkGroupToId2", "hasGroupLinkGroupToId3", - "groupLinkGroupFromId2Attribute", "groupLinkGroupFromId3Attribute", "groupLinkGroupToId2Attribute", - "groupLinkGroupToId3Attribute", "entityLinkMemberFromId2Attribute", "entityLinkMemberFromId3Attribute", - "entityLinkMemberToId2Attribute", "entityLinkMemberToId3Attribute"}) { + for (String propertyName : new String[] {"hasEntityLinkEntityAttributeValueCache0", + "hasEntityLinkEntityAttributeValueCache1", "hasEntityLinkEntityAttributeValueCache2", "hasEntityLinkEntityAttributeValueCache3", + "hasGroupLinkGroupAttributeValueCache0", "hasGroupLinkGroupAttributeValueCache1", "hasGroupLinkGroupAttributeValueCache2", "hasGroupLinkGroupAttributeValueCache3", + "groupLinkGroupAttributeValueCache0Attribute", "groupLinkGroupAttributeValueCache1Attribute", "groupLinkGroupAttributeValueCache2Attribute", + "groupLinkGroupAttributeValueCache3Attribute", "entityLinkEntityAttributeValueCache0Attribute", "entityLinkEntityAttributeValueCache1Attribute", + "entityLinkEntityAttributeValueCache2Attribute", "entityLinkEntityAttributeValueCache3Attribute"}) { Object value = GrouperUtil.propertyValue(this, propertyName); if (value != null) { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java index 253b891cfa4c..2b96e3a55a15 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java @@ -1023,66 +1023,66 @@ public void preConfigure() { private Set subjectSourcesToProvision = null; - private String subjectLinkMemberFromId2; + private String subjectLinkEntityAttributeValueCache0; - private String subjectLinkMemberFromId3; + private String subjectLinkEntityAttributeValueCache1; - private String subjectLinkMemberToId2; + private String subjectLinkEntityAttributeValueCache2; - private String subjectLinkMemberToId3; + private String subjectLinkEntityAttributeValueCache3; - public String getSubjectLinkMemberFromId2() { - return subjectLinkMemberFromId2; + public String getSubjectLinkEntityAttributeValueCache0() { + return subjectLinkEntityAttributeValueCache0; } - public void setSubjectLinkMemberFromId2(String subjectLinkMemberFromId2) { - this.subjectLinkMemberFromId2 = subjectLinkMemberFromId2; + public void setSubjectLinkEntityAttributeValueCache0(String subjectLinkEntityAttributeValueCache0) { + this.subjectLinkEntityAttributeValueCache0 = subjectLinkEntityAttributeValueCache0; } - public String getSubjectLinkMemberFromId3() { - return subjectLinkMemberFromId3; + public String getSubjectLinkEntityAttributeValueCache1() { + return subjectLinkEntityAttributeValueCache1; } - public void setSubjectLinkMemberFromId3(String subjectLinkMemberFromId3) { - this.subjectLinkMemberFromId3 = subjectLinkMemberFromId3; + public void setSubjectLinkEntityAttributeValueCache1(String subjectLinkEntityAttributeValueCache1) { + this.subjectLinkEntityAttributeValueCache1 = subjectLinkEntityAttributeValueCache1; } - public String getSubjectLinkMemberToId2() { - return subjectLinkMemberToId2; + public String getSubjectLinkEntityAttributeValueCache2() { + return subjectLinkEntityAttributeValueCache2; } - public void setSubjectLinkMemberToId2(String subjectLinkMemberToId2) { - this.subjectLinkMemberToId2 = subjectLinkMemberToId2; + public void setSubjectLinkEntityAttributeValueCache2(String subjectLinkEntityAttributeValueCache2) { + this.subjectLinkEntityAttributeValueCache2 = subjectLinkEntityAttributeValueCache2; } - public String getSubjectLinkMemberToId3() { - return subjectLinkMemberToId3; + public String getSubjectLinkEntityAttributeValueCache3() { + return subjectLinkEntityAttributeValueCache3; } - public void setSubjectLinkMemberToId3(String subjectLinkMemberToId3) { - this.subjectLinkMemberToId3 = subjectLinkMemberToId3; + public void setSubjectLinkEntityAttributeValueCache3(String subjectLinkEntityAttributeValueCache3) { + this.subjectLinkEntityAttributeValueCache3 = subjectLinkEntityAttributeValueCache3; } /** @@ -2328,20 +2328,20 @@ public void configureGenericSettings() { } this.debugMap.put("subjectSourcesToProvision", GrouperUtil.join(this.subjectSourcesToProvision.iterator(), ',')); - this.subjectLinkMemberFromId2 = this.retrieveConfigString("common.subjectLink.memberFromId2", false); - this.subjectLinkMemberFromId3 = this.retrieveConfigString("common.subjectLink.memberFromId3", false); - this.subjectLinkMemberToId2 = this.retrieveConfigString("common.subjectLink.memberToId2", false); - this.subjectLinkMemberToId3 = this.retrieveConfigString("common.subjectLink.memberToId3", false); + this.subjectLinkEntityAttributeValueCache0 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache0", false); + this.subjectLinkEntityAttributeValueCache1 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache1", false); + this.subjectLinkEntityAttributeValueCache2 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache2", false); + this.subjectLinkEntityAttributeValueCache3 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache3", false); - this.groupLinkGroupFromId2 = this.retrieveConfigString("common.groupLink.groupFromId2", false); - this.groupLinkGroupFromId3 = this.retrieveConfigString("common.groupLink.groupFromId3", false); - this.groupLinkGroupToId2 = this.retrieveConfigString("common.groupLink.groupToId2", false); - this.groupLinkGroupToId3 = this.retrieveConfigString("common.groupLink.groupToId3", false); + this.groupLinkGroupAttributeValueCache0 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache0", false); + this.groupLinkGroupAttributeValueCache1 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache1", false); + this.groupLinkGroupAttributeValueCache2 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache2", false); + this.groupLinkGroupAttributeValueCache3 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache3", false); - this.entityLinkMemberFromId2 = this.retrieveConfigString("common.entityLink.memberFromId2", false); - this.entityLinkMemberFromId3 = this.retrieveConfigString("common.entityLink.memberFromId3", false); - this.entityLinkMemberToId2 = this.retrieveConfigString("common.entityLink.memberToId2", false); - this.entityLinkMemberToId3 = this.retrieveConfigString("common.entityLink.memberToId3", false); + this.entityLinkEntityAttributeValueCache0 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache0", false); + this.entityLinkEntityAttributeValueCache1 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache1", false); + this.entityLinkEntityAttributeValueCache2 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache2", false); + this.entityLinkEntityAttributeValueCache3 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache3", false); this.refreshSubjectLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshSubjectLinkIfLessThanAmount", false), 20); this.refreshGroupLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshGroupLinkIfLessThanAmount", false), 20); @@ -2818,76 +2818,76 @@ public void setRecalculateAllOperations(boolean recalculateAllOperations) { */ private boolean configured = false; - private String entityLinkMemberFromId2; + private String entityLinkEntityAttributeValueCache0; - private String entityLinkMemberFromId3; + private String entityLinkEntityAttributeValueCache1; - private String entityLinkMemberToId2; + private String entityLinkEntityAttributeValueCache2; - private String entityLinkMemberToId3; + private String entityLinkEntityAttributeValueCache3; - public String getEntityLinkMemberFromId2() { - return entityLinkMemberFromId2; + public String getEntityLinkEntityAttributeValueCache0() { + return entityLinkEntityAttributeValueCache0; } - public void setEntityLinkMemberFromId2(String entityLinkMemberFromId2) { - this.entityLinkMemberFromId2 = entityLinkMemberFromId2; + public void setEntityLinkEntityAttributeValueCache0(String entityLinkEntityAttributeValueCache0) { + this.entityLinkEntityAttributeValueCache0 = entityLinkEntityAttributeValueCache0; } - public String getEntityLinkMemberFromId3() { - return entityLinkMemberFromId3; + public String getEntityLinkEntityAttributeValueCache1() { + return entityLinkEntityAttributeValueCache1; } - public void setEntityLinkMemberFromId3(String entityLinkMemberFromId3) { - this.entityLinkMemberFromId3 = entityLinkMemberFromId3; + public void setEntityLinkEntityAttributeValueCache1(String entityLinkEntityAttributeValueCache1) { + this.entityLinkEntityAttributeValueCache1 = entityLinkEntityAttributeValueCache1; } - public String getEntityLinkMemberToId2() { - return entityLinkMemberToId2; + public String getEntityLinkEntityAttributeValueCache2() { + return entityLinkEntityAttributeValueCache2; } - public void setEntityLinkMemberToId2(String entityLinkMemberToId2) { - this.entityLinkMemberToId2 = entityLinkMemberToId2; + public void setEntityLinkEntityAttributeValueCache2(String entityLinkEntityAttributeValueCache2) { + this.entityLinkEntityAttributeValueCache2 = entityLinkEntityAttributeValueCache2; } - public String getEntityLinkMemberToId3() { - return entityLinkMemberToId3; + public String getEntityLinkEntityAttributeValueCache3() { + return entityLinkEntityAttributeValueCache3; } - public void setEntityLinkMemberToId3(String entityLinkMemberToId3) { - this.entityLinkMemberToId3 = entityLinkMemberToId3; + public void setEntityLinkEntityAttributeValueCache3(String entityLinkEntityAttributeValueCache3) { + this.entityLinkEntityAttributeValueCache3 = entityLinkEntityAttributeValueCache3; } - private String groupLinkGroupFromId2; + private String groupLinkGroupAttributeValueCache0; - private String groupLinkGroupFromId3; + private String groupLinkGroupAttributeValueCache1; - private String groupLinkGroupToId2; + private String groupLinkGroupAttributeValueCache2; - private String groupLinkGroupToId3; + private String groupLinkGroupAttributeValueCache3; /** * attribute name to config @@ -2909,57 +2909,57 @@ public Map getTargetEntityAtt } - public String getGroupLinkGroupFromId2() { - return groupLinkGroupFromId2; + public String getGroupLinkGroupAttributeValueCache0() { + return groupLinkGroupAttributeValueCache0; } - public void setGroupLinkGroupFromId2(String groupLinkGroupFromId2) { - this.groupLinkGroupFromId2 = groupLinkGroupFromId2; + public void setGroupLinkGroupAttributeValueCache0(String groupLinkGroupAttributeValueCache0) { + this.groupLinkGroupAttributeValueCache0 = groupLinkGroupAttributeValueCache0; } - public String getGroupLinkGroupFromId3() { - return groupLinkGroupFromId3; + public String getGroupLinkGroupAttributeValueCache1() { + return groupLinkGroupAttributeValueCache1; } - public void setGroupLinkGroupFromId3(String groupLinkGroupFromId3) { - this.groupLinkGroupFromId3 = groupLinkGroupFromId3; + public void setGroupLinkGroupAttributeValueCache1(String groupLinkGroupAttributeValueCache1) { + this.groupLinkGroupAttributeValueCache1 = groupLinkGroupAttributeValueCache1; } - public String getGroupLinkGroupToId2() { - return groupLinkGroupToId2; + public String getGroupLinkGroupAttributeValueCache2() { + return groupLinkGroupAttributeValueCache2; } - public void setGroupLinkGroupToId2(String groupLinkGroupToId2) { - this.groupLinkGroupToId2 = groupLinkGroupToId2; + public void setGroupLinkGroupAttributeValueCache2(String groupLinkGroupAttributeValueCache2) { + this.groupLinkGroupAttributeValueCache2 = groupLinkGroupAttributeValueCache2; } - public String getGroupLinkGroupToId3() { - return groupLinkGroupToId3; + public String getGroupLinkGroupAttributeValueCache3() { + return groupLinkGroupAttributeValueCache3; } - public void setGroupLinkGroupToId3(String groupLinkGroupToId3) { - this.groupLinkGroupToId3 = groupLinkGroupToId3; + public void setGroupLinkGroupAttributeValueCache3(String groupLinkGroupAttributeValueCache3) { + this.groupLinkGroupAttributeValueCache3 = groupLinkGroupAttributeValueCache3; } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java index 3f629205cee5..8c0a69221d59 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java @@ -736,19 +736,19 @@ public void validateGroupLinkHasConfiguration() { } // check scripts - if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupFromId2"))) { + if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupAttributeValueCache0"))) { return; } - if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupFromId3"))) { + if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupAttributeValueCache1"))) { return; } - if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupToId2"))) { + if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupAttributeValueCache2"))) { return; } - if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupToId3"))) { + if (!StringUtils.isBlank(suffixToConfigValue.get("common.groupLink.groupAttributeValueCache3"))) { return; } this.addErrorMessage(new ProvisioningValidationIssue() @@ -789,15 +789,15 @@ public void validateEntityLinkHasConfiguration() { } // check scripts - if (!StringUtils.isBlank(suffixToConfigValue.get("common.entityLink.memberFromId2"))) { + if (!StringUtils.isBlank(suffixToConfigValue.get("common.entityLink.entityAttributeValueCache0"))) { return; } - if (!StringUtils.isBlank(suffixToConfigValue.get("common.entityLink.memberFromId3"))) { + if (!StringUtils.isBlank(suffixToConfigValue.get("common.entityLink.entityAttributeValueCache1"))) { return; } - if (!StringUtils.isBlank(suffixToConfigValue.get("common.entityLink.memberToId2"))) { + if (!StringUtils.isBlank(suffixToConfigValue.get("common.entityLink.entityAttributeValueCache2"))) { return; } @@ -826,7 +826,7 @@ public void validateGroupLinkOnePerBucket() { String errorMessage = GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkMultipleToSameBucket"); - for (String bucket : new String[] {"groupFromId2", "groupFromId3", "groupToId2", "groupToId3"}) { + for (String bucket : new String[] {"groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3"}) { List currentErrors = new ArrayList(); @@ -944,7 +944,7 @@ public void validateEntityLinkOnePerBucket() { String errorMessage = GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkMultipleToSameBucket"); - for (String bucket : new String[] {"memberFromId2", "memberFromId3", "memberToId2", "memberToId3"}) { + for (String bucket : new String[] {"entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"}) { List currentErrors = new ArrayList(); diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java index 77864086b3e3..41bf102e1bbb 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java @@ -472,24 +472,24 @@ public void updateSubjectLink( } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String subjectLinkMemberFromId2 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberFromId2(); - boolean hasSubjectLinkMemberFromId2 = !StringUtils.isBlank(subjectLinkMemberFromId2); + String subjectLinkEntityAttributeValueCache0 = this.grouperProvisioner + .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache0(); + boolean hasSubjectLinkEntityAttributeValueCache0 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache0); - String subjectLinkMemberFromId3 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberFromId3(); - boolean hasSubjectLinkMemberFromId3 = !StringUtils.isBlank(subjectLinkMemberFromId3); + String subjectLinkEntityAttributeValueCache1 = this.grouperProvisioner + .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache1(); + boolean hasSubjectLinkEntityAttributeValueCache1 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache1); - String subjectLinkMemberToId2 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberToId2(); - boolean hasSubjectLinkMemberToId2 = !StringUtils.isBlank(subjectLinkMemberToId2); + String subjectLinkEntityAttributeValueCache2 = this.grouperProvisioner + .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache2(); + boolean hasSubjectLinkEntityAttributeValueCache2 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache2); - String subjectLinkMemberToId3 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberToId3(); - boolean hasSubjectLinkMemberToId3 = !StringUtils.isBlank(subjectLinkMemberToId3); + String subjectLinkEntityAttributeValueCache3 = this.grouperProvisioner + .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache3(); + boolean hasSubjectLinkEntityAttributeValueCache3 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache3); - if (!hasSubjectLinkMemberFromId2 && !hasSubjectLinkMemberFromId3 - && !hasSubjectLinkMemberToId2 && !hasSubjectLinkMemberToId3) { + if (!hasSubjectLinkEntityAttributeValueCache0 && !hasSubjectLinkEntityAttributeValueCache1 + && !hasSubjectLinkEntityAttributeValueCache2 && !hasSubjectLinkEntityAttributeValueCache3) { return; } @@ -523,28 +523,28 @@ public void updateSubjectLink( Map variableMap = new HashMap(); variableMap.put("subject", subject); - if (hasSubjectLinkMemberFromId2) { - String memberFromId2Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkMemberFromId2, variableMap); - gcGrouperSyncMember.setMemberFromId2(memberFromId2Value); + if (hasSubjectLinkEntityAttributeValueCache0) { + String entityAttributeValueCache0Value = GrouperUtil + .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache0, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache0(entityAttributeValueCache0Value); } - if (hasSubjectLinkMemberFromId3) { - String memberFromId3Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkMemberFromId3, variableMap); - gcGrouperSyncMember.setMemberFromId3(memberFromId3Value); + if (hasSubjectLinkEntityAttributeValueCache1) { + String entityAttributeValueCache1Value = GrouperUtil + .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache1, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache1(entityAttributeValueCache1Value); } - if (hasSubjectLinkMemberToId2) { - String memberToId2Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkMemberToId2, variableMap); - gcGrouperSyncMember.setMemberToId2(memberToId2Value); + if (hasSubjectLinkEntityAttributeValueCache2) { + String entityAttributeValueCache2Value = GrouperUtil + .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache2, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache2(entityAttributeValueCache2Value); } - if (hasSubjectLinkMemberFromId3) { - String memberToId3Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkMemberToId3, variableMap); - gcGrouperSyncMember.setMemberToId3(memberToId3Value); + if (hasSubjectLinkEntityAttributeValueCache1) { + String entityAttributeValueCache3Value = GrouperUtil + .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache3, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache3(entityAttributeValueCache3Value); } } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java index 6d5f752b241f..07c8d70a5d37 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java @@ -52,16 +52,16 @@ public boolean groupLinkMissing(GcGrouperSyncGroup gcGrouperSyncGroup) { } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasGroupLinkGroupFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupFromId2(); - boolean hasGroupLinkGroupFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupFromId3(); - boolean hasGroupLinkGroupToId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupToId2(); - boolean hasGroupLinkGroupToId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupToId3(); + boolean hasGroupLinkGroupAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache0(); + boolean hasGroupLinkGroupAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache1(); + boolean hasGroupLinkGroupAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache2(); + boolean hasGroupLinkGroupAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache3(); boolean needsRefresh = false; - needsRefresh = needsRefresh || (hasGroupLinkGroupFromId2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupFromId2())); - needsRefresh = needsRefresh || (hasGroupLinkGroupFromId3 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupFromId3())); - needsRefresh = needsRefresh || (hasGroupLinkGroupToId2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupToId2())); - needsRefresh = needsRefresh || (hasGroupLinkGroupToId3 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupToId3())); + needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache0())); + needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache1())); + needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache2())); + needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache3())); return needsRefresh; } @@ -78,16 +78,16 @@ public boolean entityLinkMissing(GcGrouperSyncMember gcGrouperSyncMember) { } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasEntityLinkMemberFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberFromId2(); - boolean hasEntityLinkMemberFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberFromId3(); - boolean hasEntityLinkMemberToId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberToId2(); - boolean hasEntityLinkMemberToId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberToId3(); + boolean hasEntityLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache0(); + boolean hasEntityLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache1(); + boolean hasEntityLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache2(); + boolean hasEntityLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache3(); boolean needsRefresh = false; - needsRefresh = needsRefresh || (hasEntityLinkMemberFromId2 && StringUtils.isBlank(gcGrouperSyncMember.getMemberFromId2())); - needsRefresh = needsRefresh || (hasEntityLinkMemberFromId3 && StringUtils.isBlank(gcGrouperSyncMember.getMemberFromId3())); - needsRefresh = needsRefresh || (hasEntityLinkMemberToId2 && StringUtils.isBlank(gcGrouperSyncMember.getMemberToId2())); - needsRefresh = needsRefresh || (hasEntityLinkMemberToId3 && StringUtils.isBlank(gcGrouperSyncMember.getMemberToId3())); + needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache0())); + needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache1())); + needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache2())); + needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache3())); return needsRefresh; } @@ -107,19 +107,19 @@ public void retrieveSubjectLink() { } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String subjectLinkMemberFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberFromId2(); - boolean hasSubjectLinkMemberFromId2 = !StringUtils.isBlank(subjectLinkMemberFromId2); + String subjectLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache0(); + boolean hasSubjectLinkEntityAttributeValueCache0 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache0); - String subjectLinkMemberFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberFromId3(); - boolean hasSubjectLinkMemberFromId3 = !StringUtils.isBlank(subjectLinkMemberFromId3); + String subjectLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache1(); + boolean hasSubjectLinkEntityAttributeValueCache1 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache1); - String subjectLinkMemberToId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberToId2(); - boolean hasSubjectLinkMemberToId2 = !StringUtils.isBlank(subjectLinkMemberToId2); + String subjectLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache2(); + boolean hasSubjectLinkEntityAttributeValueCache2 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache2); - String subjectLinkMemberToId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberToId3(); - boolean hasSubjectLinkMemberToId3 = !StringUtils.isBlank(subjectLinkMemberToId3); + String subjectLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache3(); + boolean hasSubjectLinkEntityAttributeValueCache3 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache3); - if (!hasSubjectLinkMemberFromId2 && !hasSubjectLinkMemberFromId3 && !hasSubjectLinkMemberToId2 && !hasSubjectLinkMemberToId3) { + if (!hasSubjectLinkEntityAttributeValueCache0 && !hasSubjectLinkEntityAttributeValueCache1 && !hasSubjectLinkEntityAttributeValueCache2 && !hasSubjectLinkEntityAttributeValueCache3) { return; } @@ -131,10 +131,10 @@ public void retrieveSubjectLink() { } else { for (GcGrouperSyncMember gcGrouperSyncMember : gcGrouperSyncMembers) { boolean needsRefresh = false; - needsRefresh = needsRefresh || (hasSubjectLinkMemberFromId2 && StringUtils.isBlank(gcGrouperSyncMember.getMemberFromId2())); - needsRefresh = needsRefresh || (hasSubjectLinkMemberFromId3 && StringUtils.isBlank(gcGrouperSyncMember.getMemberFromId3())); - needsRefresh = needsRefresh || (hasSubjectLinkMemberToId2 && StringUtils.isBlank(gcGrouperSyncMember.getMemberToId2())); - needsRefresh = needsRefresh || (hasSubjectLinkMemberToId3 && StringUtils.isBlank(gcGrouperSyncMember.getMemberToId3())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache0())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache1())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache2())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache3())); if (needsRefresh) { gcGrouperSyncMembersToRefreshSubjectLink.add(gcGrouperSyncMember); } @@ -159,23 +159,23 @@ public void updateGroupLink(Collection provisioningGro } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String groupLinkGroupFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupFromId2(); - GrouperProvisioningConfigurationAttribute groupLinkGroupFromId2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupFromId2Attribute(); - boolean hasGroupLinkGroupFromId2 = !StringUtils.isBlank(groupLinkGroupFromId2) || groupLinkGroupFromId2Attribute != null; + String groupLinkGroupAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache0(); + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache0Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache0Attribute(); + boolean hasGroupLinkGroupAttributeValueCache0 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache0) || groupLinkGroupAttributeValueCache0Attribute != null; - String groupLinkGroupFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupFromId3(); - GrouperProvisioningConfigurationAttribute groupLinkGroupFromId3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupFromId3Attribute(); - boolean hasGroupLinkGroupFromId3 = !StringUtils.isBlank(groupLinkGroupFromId3) || groupLinkGroupFromId3Attribute != null; + String groupLinkGroupAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache1(); + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache1Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache1Attribute(); + boolean hasGroupLinkGroupAttributeValueCache1 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache1) || groupLinkGroupAttributeValueCache1Attribute != null; - String groupLinkGroupToId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupToId2(); - GrouperProvisioningConfigurationAttribute groupLinkGroupToId2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupToId2Attribute(); - boolean hasGroupLinkGroupToId2 = !StringUtils.isBlank(groupLinkGroupToId2) || groupLinkGroupToId2Attribute != null; + String groupLinkGroupAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache2(); + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache2Attribute(); + boolean hasGroupLinkGroupAttributeValueCache2 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache2) || groupLinkGroupAttributeValueCache2Attribute != null; - String groupLinkGroupToId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupToId3(); - GrouperProvisioningConfigurationAttribute groupLinkGroupToId3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupToId3Attribute(); - boolean hasGroupLinkGroupToId3 = !StringUtils.isBlank(groupLinkGroupToId3) || groupLinkGroupToId3Attribute != null; + String groupLinkGroupAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache3(); + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache3Attribute(); + boolean hasGroupLinkGroupAttributeValueCache3 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache3) || groupLinkGroupAttributeValueCache3Attribute != null; - if (!hasGroupLinkGroupFromId2 && !hasGroupLinkGroupFromId3 && !hasGroupLinkGroupToId2 && !hasGroupLinkGroupToId3) { + if (!hasGroupLinkGroupAttributeValueCache0 && !hasGroupLinkGroupAttributeValueCache1 && !hasGroupLinkGroupAttributeValueCache2 && !hasGroupLinkGroupAttributeValueCache3) { return; } @@ -211,54 +211,54 @@ public void updateGroupLink(Collection provisioningGro Map variableMap = new HashMap(); variableMap.put("targetGroup", targetGroup); - if (hasGroupLinkGroupFromId2) { - String groupFromId2Value = null; - if (groupLinkGroupFromId2Attribute != null) { - groupFromId2Value = targetGroup.retrieveAttributeValueString(groupLinkGroupFromId2Attribute); + if (hasGroupLinkGroupAttributeValueCache0) { + String groupAttributeValueCache0Value = null; + if (groupLinkGroupAttributeValueCache0Attribute != null) { + groupAttributeValueCache0Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache0Attribute); } else { - groupFromId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupFromId2, variableMap, true, false, true)); + groupAttributeValueCache0Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache0, variableMap, true, false, true)); } - if (!StringUtils.equals(groupFromId2Value, gcGrouperSyncGroup.getGroupFromId2())) { - gcGrouperSyncGroup.setGroupFromId2(groupFromId2Value); + if (!StringUtils.equals(groupAttributeValueCache0Value, gcGrouperSyncGroup.getGroupAttributeValueCache0())) { + gcGrouperSyncGroup.setGroupAttributeValueCache0(groupAttributeValueCache0Value); hasChange = true; } } - if (hasGroupLinkGroupFromId3) { - String groupFromId3Value = null; - if (groupLinkGroupFromId3Attribute != null) { - groupFromId3Value = targetGroup.retrieveAttributeValueString(groupLinkGroupFromId3Attribute); + if (hasGroupLinkGroupAttributeValueCache1) { + String groupAttributeValueCache1Value = null; + if (groupLinkGroupAttributeValueCache1Attribute != null) { + groupAttributeValueCache1Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache1Attribute); } else { - groupFromId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupFromId3, variableMap, true, false, true)); + groupAttributeValueCache1Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache1, variableMap, true, false, true)); } - if (!StringUtils.equals(groupFromId3Value, gcGrouperSyncGroup.getGroupFromId3())) { - gcGrouperSyncGroup.setGroupFromId3(groupFromId3Value); + if (!StringUtils.equals(groupAttributeValueCache1Value, gcGrouperSyncGroup.getGroupAttributeValueCache1())) { + gcGrouperSyncGroup.setGroupAttributeValueCache1(groupAttributeValueCache1Value); hasChange = true; } } - if (hasGroupLinkGroupToId2) { - String groupToId2Value = null; - if (groupLinkGroupToId2Attribute != null) { - groupToId2Value = targetGroup.retrieveAttributeValueString(groupLinkGroupToId2Attribute); + if (hasGroupLinkGroupAttributeValueCache2) { + String groupAttributeValueCache2Value = null; + if (groupLinkGroupAttributeValueCache2Attribute != null) { + groupAttributeValueCache2Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache2Attribute); } else { - groupToId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupToId2, variableMap, true, false, true)); + groupAttributeValueCache2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache2, variableMap, true, false, true)); } - if (!StringUtils.equals(groupToId2Value, gcGrouperSyncGroup.getGroupToId2())) { - gcGrouperSyncGroup.setGroupToId2(groupToId2Value); + if (!StringUtils.equals(groupAttributeValueCache2Value, gcGrouperSyncGroup.getGroupAttributeValueCache2())) { + gcGrouperSyncGroup.setGroupAttributeValueCache2(groupAttributeValueCache2Value); hasChange = true; } } - if (hasGroupLinkGroupFromId3) { - String groupToId3Value = null; - if (groupLinkGroupToId3Attribute != null) { - groupToId3Value = targetGroup.retrieveAttributeValueString(groupLinkGroupToId3Attribute); + if (hasGroupLinkGroupAttributeValueCache1) { + String groupAttributeValueCache3Value = null; + if (groupLinkGroupAttributeValueCache3Attribute != null) { + groupAttributeValueCache3Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache3Attribute); } else { - groupToId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupToId3, variableMap, true, false, true)); + groupAttributeValueCache3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache3, variableMap, true, false, true)); } - if (!StringUtils.equals(groupToId3Value, gcGrouperSyncGroup.getGroupToId3())) { - gcGrouperSyncGroup.setGroupToId3(groupToId3Value); + if (!StringUtils.equals(groupAttributeValueCache3Value, gcGrouperSyncGroup.getGroupAttributeValueCache3())) { + gcGrouperSyncGroup.setGroupAttributeValueCache3(groupAttributeValueCache3Value); hasChange = true; } } @@ -382,23 +382,23 @@ public void updateEntityLink(Collection provisioningE } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String entityLinkMemberFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkMemberFromId2(); - GrouperProvisioningConfigurationAttribute entityLinkMemberFromId2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkMemberFromId2Attribute(); - boolean hasEntityLinkMemberFromId2 = !StringUtils.isBlank(entityLinkMemberFromId2) || entityLinkMemberFromId2Attribute != null; + String entityLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache0(); + GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache0Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache0Attribute(); + boolean hasEntityLinkEntityAttributeValueCache0 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache0) || entityLinkEntityAttributeValueCache0Attribute != null; - String entityLinkMemberFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkMemberFromId3(); - GrouperProvisioningConfigurationAttribute entityLinkMemberFromId3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkMemberFromId3Attribute(); - boolean hasEntityLinkMemberFromId3 = !StringUtils.isBlank(entityLinkMemberFromId3) || entityLinkMemberFromId3Attribute != null; + String entityLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache1(); + GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache1Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache1Attribute(); + boolean hasEntityLinkEntityAttributeValueCache1 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache1) || entityLinkEntityAttributeValueCache1Attribute != null; - String entityLinkMemberToId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkMemberToId2(); - GrouperProvisioningConfigurationAttribute entityLinkMemberToId2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkMemberToId2Attribute(); - boolean hasEntityLinkMemberToId2 = !StringUtils.isBlank(entityLinkMemberToId2) || entityLinkMemberToId2Attribute != null; + String entityLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache2(); + GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache2Attribute(); + boolean hasEntityLinkEntityAttributeValueCache2 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache2) || entityLinkEntityAttributeValueCache2Attribute != null; - String entityLinkMemberToId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkMemberToId3(); - GrouperProvisioningConfigurationAttribute entityLinkMemberToId3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkMemberToId3Attribute(); - boolean hasEntityLinkMemberToId3 = !StringUtils.isBlank(entityLinkMemberToId3) || entityLinkMemberToId3Attribute != null; + String entityLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache3(); + GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache3Attribute(); + boolean hasEntityLinkEntityAttributeValueCache3 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache3) || entityLinkEntityAttributeValueCache3Attribute != null; - if (!hasEntityLinkMemberFromId2 && !hasEntityLinkMemberFromId3 && !hasEntityLinkMemberToId2 && !hasEntityLinkMemberToId3) { + if (!hasEntityLinkEntityAttributeValueCache0 && !hasEntityLinkEntityAttributeValueCache1 && !hasEntityLinkEntityAttributeValueCache2 && !hasEntityLinkEntityAttributeValueCache3) { return; } @@ -432,54 +432,54 @@ public void updateEntityLink(Collection provisioningE Map variableMap = new HashMap(); variableMap.put("targetEntity", targetEntity); - if (hasEntityLinkMemberFromId2) { + if (hasEntityLinkEntityAttributeValueCache0) { String entityFromId2Value = null; - if (entityLinkMemberFromId2Attribute != null) { - entityFromId2Value = targetEntity.retrieveAttributeValueString(entityLinkMemberFromId2Attribute); + if (entityLinkEntityAttributeValueCache0Attribute != null) { + entityFromId2Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache0Attribute); } else { - entityFromId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkMemberFromId2, variableMap, true, false, true)); + entityFromId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache0, variableMap, true, false, true)); } - if (!StringUtils.equals(entityFromId2Value, gcGrouperSyncEntity.getMemberFromId2())) { - gcGrouperSyncEntity.setMemberFromId2(entityFromId2Value); + if (!StringUtils.equals(entityFromId2Value, gcGrouperSyncEntity.getEntityAttributeValueCache0())) { + gcGrouperSyncEntity.setEntityAttributeValueCache0(entityFromId2Value); hasChange = true; } } - if (hasEntityLinkMemberFromId3) { + if (hasEntityLinkEntityAttributeValueCache1) { String entityFromId3Value = null; - if (entityLinkMemberFromId3Attribute != null) { - entityFromId3Value = targetEntity.retrieveAttributeValueString(entityLinkMemberFromId3Attribute); + if (entityLinkEntityAttributeValueCache1Attribute != null) { + entityFromId3Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache1Attribute); } else { - entityFromId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkMemberFromId3, variableMap, true, false, true)); + entityFromId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache1, variableMap, true, false, true)); } - if (!StringUtils.equals(entityFromId3Value, gcGrouperSyncEntity.getMemberFromId3())) { - gcGrouperSyncEntity.setMemberFromId3(entityFromId3Value); + if (!StringUtils.equals(entityFromId3Value, gcGrouperSyncEntity.getEntityAttributeValueCache1())) { + gcGrouperSyncEntity.setEntityAttributeValueCache1(entityFromId3Value); hasChange = true; } } - if (hasEntityLinkMemberToId2) { + if (hasEntityLinkEntityAttributeValueCache2) { String entityToId2Value = null; - if (entityLinkMemberToId2Attribute != null) { - entityToId2Value = targetEntity.retrieveAttributeValueString(entityLinkMemberToId2Attribute); + if (entityLinkEntityAttributeValueCache2Attribute != null) { + entityToId2Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache2Attribute); } else { - entityToId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkMemberToId2, variableMap, true, false, true)); + entityToId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache2, variableMap, true, false, true)); } - if (!StringUtils.equals(entityToId2Value, gcGrouperSyncEntity.getMemberToId2())) { - gcGrouperSyncEntity.setMemberToId2(entityToId2Value); + if (!StringUtils.equals(entityToId2Value, gcGrouperSyncEntity.getEntityAttributeValueCache2())) { + gcGrouperSyncEntity.setEntityAttributeValueCache2(entityToId2Value); hasChange = true; } } - if (hasEntityLinkMemberToId3) { + if (hasEntityLinkEntityAttributeValueCache3) { String entityToId3Value = null; - if (entityLinkMemberToId3Attribute != null) { - entityToId3Value = targetEntity.retrieveAttributeValueString(entityLinkMemberToId3Attribute); + if (entityLinkEntityAttributeValueCache3Attribute != null) { + entityToId3Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache3Attribute); } else { - entityToId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkMemberToId3, variableMap, true, false, true)); + entityToId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache3, variableMap, true, false, true)); } - if (!StringUtils.equals(entityToId3Value, gcGrouperSyncEntity.getMemberToId3())) { - gcGrouperSyncEntity.setMemberToId3(entityToId3Value); + if (!StringUtils.equals(entityToId3Value, gcGrouperSyncEntity.getEntityAttributeValueCache3())) { + gcGrouperSyncEntity.setEntityAttributeValueCache3(entityToId3Value); hasChange = true; } } @@ -542,23 +542,23 @@ public boolean subjectLinkMissing(GcGrouperSyncMember gcGrouperSyncMember) { } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String subjectLinkMemberFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberFromId2(); - boolean hasSubjectLinkMemberFromId2 = !StringUtils.isBlank(subjectLinkMemberFromId2); + String subjectLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache0(); + boolean hasSubjectLinkEntityAttributeValueCache0 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache0); - String subjectLinkMemberFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberFromId3(); - boolean hasSubjectLinkMemberFromId3 = !StringUtils.isBlank(subjectLinkMemberFromId3); + String subjectLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache1(); + boolean hasSubjectLinkEntityAttributeValueCache1 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache1); - String subjectLinkMemberToId2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberToId2(); - boolean hasSubjectLinkMemberToId2 = !StringUtils.isBlank(subjectLinkMemberToId2); + String subjectLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache2(); + boolean hasSubjectLinkEntityAttributeValueCache2 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache2); - String subjectLinkMemberToId3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkMemberToId3(); - boolean hasSubjectLinkMemberToId3 = !StringUtils.isBlank(subjectLinkMemberToId3); + String subjectLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache3(); + boolean hasSubjectLinkEntityAttributeValueCache3 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache3); boolean needsRefresh = false; - needsRefresh = needsRefresh || (hasSubjectLinkMemberFromId2 && StringUtils.isBlank(gcGrouperSyncMember.getMemberFromId2())); - needsRefresh = needsRefresh || (hasSubjectLinkMemberFromId3 && StringUtils.isBlank(gcGrouperSyncMember.getMemberFromId3())); - needsRefresh = needsRefresh || (hasSubjectLinkMemberToId2 && StringUtils.isBlank(gcGrouperSyncMember.getMemberToId2())); - needsRefresh = needsRefresh || (hasSubjectLinkMemberToId3 && StringUtils.isBlank(gcGrouperSyncMember.getMemberToId3())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache0())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache1())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache2())); + needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache3())); return needsRefresh; } @@ -582,12 +582,12 @@ public List retrieveIncrementalNonRecalcTargetEntitiesThatNe } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasEntityLinkMemberFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberFromId2(); - boolean hasEntityLinkMemberFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberFromId3(); - boolean hasEntityLinkMemberToId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberToId2(); - boolean hasEntityLinkMemberToId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkMemberToId3(); + boolean hasEntityLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache0(); + boolean hasEntityLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache1(); + boolean hasEntityLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache2(); + boolean hasEntityLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache3(); - if (!hasEntityLinkMemberFromId2 && !hasEntityLinkMemberFromId3 && !hasEntityLinkMemberToId2 && !hasEntityLinkMemberToId3) { + if (!hasEntityLinkEntityAttributeValueCache0 && !hasEntityLinkEntityAttributeValueCache1 && !hasEntityLinkEntityAttributeValueCache2 && !hasEntityLinkEntityAttributeValueCache3) { return grouperTargetEntities; } @@ -612,19 +612,19 @@ public List retrieveIncrementalNonRecalcTargetEntitiesThatNe continue; } - if (hasEntityLinkMemberFromId2 && StringUtils.isBlank(gcGrouperSyncEntity.getMemberFromId2())) { + if (hasEntityLinkEntityAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache0())) { hasChange = true; } - if (hasEntityLinkMemberFromId3 && StringUtils.isBlank(gcGrouperSyncEntity.getMemberFromId3())) { + if (hasEntityLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache1())) { hasChange = true; } - if (hasEntityLinkMemberToId2 && StringUtils.isBlank(gcGrouperSyncEntity.getMemberToId2())) { + if (hasEntityLinkEntityAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache2())) { hasChange = true; } - if (hasEntityLinkMemberFromId3 && StringUtils.isBlank(gcGrouperSyncEntity.getMemberToId3())) { + if (hasEntityLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache3())) { hasChange = true; } if (hasChange) { @@ -654,12 +654,12 @@ public List retrieveIncrementalNonRecalcTargetGroupsThatNeedL } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasGroupLinkGroupFromId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupFromId2(); - boolean hasGroupLinkGroupFromId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupFromId3(); - boolean hasGroupLinkGroupToId2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupToId2(); - boolean hasGroupLinkGroupToId3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupToId3(); + boolean hasGroupLinkGroupAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache0(); + boolean hasGroupLinkGroupAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache1(); + boolean hasGroupLinkGroupAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache2(); + boolean hasGroupLinkGroupAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache3(); - if (!hasGroupLinkGroupFromId2 && !hasGroupLinkGroupFromId3 && !hasGroupLinkGroupToId2 && !hasGroupLinkGroupToId3) { + if (!hasGroupLinkGroupAttributeValueCache0 && !hasGroupLinkGroupAttributeValueCache1 && !hasGroupLinkGroupAttributeValueCache2 && !hasGroupLinkGroupAttributeValueCache3) { return grouperTargetGroups; } @@ -684,19 +684,19 @@ public List retrieveIncrementalNonRecalcTargetGroupsThatNeedL continue; } - if (hasGroupLinkGroupFromId2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupFromId2())) { + if (hasGroupLinkGroupAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache0())) { hasChange = true; } - if (hasGroupLinkGroupFromId3 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupFromId3())) { + if (hasGroupLinkGroupAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache1())) { hasChange = true; } - if (hasGroupLinkGroupToId2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupToId2())) { + if (hasGroupLinkGroupAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache2())) { hasChange = true; } - if (hasGroupLinkGroupFromId3 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupToId3())) { + if (hasGroupLinkGroupAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache3())) { hasChange = true; } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java index 9247d4b270ff..5d7e0400e003 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java @@ -529,17 +529,17 @@ public Object translateFromGroupSyncField(GcGrouperSyncGroup gcGrouperSyncGroup, if (StringUtils.equals("groupName", field)) { return gcGrouperSyncGroup.getGroupName(); } - if (StringUtils.equals("groupFromId2", field)) { - return gcGrouperSyncGroup.getGroupFromId2(); + if (StringUtils.equals("groupAttributeValueCache0", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache0(); } - if (StringUtils.equals("groupFromId3", field)) { - return gcGrouperSyncGroup.getGroupFromId3(); + if (StringUtils.equals("groupAttributeValueCache1", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache1(); } - if (StringUtils.equals("groupToId2", field)) { - return gcGrouperSyncGroup.getGroupToId2(); + if (StringUtils.equals("groupAttributeValueCache2", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache2(); } - if (StringUtils.equals("groupToId3", field)) { - return gcGrouperSyncGroup.getGroupToId3(); + if (StringUtils.equals("groupAttributeValueCache3", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache3(); } throw new RuntimeException("Not expecting groupSyncField: '" + field + "'"); } @@ -603,17 +603,17 @@ public Object translateFromMemberSyncField(GcGrouperSyncMember gcGrouperSyncMemb if (StringUtils.equals("subjectIdentifier", field)) { return gcGrouperSyncMember.getSubjectIdentifier(); } - if (StringUtils.equals("memberFromId2", field)) { - return gcGrouperSyncMember.getMemberFromId2(); + if (StringUtils.equals("entityAttributeValueCache0", field)) { + return gcGrouperSyncMember.getEntityAttributeValueCache0(); } - if (StringUtils.equals("memberFromId3", field)) { - return gcGrouperSyncMember.getMemberFromId3(); + if (StringUtils.equals("entityAttributeValueCache1", field)) { + return gcGrouperSyncMember.getEntityAttributeValueCache1(); } - if (StringUtils.equals("memberToId2", field)) { - return gcGrouperSyncMember.getMemberToId2(); + if (StringUtils.equals("entityAttributeValueCache2", field)) { + return gcGrouperSyncMember.getEntityAttributeValueCache2(); } - if (StringUtils.equals("memberToId3", field)) { - return gcGrouperSyncMember.getMemberToId3(); + if (StringUtils.equals("entityAttributeValueCache3", field)) { + return gcGrouperSyncMember.getEntityAttributeValueCache3(); } throw new RuntimeException("Not expecting memberSyncField: '" + field + "'"); } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/usdu/UsduJob.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/usdu/UsduJob.java index 43900616ac09..3bd041cc7208 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/usdu/UsduJob.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/usdu/UsduJob.java @@ -292,7 +292,7 @@ private int syncProvisioningData(List memberIds, Map me int totalObjectsStored = 0; - Pattern provisionerPatternWithMemberInfo = Pattern.compile("^provisioner\\.(\\w+)\\.common\\.subjectLink\\.(memberFromId2|memberFromId3|memberToId2|memberToId3)$"); + Pattern provisionerPatternWithMemberInfo = Pattern.compile("^provisioner\\.(\\w+)\\.common\\.subjectLink\\.(entityAttributeValueCache0|entityAttributeValueCache1|entityAttributeValueCache2|entityAttributeValueCache3)$"); Map provisionerPropsWithMemberInfo = GrouperLoaderConfig.retrieveConfig().propertiesMap(provisionerPatternWithMemberInfo); Set configNames = new HashSet(); for (String property : provisionerPropsWithMemberInfo.keySet()) { @@ -310,20 +310,20 @@ private int syncProvisioningData(List memberIds, Map me continue; } - String memberFromId2 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.memberFromId2"); - String memberFromId3 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.memberFromId3"); - String memberToId2 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.memberToId2"); - String memberToId3 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.memberToId3"); + String entityAttributeValueCache0 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.entityAttributeValueCache0"); + String entityAttributeValueCache1 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.entityAttributeValueCache1"); + String entityAttributeValueCache2 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.entityAttributeValueCache2"); + String entityAttributeValueCache3 = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + configName + ".common.subjectLink.entityAttributeValueCache3"); - boolean autoMemberFromId2 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoMemberFromId2", true); - boolean autoMemberFromId3 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoMemberFromId3", true); - boolean autoMemberToId2 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoMemberToId2", true); - boolean autoMemberToId3 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoMemberToId3", true); + boolean autoEntityAttributeValueCache0 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoEntityAttributeValueCache0", true); + boolean autoEntityAttributeValueCache1 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoEntityAttributeValueCache1", true); + boolean autoEntityAttributeValueCache2 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoEntityAttributeValueCache2", true); + boolean autoEntityAttributeValueCache3 = GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + configName + ".common.subjectLink.autoEntityAttributeValueCache3", true); - if ((!autoMemberFromId2 || GrouperUtil.isBlank(memberFromId2)) && - (!autoMemberFromId3 || GrouperUtil.isBlank(memberFromId3)) && - (!autoMemberToId2 || GrouperUtil.isBlank(memberToId2)) && - (!autoMemberToId3 || GrouperUtil.isBlank(memberToId3))) { + if ((!autoEntityAttributeValueCache0 || GrouperUtil.isBlank(entityAttributeValueCache0)) && + (!autoEntityAttributeValueCache1 || GrouperUtil.isBlank(entityAttributeValueCache1)) && + (!autoEntityAttributeValueCache2 || GrouperUtil.isBlank(entityAttributeValueCache2)) && + (!autoEntityAttributeValueCache3 || GrouperUtil.isBlank(entityAttributeValueCache3))) { // nothing to do continue; } @@ -366,24 +366,24 @@ private int syncProvisioningData(List memberIds, Map me Map variableMap = new HashMap(); variableMap.put("subject", subject); - if (autoMemberFromId2 && !StringUtils.isBlank(memberFromId2)) { - String memberFromId2Value = GrouperUtil.substituteExpressionLanguage(memberFromId2, variableMap); - gcGrouperSyncMember.setMemberFromId2(memberFromId2Value); + if (autoEntityAttributeValueCache0 && !StringUtils.isBlank(entityAttributeValueCache0)) { + String entityAttributeValueCache0Value = GrouperUtil.substituteExpressionLanguage(entityAttributeValueCache0, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache0(entityAttributeValueCache0Value); } - if (autoMemberFromId3 && !StringUtils.isBlank(memberFromId3)) { - String memberFromId3Value = GrouperUtil.substituteExpressionLanguage(memberFromId3, variableMap); - gcGrouperSyncMember.setMemberFromId3(memberFromId3Value); + if (autoEntityAttributeValueCache1 && !StringUtils.isBlank(entityAttributeValueCache1)) { + String entityAttributeValueCache1Value = GrouperUtil.substituteExpressionLanguage(entityAttributeValueCache1, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache1(entityAttributeValueCache1Value); } - if (autoMemberToId2 && !StringUtils.isBlank(memberToId2)) { - String memberToId2Value = GrouperUtil.substituteExpressionLanguage(memberToId2, variableMap); - gcGrouperSyncMember.setMemberToId2(memberToId2Value); + if (autoEntityAttributeValueCache2 && !StringUtils.isBlank(entityAttributeValueCache2)) { + String entityAttributeValueCache2Value = GrouperUtil.substituteExpressionLanguage(entityAttributeValueCache2, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache2(entityAttributeValueCache2Value); } - if (autoMemberToId3 && !StringUtils.isBlank(memberToId3)) { - String memberToId3Value = GrouperUtil.substituteExpressionLanguage(memberToId3, variableMap); - gcGrouperSyncMember.setMemberToId3(memberToId3Value); + if (autoEntityAttributeValueCache3 && !StringUtils.isBlank(entityAttributeValueCache3)) { + String entityAttributeValueCache3Value = GrouperUtil.substituteExpressionLanguage(entityAttributeValueCache3, variableMap); + gcGrouperSyncMember.setEntityAttributeValueCache3(entityAttributeValueCache3Value); } } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GrouperSyncGroupDAO.hbm.xml b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GrouperSyncGroupDAO.hbm.xml index a0b7be0de987..1f347384ed40 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GrouperSyncGroupDAO.hbm.xml +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GrouperSyncGroupDAO.hbm.xml @@ -62,13 +62,13 @@ - - + + - - + + - - + + - - + + diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/azure/AzureProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/azure/AzureProvisionerTestUtils.java index 89949aa0ebd9..c7868b198838 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/azure/AzureProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/azure/AzureProvisionerTestUtils.java @@ -64,7 +64,7 @@ public static void configureAzureProvisioner(AzureProvisionerTestConfigInput pro configureProvisionerSuffix(provisioningTestConfigInput, "azureExternalSystemConfigId", "myAzure"); configureProvisionerSuffix(provisioningTestConfigInput, "class", "edu.internet2.middleware.grouper.app.azure.GrouperAzureProvisioner"); - configureProvisionerSuffix(provisioningTestConfigInput, "common.subjectLink.memberFromId2", "${subject.getAttributeValue('email')}"); + configureProvisionerSuffix(provisioningTestConfigInput, "common.subjectLink.entityAttributeValueCache0", "${subject.getAttributeValue('email')}"); configureProvisionerSuffix(provisioningTestConfigInput, "debugLog", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "deleteEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "deleteEntitiesIfNotExistInGrouper", "true"); @@ -99,7 +99,7 @@ public static void configureAzureProvisioner(AzureProvisionerTestConfigInput pro configureProvisionerSuffix(provisioningTestConfigInput, "showProvisioningDiagnostics", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "subjectSourcesToProvision", "jdbc"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "accountEnabled"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateExpression", "${'true'}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateExpressionType", "translationScript"); @@ -118,10 +118,10 @@ public static void configureAzureProvisioner(AzureProvisionerTestConfigInput pro } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.name", "userPrincipalName"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateExpression", "${gcGrouperSyncMember.memberFromId2}"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateExpression", "${gcGrouperSyncMember.entityAttributeValueCache0}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateExpressionType", "translationScript"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.matchingId", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "displayName"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.searchAttribute", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/azure/GrouperAzureProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/azure/GrouperAzureProvisionerTest.java index 6f268a6920dd..f6421618e9c9 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/azure/GrouperAzureProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/azure/GrouperAzureProvisionerTest.java @@ -140,7 +140,7 @@ public void testFullSyncAzure() { GcGrouperSyncGroup gcGrouperSyncGroup = gcGrouperSync.getGcGrouperSyncGroupDao().groupRetrieveByGroupId(testGroup.getId()); assertEquals(testGroup.getId(), gcGrouperSyncGroup.getGroupId()); assertEquals(testGroup.getName(), gcGrouperSyncGroup.getGroupName()); - assertEquals(grouperAzureGroup.getId(), gcGrouperSyncGroup.getGroupToId2()); + assertEquals(grouperAzureGroup.getId(), gcGrouperSyncGroup.getGroupAttributeValueCache2()); //now remove one of the subjects from the testGroup diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/duo/DuoProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/duo/DuoProvisionerTestUtils.java index 6bb7dc838206..c562718ca9c7 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/duo/DuoProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/duo/DuoProvisionerTestUtils.java @@ -86,9 +86,9 @@ public static void configureDuoProvisioner(DuoProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateFromGrouperProvisioningEntityField", "subjectId"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateToMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.matchingId", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "name"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.searchAttribute", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/duo/GrouperDuoProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/duo/GrouperDuoProvisionerTest.java index 64aba51c8d93..0379429e1ec0 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/duo/GrouperDuoProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/duo/GrouperDuoProvisionerTest.java @@ -349,7 +349,7 @@ public void testFullProvisionGroupAndThenDeleteTheGroup() { GcGrouperSyncGroup gcGrouperSyncGroup = gcGrouperSync.getGcGrouperSyncGroupDao().groupRetrieveByGroupId(testGroup.getId()); assertEquals(testGroup.getId(), gcGrouperSyncGroup.getGroupId()); assertEquals(testGroup.getName(), gcGrouperSyncGroup.getGroupName()); - assertEquals(grouperDuoGroup.getGroup_id(), gcGrouperSyncGroup.getGroupToId2()); + assertEquals(grouperDuoGroup.getGroup_id(), gcGrouperSyncGroup.getGroupAttributeValueCache2()); //now remove one of the subjects from the testGroup testGroup.deleteMember(SubjectTestHelper.SUBJ1); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/duo/role/DuoRoleProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/duo/role/DuoRoleProvisionerTestUtils.java index fafb23f21f21..1c353284ead1 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/duo/role/DuoRoleProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/duo/role/DuoRoleProvisionerTestUtils.java @@ -71,10 +71,10 @@ public static void configureDuoRoleProvisioner(DuoRoleProvisionerTestConfigInput configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateFromGrouperProvisioningEntityField", "subjectId"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateToMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "id"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.select", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.showAttributeCrud", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.insert", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.matchingId", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/google/GoogleProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/google/GoogleProvisionerTestUtils.java index 71610e629fc2..f02033179e09 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/google/GoogleProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/google/GoogleProvisionerTestUtils.java @@ -74,7 +74,7 @@ public static void configureGoogleProvisioner(GoogleProvisionerTestConfigInput p configureProvisionerSuffix(provisioningTestConfigInput, "allowWebPosting", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "class", "edu.internet2.middleware.grouper.app.google.GrouperGoogleProvisioner"); - configureProvisionerSuffix(provisioningTestConfigInput, "common.subjectLink.memberFromId2", "${subject.getAttributeValue('email')}"); + configureProvisionerSuffix(provisioningTestConfigInput, "common.subjectLink.entityAttributeValueCache0", "${subject.getAttributeValue('email')}"); configureProvisionerSuffix(provisioningTestConfigInput, "debugLog", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "deleteEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "deleteEntitiesIfGrouperDeleted", "true"); @@ -112,7 +112,7 @@ public static void configureGoogleProvisioner(GoogleProvisionerTestConfigInput p configureProvisionerSuffix(provisioningTestConfigInput, "showProvisioningDiagnostics", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "subjectSourcesToProvision", "jdbc"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "givenName"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateFromGrouperProvisioningEntityField", "name"); @@ -124,7 +124,7 @@ public static void configureGoogleProvisioner(GoogleProvisionerTestConfigInput p configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.3.translateExpression", "${grouperProvisioningEntity.getId() + '@viveksachdeva.com'}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.3.translateExpressionType", "translationScript"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.matchingId", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "name"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.searchAttribute", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/google/GrouperGoogleProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/google/GrouperGoogleProvisionerTest.java index 364113920e57..fbaaf9cfc317 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/google/GrouperGoogleProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/google/GrouperGoogleProvisionerTest.java @@ -136,7 +136,7 @@ public void testIncrementalSyncGoogle() throws IOException { GcGrouperSyncGroup gcGrouperSyncGroup = gcGrouperSync.getGcGrouperSyncGroupDao().groupRetrieveByGroupId(testGroup.getId()); assertEquals(testGroup.getId(), gcGrouperSyncGroup.getGroupId()); assertEquals(testGroup.getName(), gcGrouperSyncGroup.getGroupName()); - assertEquals(grouperGoogleGroup.getId(), gcGrouperSyncGroup.getGroupToId2()); + assertEquals(grouperGoogleGroup.getId(), gcGrouperSyncGroup.getGroupAttributeValueCache2()); //now remove one of the subjects from the testGroup @@ -283,7 +283,7 @@ public void testFullSyncGoogle() throws IOException { GcGrouperSyncGroup gcGrouperSyncGroup = gcGrouperSync.getGcGrouperSyncGroupDao().groupRetrieveByGroupId(testGroup.getId()); assertEquals(testGroup.getId(), gcGrouperSyncGroup.getGroupId()); assertEquals(testGroup.getName(), gcGrouperSyncGroup.getGroupName()); - assertEquals(grouperGoogleGroup.getId(), gcGrouperSyncGroup.getGroupToId2()); + assertEquals(grouperGoogleGroup.getId(), gcGrouperSyncGroup.getGroupAttributeValueCache2()); //now remove one of the subjects from the testGroup diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java index cec64a1170bd..507ab1ee99da 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java @@ -241,7 +241,7 @@ public static void configureLdapProvisioner(LdapProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", provisioningTestConfigInput.getTranslateFromGrouperProvisioningGroupField()); } - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateGrouperToGroupSyncField", "groupFromId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateGrouperToGroupSyncField", "groupAttributeValueCache0"); } else { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "ldap_dn"); @@ -254,7 +254,7 @@ public static void configureLdapProvisioner(LdapProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", provisioningTestConfigInput.getTranslateFromGrouperProvisioningGroupField()); } - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); @@ -298,7 +298,7 @@ public static void configureLdapProvisioner(LdapProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.showAttributeValueSettings", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.multiValued", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.membershipAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.translateFromMemberSyncField", provisioningTestConfigInput.getEntityAttributeCount() > 0 ? "memberToId2" : "subjectId"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.translateFromMemberSyncField", provisioningTestConfigInput.getEntityAttributeCount() > 0 ? "entityAttributeValueCache2" : "subjectId"); } else { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.translateExpressionType", "translationScript"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.translateExpression", "'cn' + '=' + 'somethingbogussincethisisrequired'"); @@ -309,7 +309,7 @@ public static void configureLdapProvisioner(LdapProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.showAttributeValueSettings", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.multiValued", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.membershipAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.translateFromMemberSyncField", provisioningTestConfigInput.getEntityAttributeCount() > 0 ? "memberToId2" : "subjectId"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.translateFromMemberSyncField", provisioningTestConfigInput.getEntityAttributeCount() > 0 ? "entityAttributeValueCache2" : "subjectId"); } else { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.translateFromGrouperProvisioningGroupField", "description"); @@ -326,7 +326,7 @@ public static void configureLdapProvisioner(LdapProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateExpressionCreateOnly", "${'uid=' + grouperProvisioningEntity.retrieveAttributeValueString('" + provisioningTestConfigInput.getEntityUidTranslateFromGrouperProvisioningEntityField() + "') + ',ou=People,dc=example,dc=edu'}"); } - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "uid"); if (provisioningTestConfigInput.isInsertEntityAndAttributes()) { @@ -369,7 +369,7 @@ public static void configureLdapProvisioner(LdapProvisionerTestConfigInput provi } if (provisioningTestConfigInput.isMembershipStructureEntityAttributes()) { configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute." + (provisioningTestConfigInput.getEntityAttributeCount()-1) + ".name", "eduPersonEntitlement"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute." + (provisioningTestConfigInput.getEntityAttributeCount()-1) + ".translateFromGroupSyncField", provisioningTestConfigInput.getGroupAttributeCount() == 1 ? "groupFromId2" : "groupExtension"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute." + (provisioningTestConfigInput.getEntityAttributeCount()-1) + ".translateFromGroupSyncField", provisioningTestConfigInput.getGroupAttributeCount() == 1 ? "groupAttributeValueCache0" : "groupExtension"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute." + (provisioningTestConfigInput.getEntityAttributeCount()-1) + ".membershipAttribute", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute." + (provisioningTestConfigInput.getEntityAttributeCount()-1) + ".showAttributeValueSettings", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute." + (provisioningTestConfigInput.getEntityAttributeCount()-1) + ".multiValued", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/SimpleLdapProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/SimpleLdapProvisionerTest.java index a0f77a578b01..44ba7e2bad14 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/SimpleLdapProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/SimpleLdapProvisionerTest.java @@ -237,10 +237,10 @@ public void testSimpleLdapProvisionerFullLatestConfig_1() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started < gcGrouperSyncGroup.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertEquals("cn=test:testGroup,ou=Groups,dc=example,dc=edu", gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertEquals("cn=test:testGroup,ou=Groups,dc=example,dc=edu", gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -263,10 +263,10 @@ public void testSimpleLdapProvisionerFullLatestConfig_1() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started < gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -437,10 +437,10 @@ public void testSimpleLdapProvisionerFullSubjectIdentifier2() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started < gcGrouperSyncGroup.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertNull(gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -463,10 +463,10 @@ public void testSimpleLdapProvisionerFullSubjectIdentifier2() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started < gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -1244,10 +1244,10 @@ public void testSimpleLdapEntityMetadataProvisionerFull() { GrouperProvisioningOutput grouperProvisioningOutput = grouperProvisioner.provision(GrouperProvisioningType.fullProvisionFull); assertEquals(0, grouperProvisioningOutput.getRecordsWithErrors()); - // see that the entitlement value is on groupFromId2 + // see that the entitlement value is on groupAttributeValueCache0 GcGrouperSync gcGrouperSync = GcGrouperSyncDao.retrieveByProvisionerName(null, "eduPersonEntitlement"); GcGrouperSyncGroup gcGrouperSyncGroup = gcGrouperSync.getGcGrouperSyncGroupDao().groupRetrieveByGroupId(testGroup.getId()); - assertEquals("student", gcGrouperSyncGroup.getGroupFromId2()); + assertEquals("student", gcGrouperSyncGroup.getGroupAttributeValueCache0()); List ldapEntries = LdapSessionUtils.ldapSession().list("personLdap", "ou=People,dc=example,dc=edu", LdapSearchScope.SUBTREE_SCOPE, "(uid=banderson)", new String[] {"eduPersonEntitlement"}, null); @@ -1458,10 +1458,10 @@ public void testSimpleLdapProvisionerRestrictGroup() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started < gcGrouperSyncGroup.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertNull(gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -1484,10 +1484,10 @@ public void testSimpleLdapProvisionerRestrictGroup() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started < gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -1648,10 +1648,10 @@ public void testSimpleLdapProvisionerFullOverrideDn() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started <= gcGrouperSyncGroup.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertNull(gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -1674,10 +1674,10 @@ public void testSimpleLdapProvisionerFullOverrideDn() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started <= gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningAttributePropagationTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningAttributePropagationTest.java index 43ae691df982..201da08e62aa 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningAttributePropagationTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningAttributePropagationTest.java @@ -98,7 +98,7 @@ public void testIncrementalRegexRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -127,7 +127,7 @@ public void testIncrementalRegexRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -141,7 +141,7 @@ public void testIncrementalRegexRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -293,7 +293,7 @@ public void testFullRegexRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -322,7 +322,7 @@ public void testFullRegexRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -336,7 +336,7 @@ public void testFullRegexRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -485,7 +485,7 @@ public void testFullPolicyRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -514,7 +514,7 @@ public void testFullPolicyRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -528,7 +528,7 @@ public void testFullPolicyRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -675,7 +675,7 @@ public void testIncrementalPolicyRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -704,7 +704,7 @@ public void testIncrementalPolicyRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -718,7 +718,7 @@ public void testIncrementalPolicyRestriction() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -871,7 +871,7 @@ public void testIncrementalPolicyRestrictionUsingFolder() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -900,7 +900,7 @@ public void testIncrementalPolicyRestrictionUsingFolder() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -914,7 +914,7 @@ public void testIncrementalPolicyRestrictionUsingFolder() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -1070,7 +1070,7 @@ public void testIncrementalStemScopeOne() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -1099,7 +1099,7 @@ public void testIncrementalStemScopeOne() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -1113,7 +1113,7 @@ public void testIncrementalStemScopeOne() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -1320,7 +1320,7 @@ public void testFullStemScopeOne() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -1349,7 +1349,7 @@ public void testFullStemScopeOne() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -1363,7 +1363,7 @@ public void testFullStemScopeOne() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -1567,7 +1567,7 @@ public void testIncrementalStemNotProvisionable() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); @@ -1596,7 +1596,7 @@ public void testIncrementalStemNotProvisionable() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -1609,7 +1609,7 @@ public void testIncrementalStemNotProvisionable() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -1766,7 +1766,7 @@ public void testFullStemNotProvisionable() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.valueType", "long"); @@ -1794,7 +1794,7 @@ public void testFullStemNotProvisionable() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -1808,7 +1808,7 @@ public void testFullStemNotProvisionable() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -1961,7 +1961,7 @@ public void testIncrementalDirectToIndirectGroup() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.valueType", "long"); @@ -1989,7 +1989,7 @@ public void testIncrementalDirectToIndirectGroup() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -2003,7 +2003,7 @@ public void testIncrementalDirectToIndirectGroup() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); @@ -2127,7 +2127,7 @@ public void testFullMultipleProvisioners() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.1.valueType", "long"); @@ -2155,7 +2155,7 @@ public void testFullMultipleProvisioners() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetGroupAttribute.5.insert", "true"); @@ -2169,7 +2169,7 @@ public void testFullMultipleProvisioners() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest2.targetEntityAttribute.1.select", "true"); @@ -2230,7 +2230,7 @@ public void testFullMultipleProvisioners() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.valueType", "long"); @@ -2258,7 +2258,7 @@ public void testFullMultipleProvisioners() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -2272,7 +2272,7 @@ public void testFullMultipleProvisioners() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicTest.java index 8ae5f9a961b4..a13aa5c35f35 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicTest.java @@ -73,7 +73,7 @@ public void testConfigurationProvisionerGroupMatchingAttribute() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperProvisioner grouperProvisioner = GrouperProvisioner.retrieveProvisioner("ldapProvTest"); @@ -112,7 +112,7 @@ public void testConfigurationProvisionerEntityMatchingAttribute() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateExpressionType", "grouperProvisioningEntityField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateFromGrouperProvisioningEntityField", "subjectId"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperProvisioner grouperProvisioner = GrouperProvisioner.retrieveProvisioner("ldapProvTest"); @@ -151,13 +151,13 @@ public void testConfigurationProvisionerGroupMembershipAttribute() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.showAttributeValueSettings", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.name", "member"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperProvisioner grouperProvisioner = GrouperProvisioner.retrieveProvisioner("ldapProvTest"); @@ -195,12 +195,12 @@ public void testConfigurationProvisionerEntityMembershipAttribute() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateExpressionType", "grouperProvisioningEntityField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateFromGrouperProvisioningEntityField", "subjectId"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.1.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.1.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.1.name", "member"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.1.translateFromGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetEntityAttribute.1.translateFromGroupSyncField", "groupAttributeValueCache2"); GrouperProvisioner grouperProvisioner = GrouperProvisioner.retrieveProvisioner("ldapProvTest"); @@ -240,12 +240,12 @@ public void testConfigurationMetadata() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.name", "member"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.1.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.metadata.0.name", "abc"); @@ -362,7 +362,7 @@ public void testConfigurationProvisionerDoingSomething() { // provisioner.ldapProvTest.subjectSourcesToProvision = personLdapSource // provisioner.ldapProvTest.targetEntityAttribute.0.fieldName = name // provisioner.ldapProvTest.targetEntityAttribute.0.select = true - // provisioner.ldapProvTest.targetEntityAttribute.0.translateToMemberSyncField = memberToId2 + // provisioner.ldapProvTest.targetEntityAttribute.0.translateToMemberSyncField = entityAttributeValueCache2 // provisioner.ldapProvTest.targetEntityAttribute.1.matchingId = true // provisioner.ldapProvTest.targetEntityAttribute.1.name = uid // provisioner.ldapProvTest.targetEntityAttribute.1.searchAttribute = true @@ -375,7 +375,7 @@ public void testConfigurationProvisionerDoingSomething() { // provisioner.ldapProvTest.targetGroupAttribute.0.select = true // provisioner.ldapProvTest.targetGroupAttribute.0.translateExpressionType = grouperProvisioningGroupField // provisioner.ldapProvTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField = name - // provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField = groupToId2 + // provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField = groupAttributeValueCache2 // provisioner.ldapProvTest.targetGroupAttribute.0.update = true // provisioner.ldapProvTest.targetGroupAttribute.1.insert = true // provisioner.ldapProvTest.targetGroupAttribute.1.matchingId = true @@ -401,7 +401,7 @@ public void testConfigurationProvisionerDoingSomething() { // provisioner.ldapProvTest.targetGroupAttribute.4.membershipAttribute = true // provisioner.ldapProvTest.targetGroupAttribute.4.multiValued = true // provisioner.ldapProvTest.targetGroupAttribute.4.name = member - // provisioner.ldapProvTest.targetGroupAttribute.4.translateFromMemberSyncField = memberToId2 + // provisioner.ldapProvTest.targetGroupAttribute.4.translateFromMemberSyncField = entityAttributeValueCache2 // provisioner.ldapProvTest.targetGroupAttribute.5.delete = true // provisioner.ldapProvTest.targetGroupAttribute.5.insert = true // provisioner.ldapProvTest.targetGroupAttribute.5.name = description @@ -643,7 +643,7 @@ public void testConfigurationValidationGroups() { new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetEntityLink_spanid"))); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetEntityAttribute.0.name", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetEntityAttribute.0.translateToMemberSyncField", "memberFromId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache0"); errorsAndSuffixes = grouperProvisioner.retrieveGrouperProvisioningConfigurationValidation().validate(); assertFalse(errorsAndSuffixes.contains( @@ -655,22 +655,22 @@ public void testConfigurationValidationGroups() { assertTrue(errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetEntityLink_spanid"))); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.common.entityLink.memberFromId2", "${targetEntity.name}"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.common.entityLink.entityAttributeValueCache0", "${targetEntity.name}"); errorsAndSuffixes = grouperProvisioner.retrieveGrouperProvisioningConfigurationValidation().validate(); assertFalse(errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetEntityLink_spanid"))); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetEntityAttribute.0.translateToMemberSyncField", "memberFromId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache0"); errorsAndSuffixes = grouperProvisioner.retrieveGrouperProvisioningConfigurationValidation().validate(); assertFalse(errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetGroupLink_spanid"))); assertTrue(errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkMultipleToSameBucket")).assignJqueryHandle("#config_targetEntityAttribute.0.translateToMemberSyncField_spanid"))); assertTrue(errorsAndSuffixes.contains( - new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.entityLink.memberFromId2_spanid"))); + new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.entityLink.entityAttributeValueCache0_spanid"))); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().remove("provisioner.sqlProvTest.common.entityLink.memberFromId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().remove("provisioner.sqlProvTest.common.entityLink.entityAttributeValueCache0"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().remove("provisioner.sqlProvTest.hasTargetEntityLink"); errorsAndSuffixes = grouperProvisioner.retrieveGrouperProvisioningConfigurationValidation().validate(); @@ -679,7 +679,7 @@ public void testConfigurationValidationGroups() { assertFalse(errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkMultipleToSameBucket")).assignJqueryHandle("#config_targetEntityAttribute.0.translateToMemberSyncField_spanid"))); assertFalse(errorsAndSuffixes.contains( - new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.entityLink.memberFromId2_spanid"))); + new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetEntityLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.entityLink.entityAttributeValueCache0_spanid"))); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.numberOfGroupAttributes", "3"); @@ -798,7 +798,7 @@ public void testConfigurationValidationEntities() { new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetGroupLink_spanid"))); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetGroupAttribute.0.name", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupFromId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache0"); errorsAndSuffixes = GrouperProvisioner.retrieveProvisioner("sqlProvTest").retrieveGrouperProvisioningConfigurationValidation().validate(); assertFalse(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( @@ -810,23 +810,23 @@ public void testConfigurationValidationEntities() { assertTrue(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetGroupLink_spanid"))); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.common.groupLink.groupFromId2", "${targetGroup.name}"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.common.groupLink.groupAttributeValueCache0", "${targetGroup.name}"); errorsAndSuffixes = GrouperProvisioner.retrieveProvisioner("sqlProvTest").retrieveGrouperProvisioningConfigurationValidation().validate(); assertFalse(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetGroupLink_spanid"))); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupFromId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache0"); errorsAndSuffixes = GrouperProvisioner.retrieveProvisioner("sqlProvTest").retrieveGrouperProvisioningConfigurationValidation().validate(); assertFalse(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkNeedsConfig")).assignJqueryHandle("#config_hasTargetGroupLink_spanid"))); assertTrue(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkMultipleToSameBucket")).assignJqueryHandle("#config_targetGroupAttribute.0.translateToGroupSyncField_spanid"))); assertTrue(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( - new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.groupLink.groupFromId2_spanid"))); + new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.groupLink.groupAttributeValueCache0_spanid"))); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().remove("provisioner.sqlProvTest.common.groupLink.groupFromId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().remove("provisioner.sqlProvTest.common.groupLink.groupAttributeValueCache0"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().remove("provisioner.sqlProvTest.hasTargetGroupLink"); errorsAndSuffixes = GrouperProvisioner.retrieveProvisioner("sqlProvTest").retrieveGrouperProvisioningConfigurationValidation().validate(); @@ -835,7 +835,7 @@ public void testConfigurationValidationEntities() { assertFalse(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkMultipleToSameBucket")).assignJqueryHandle("#config_targetGroupAttribute.0.translateToGroupSyncField_spanid"))); assertFalse(GrouperUtil.toStringForLog(errorsAndSuffixes, true), errorsAndSuffixes.contains( - new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.groupLink.groupFromId2_spanid"))); + new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("provisioning.configuration.validation.targetGroupLinkMultipleToSameBucket")).assignJqueryHandle("#config_common.groupLink.groupAttributeValueCache0_spanid"))); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.sqlProvTest.abc123", "def456"); errorsAndSuffixes = GrouperProvisioner.retrieveProvisioner("sqlProvTest").retrieveGrouperProvisioningConfigurationValidation().validate(); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningServiceTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningServiceTest.java index cd40875e8229..db2a68a6a73b 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningServiceTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningServiceTest.java @@ -771,7 +771,7 @@ public void testSaveOrUpdateProvisioningAttributes() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.select", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.name", "businessCategory"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.1.insert", "true"); @@ -798,7 +798,7 @@ public void testSaveOrUpdateProvisioningAttributes() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.defaultValue", "cn=admin,dc=example,dc=edu"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.multiValued", "true"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.membershipAttribute", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.name", "description"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetGroupAttribute.5.insert", "true"); @@ -812,7 +812,7 @@ public void testSaveOrUpdateProvisioningAttributes() { GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.name", "name"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.select", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.name", "uid"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.junitProvisioningAttributePropagationTest.targetEntityAttribute.1.select", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java index 393306efebe2..7162d76920db 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java @@ -77,7 +77,7 @@ public void testLdapProvisionerConfigurationInsertEditDelete() { attribute = provisionerConfiguration.retrieveAttributes().get("insertGroups"); attribute.setValue("true"); - attribute = provisionerConfiguration.retrieveAttributes().get("common.groupLink.groupFromId2"); + attribute = provisionerConfiguration.retrieveAttributes().get("common.groupLink.groupAttributeValueCache0"); attribute.setValue("test"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("ldap.ldapExternalSystem.url", "ldap://localhost:389"); @@ -103,7 +103,7 @@ public void testLdapProvisionerConfigurationInsertEditDelete() { // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.update", "true"); // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); -// GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupToId2"); +// GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); StringBuilder message = new StringBuilder(); List errorsToDisplay = new ArrayList(); @@ -272,7 +272,7 @@ public void testSqlProvisionerConfigurationInsertEditDelete() { attribute = provisionerConfiguration.retrieveAttributes().get("dbExternalSystemConfigId"); attribute.setValue("Database External System"); - attribute = provisionerConfiguration.retrieveAttributes().get("common.entityLink.memberFromId2"); + attribute = provisionerConfiguration.retrieveAttributes().get("common.entityLink.entityAttributeValueCache0"); attribute.setValue("test"); // set the following two values so that we can test that some internal attributes are also being saved correctly in the db. diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/scim/GrouperScimProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/scim/GrouperScimProvisionerTest.java index 00319dc547a9..29ef1ff394ac 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/scim/GrouperScimProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/scim/GrouperScimProvisionerTest.java @@ -83,7 +83,7 @@ public void testGithubIncrementalSync() { .assignConfigId("githubProvisioner").assignChangelogConsumerConfigId("githubScimProvTestCLC") .assignAcceptHeader("application/vnd.github.v3+json") .assignBearerTokenExternalSystemConfigId("githubExternalSystem") - .addSubjectLink("memberFromId2", "${subject.getAttributeValue('email')}") + .addSubjectLink("entityAttributeValueCache0", "${subject.getAttributeValue('email')}") .assignEntityDeleteType("deleteEntitiesIfNotExistInGrouper") .assignGroupOfUsersToProvision(testGroup) .assignScimMembershipType("group") @@ -166,7 +166,7 @@ public void testGithubFullSync() { .assignConfigId("githubProvisioner").assignChangelogConsumerConfigId("githubScimProvTestCLC") .assignAcceptHeader("application/vnd.github.v3+json") .assignBearerTokenExternalSystemConfigId("githubExternalSystem") - .addSubjectLink("memberFromId2", "${subject.getAttributeValue('email')}") + .addSubjectLink("entityAttributeValueCache0", "${subject.getAttributeValue('email')}") .assignEntityDeleteType("deleteEntitiesIfNotExistInGrouper") .assignGroupOfUsersToProvision(testGroup) .assignScimMembershipType("group") @@ -350,10 +350,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started <= gcGrouperSyncGroup.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertNotNull(gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertNotNull(gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -377,10 +377,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started <= gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -401,10 +401,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started <= gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -489,10 +489,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started > gcGrouperSyncGroup.getLastUpdated().getTime()); // because no change from previous run assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertNotNull(gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertNotNull(gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -516,10 +516,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started > gcGrouperSyncMember.getLastUpdated().getTime()); // because no change from previous run assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -537,10 +537,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getProvisionableStart().getTime()); assertNotNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -615,10 +615,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getProvisionableStart().getTime()); assertNotNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertNotNull(gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertNotNull(gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -639,10 +639,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getProvisionableStart().getTime()); assertNotNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -659,10 +659,10 @@ public void testAWSFullSyncProvisionGroupAndThenDeleteTheGroup() { assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getProvisionableStart().getTime()); assertNotNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -821,10 +821,10 @@ public void testAWSIncrementalSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started < gcGrouperSyncGroup.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncGroup.getLastUpdated().getTime()); - assertNotNull(gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertNotNull(gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -848,10 +848,10 @@ public void testAWSIncrementalSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started < gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -872,10 +872,10 @@ public void testAWSIncrementalSyncProvisionGroupAndThenDeleteTheGroup() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started < gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() >= gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertNotNull(gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertNotNull(gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestConfigInput.java b/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestConfigInput.java index 7e0a88960ac0..5186d3595ab7 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestConfigInput.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestConfigInput.java @@ -131,12 +131,12 @@ public ScimProvisionerTestConfigInput assignBearerTokenExternalSystemConfigId(St } /** - * e.g. memberFromId2 -> ${subject.getAttributeValue('email')} + * e.g. entityAttributeValueCache0 -> ${subject.getAttributeValue('email')} */ private Map subjectLink = new TreeMap(); /** - * e.g. memberFromId2 -> ${subject.getAttributeValue('email')} + * e.g. entityAttributeValueCache0 -> ${subject.getAttributeValue('email')} * @return */ public Map getSubjectLink() { @@ -144,7 +144,7 @@ public Map getSubjectLink() { } /** - * e.g. memberFromId2 -> ${subject.getAttributeValue('email')} + * e.g. entityAttributeValueCache0 -> ${subject.getAttributeValue('email')} * @return */ public ScimProvisionerTestConfigInput addSubjectLink(String cacheBucket, String value) { diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestUtils.java index 0dab37343532..f9ad378eee5a 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/scim/ScimProvisionerTestUtils.java @@ -151,7 +151,7 @@ public static void configureScimProvisioner(ScimProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "showAdvanced", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "subjectSourcesToProvision", "jdbc"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.matchingId", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "userName"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.searchAttribute", "true"); @@ -169,7 +169,7 @@ public static void configureScimProvisioner(ScimProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateFromGrouperProvisioningEntityField", "name"); } else if (StringUtils.equals(provisioningTestConfigInput.getEntityAttribute4name(), "emailValue")) { configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateExpression", "${gcGrouperSyncMember.memberFromId2}"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateExpression", "${gcGrouperSyncMember.entityAttributeValueCache0}"); } else { throw new RuntimeException("Not value entityAttribute5Name: '" + provisioningTestConfigInput.getEntityAttribute4name() + "'"); } @@ -180,7 +180,7 @@ public static void configureScimProvisioner(ScimProvisionerTestConfigInput provi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "extension"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateToGroupSyncField", "groupToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateToGroupSyncField", "groupAttributeValueCache2"); } configureProvisionerSuffix(provisioningTestConfigInput, "updateEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "updateGroups", "false"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java index 7864066aa860..ae319733cdc9 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java @@ -2626,10 +2626,10 @@ public void testSimpleGroupLdapPa() { assertNull(gcGrouperSyncGroup.getProvisionableEnd()); assertTrue(started < gcGrouperSyncGroup.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() > gcGrouperSyncGroup.getLastUpdated().getTime()); - assertEquals("cn=test:testGroup,OU=Grouper,OU=365Groups,DC=one,DC=upenn,DC=edu", gcGrouperSyncGroup.getGroupToId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId2()); - assertNull(gcGrouperSyncGroup.getGroupFromId3()); - assertNull(gcGrouperSyncGroup.getGroupToId3()); + assertEquals("cn=test:testGroup,OU=Grouper,OU=365Groups,DC=one,DC=upenn,DC=edu", gcGrouperSyncGroup.getGroupAttributeValueCache2()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache0()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache1()); + assertNull(gcGrouperSyncGroup.getGroupAttributeValueCache3()); assertNull(gcGrouperSyncGroup.getLastGroupMetadataSync()); assertNull(gcGrouperSyncGroup.getErrorMessage()); assertNull(gcGrouperSyncGroup.getErrorTimestamp()); @@ -2653,10 +2653,10 @@ public void testSimpleGroupLdapPa() { assertNull(gcGrouperSyncMember.getProvisionableEnd()); assertTrue(started < gcGrouperSyncMember.getLastUpdated().getTime()); assertTrue(System.currentTimeMillis() > gcGrouperSyncMember.getLastUpdated().getTime()); - assertNull(gcGrouperSyncMember.getMemberFromId2()); - assertNull(gcGrouperSyncMember.getMemberFromId3()); - assertEquals("dn_test.subject.0", gcGrouperSyncMember.getMemberToId2()); - assertNull(gcGrouperSyncMember.getMemberToId3()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache0()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache1()); + assertEquals("dn_test.subject.0", gcGrouperSyncMember.getEntityAttributeValueCache2()); + assertNull(gcGrouperSyncMember.getEntityAttributeValueCache3()); assertNull(gcGrouperSyncMember.getLastUserMetadataSync()); assertNull(gcGrouperSyncMember.getErrorMessage()); assertNull(gcGrouperSyncMember.getErrorTimestamp()); @@ -2921,7 +2921,7 @@ public void testSimpleGroupLdapPaRealTimeAddMember() { assertTrue(System.currentTimeMillis() > gcGrouperSyncGroup.getInTargetStart().getTime()); assertNull(gcGrouperSyncGroup.getInTargetEnd()); assertTrue(started < gcGrouperSyncGroup.getProvisionableStart().getTime()); - assertEquals("cn=test:testGroup,OU=Grouper,OU=365Groups,DC=one,DC=upenn,DC=edu", gcGrouperSyncGroup.getGroupToId2()); + assertEquals("cn=test:testGroup,OU=Grouper,OU=365Groups,DC=one,DC=upenn,DC=edu", gcGrouperSyncGroup.getGroupAttributeValueCache2()); Hib3GrouperLoaderLog hib3GrouperLoaderLog = null; diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java index 51efcece869a..48eff0bc736c 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java @@ -180,7 +180,7 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.name", "dn"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.storageType", "separateAttributesTable"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "employeeID"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.storageType", "separateAttributesTable"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateExpressionType", "grouperProvisioningEntityField"); @@ -202,7 +202,7 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.storageType", "entityTableColumn"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateExpression", "${edu.internet2.middleware.grouper.internal.util.GrouperUuid.getUuid()}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateGrouperToMemberSyncField", "memberFromId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateGrouperToMemberSyncField", "entityAttributeValueCache0"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.matchingId", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "name"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.searchAttribute", "true"); @@ -277,7 +277,7 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "groupTableColumn"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpression", "${edu.internet2.middleware.grouper.internal.util.GrouperUuid.getUuid()}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateGrouperToGroupSyncField", "groupFromId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateGrouperToGroupSyncField", "groupAttributeValueCache0"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "description"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); @@ -324,7 +324,7 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateExpression", "${'cn=' + grouperProvisioningGroup.getName() + ',OU=Grouper,OU=365Groups,DC=one,DC=upenn,DC=edu'}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateGrouperToGroupSyncField", "groupToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateGrouperToGroupSyncField", "groupAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.matchingId", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.name", "gidNumber"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.searchAttribute", "true"); @@ -342,7 +342,7 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.multiValued", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.name", "member"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.storageType", "separateAttributesTable"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.translateFromMemberSyncField", "memberToId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.name", "uuid"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.storageType", "groupTableColumn"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.translateExpressionType", "grouperProvisioningGroupField"); @@ -379,10 +379,10 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.translateExpressionType", "translationScript"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.name", "group_uuid"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateExpressionType", "groupSyncField"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateFromGroupSyncField", "groupFromId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateFromGroupSyncField", "groupAttributeValueCache0"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.name", "entity_uuid"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.translateExpressionType", "memberSyncField"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.translateFromMemberSyncField", "memberFromId2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.translateFromMemberSyncField", "entityAttributeValueCache0"); } configureProvisionerSuffix(provisioningTestConfigInput, "logAllObjectsVerbose", "true"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/tableSync/ProvisioningToSyncTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/tableSync/ProvisioningToSyncTest.java index b574755f11f4..2c6c1b212307 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/tableSync/ProvisioningToSyncTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/tableSync/ProvisioningToSyncTest.java @@ -288,11 +288,11 @@ public void testGcGrouperSyncGroupStoreAndDelete() { assertEquals("abc", gcGrouperSyncGroup.getGroupId()); //try to store an update - gcGrouperSyncGroup.setGroupFromId2("def"); + gcGrouperSyncGroup.setGroupAttributeValueCache0("def"); gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupStore(gcGrouperSyncGroup); gcGrouperSyncGroup = gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupRetrieveFromDbById(gcGrouperSyncGroup.getId()); - assertEquals("def", gcGrouperSyncGroup.getGroupFromId2()); + assertEquals("def", gcGrouperSyncGroup.getGroupAttributeValueCache0()); //try to store a delete gcGrouperSync.getGcGrouperSyncGroupDao().groupDelete(gcGrouperSyncGroup, false, false); @@ -326,8 +326,8 @@ public void testGcGrouperSyncGroupStoreAndDelete() { assertEquals("def", gcGrouperSyncGroup2.getGroupId()); //try to store an update - gcGrouperSyncGroup1.setGroupFromId2("mno"); - gcGrouperSyncGroup2.setGroupFromId2("pqr"); + gcGrouperSyncGroup1.setGroupAttributeValueCache0("mno"); + gcGrouperSyncGroup2.setGroupAttributeValueCache0("pqr"); gcGrouperSyncGroups = new ArrayList(); gcGrouperSyncGroups.add(gcGrouperSyncGroup1); @@ -338,8 +338,8 @@ public void testGcGrouperSyncGroupStoreAndDelete() { gcGrouperSyncGroup1 = gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupRetrieveFromDbById(gcGrouperSyncGroup1.getId()); gcGrouperSyncGroup2 = gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupRetrieveFromDbById(gcGrouperSyncGroup2.getId()); - assertEquals("mno", gcGrouperSyncGroup1.getGroupFromId2()); - assertEquals("pqr", gcGrouperSyncGroup2.getGroupFromId2()); + assertEquals("mno", gcGrouperSyncGroup1.getGroupAttributeValueCache0()); + assertEquals("pqr", gcGrouperSyncGroup2.getGroupAttributeValueCache0()); gcGrouperSyncGroups = new ArrayList(); gcGrouperSyncGroups.add(gcGrouperSyncGroup1); @@ -372,8 +372,8 @@ public void testGcGrouperSyncGroupStoreAndDelete() { GcGrouperSyncGroup gcGrouperSyncGroup6 = gcGrouperSync.getGcGrouperSyncGroupDao().groupRetrieveOrCreateByGroupId("vwx"); //try to store an update - gcGrouperSyncGroup3.setGroupFromId2("mno"); - gcGrouperSyncGroup4.setGroupFromId2("pqr"); + gcGrouperSyncGroup3.setGroupAttributeValueCache0("mno"); + gcGrouperSyncGroup4.setGroupAttributeValueCache0("pqr"); changes = gcGrouperSync.getGcGrouperSyncDao().storeAllObjects() + gcGrouperSync.getInternalObjectsCreatedCount(); @@ -382,11 +382,11 @@ public void testGcGrouperSyncGroupStoreAndDelete() { gcGrouperSyncGroup3 = gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupRetrieveFromDbById(gcGrouperSyncGroup3.getId()); gcGrouperSyncGroup4 = gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupRetrieveFromDbById(gcGrouperSyncGroup4.getId()); - assertEquals("mno", gcGrouperSyncGroup3.getGroupFromId2()); - assertEquals("pqr", gcGrouperSyncGroup4.getGroupFromId2()); + assertEquals("mno", gcGrouperSyncGroup3.getGroupAttributeValueCache0()); + assertEquals("pqr", gcGrouperSyncGroup4.getGroupAttributeValueCache0()); gcGrouperSyncGroup3 = gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupRetrieveFromDbByGroupId(gcGrouperSyncGroup3.getGroupId()); - assertEquals("mno", gcGrouperSyncGroup3.getGroupFromId2()); + assertEquals("mno", gcGrouperSyncGroup3.getGroupAttributeValueCache0()); gcGrouperSyncGroups = gcGrouperSync.getGcGrouperSyncGroupDao().internal_groupRetrieveFromDbAll(); assertEquals(6, gcGrouperSyncGroups.size()); @@ -476,13 +476,13 @@ public void testGcGrouperSyncGroupStoreAndDelete() { // GcGrouperSyncGroup gcGrouperSyncGroup = new GcGrouperSyncGroup(); // gcGrouperSyncGroup.setGrouperSync(gcGrouperSync); // gcGrouperSyncGroup.setLastTimeWorkWasDone(new Timestamp(System.currentTimeMillis() + 2000)); - // gcGrouperSyncGroup.groupFromId2 = "from2"; - // gcGrouperSyncGroup.groupFromId3 = "from3"; + // gcGrouperSyncGroup.groupAttributeValueCache0 = "from2"; + // gcGrouperSyncGroup.groupAttributeValueCache1 = "from3"; // gcGrouperSyncGroup.groupId = "myId"; // gcGrouperSyncGroup.groupIdIndex = 123L; // gcGrouperSyncGroup.groupName = "myName"; - // gcGrouperSyncGroup.groupToId2 = "toId2"; - // gcGrouperSyncGroup.groupToId3 = "toId3"; + // gcGrouperSyncGroup.groupAttributeValueCache2 = "toId2"; + // gcGrouperSyncGroup.groupAttributeValueCache3 = "toId3"; // gcGrouperSyncGroup.inTargetDb = "T"; // gcGrouperSyncGroup.inTargetInsertOrExistsDb = "T"; // gcGrouperSyncGroup.inTargetEnd = new Timestamp(123L); @@ -498,7 +498,7 @@ public void testGcGrouperSyncGroupStoreAndDelete() { // gcGrouperSyncGroup = gcGrouperSync.groupRetrieveByGroupId("myId"); // System.out.println(gcGrouperSyncGroup); // - // gcGrouperSyncGroup.setGroupToId2("toId2a"); + // gcGrouperSyncGroup.setGroupAttributeValueCache2("toId2a"); // gcGrouperSync.internal_groupStore(gcGrouperSyncGroup); // // System.out.println("updated"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/upgradeTasks/UpgradeTasksJobTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/upgradeTasks/UpgradeTasksJobTest.java index 16ce43c4a110..7b5b4a07f18c 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/upgradeTasks/UpgradeTasksJobTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/upgradeTasks/UpgradeTasksJobTest.java @@ -69,7 +69,7 @@ public static void v8configure() { new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.1.multiValued").value("false").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.1.translateExpressionType").value("translationScript").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.1.translateExpression").value("${'cn=' + grouperProvisioningGroup.getName() + ',OU=Grouper,OU=365Groups,DC=one,DC=upenn,DC=edu'}").store(); - new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.1.translateGrouperToGroupSyncField").value("groupToId2").store(); + new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.1.translateGrouperToGroupSyncField").value("groupAttributeValueCache2").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.1.storageType").value("separateAttributesTable").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.2.name").value("gidNumber").store(); @@ -97,7 +97,7 @@ public static void v8configure() { new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.4.update").value("true").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.4.membershipAttribute").value("true").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.4.multiValued").value("true").store(); - new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.4.translateFromMemberSyncField").value("memberToId2").store(); + new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.4.translateFromMemberSyncField").value("entityAttributeValueCache2").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.4.storageType").value("separateAttributesTable").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetGroupAttribute.5.name").value("uuid").store(); @@ -113,7 +113,7 @@ public static void v8configure() { new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetEntityAttribute.0.name").value("dn").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetEntityAttribute.0.select").value("true").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetEntityAttribute.0.storageType").value("separateAttributesTable").store(); - new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetEntityAttribute.0.translateToMemberSyncField").value("memberToId2").store(); + new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetEntityAttribute.0.translateToMemberSyncField").value("entityAttributeValueCache2").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetEntityAttribute.1.name").value("employeeID").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("provisioner.pspng_oneprod.targetEntityAttribute.1.select").value("true").store(); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/usdu/UsduJobProvisionerSyncTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/usdu/UsduJobProvisionerSyncTest.java index ae68cd48e388..398c9aea2368 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/usdu/UsduJobProvisionerSyncTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/usdu/UsduJobProvisionerSyncTest.java @@ -71,167 +71,167 @@ public void test() { gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveOrCreateByMemberId("bogus"); gcGrouperSync.getGcGrouperSyncDao().storeAllObjects(); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberFromId2", "test1 ${subject.name} fromid2"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberFromId3", "test1 ${subject.name} fromid3"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberToId2", "test1 ${subject.name} toid2"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberToId3", "test1 ${subject.name} toid3"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache0", "test1 ${subject.name} fromid2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache1", "test1 ${subject.name} fromid3"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache2", "test1 ${subject.name} toid2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache3", "test1 ${subject.name} toid3"); GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test2.common.enabled", "false"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test3.common.subjectLink.memberFromId2", "test3 ${subject.name} fromid2"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test3.common.subjectLink.memberFromId3", "test3 ${subject.name} fromid3"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test3.common.subjectLink.autoMemberFromId3", "false"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test3.common.subjectLink.entityAttributeValueCache0", "test3 ${subject.name} fromid2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test3.common.subjectLink.entityAttributeValueCache1", "test3 ${subject.name} fromid3"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test3.common.subjectLink.autoEntityAttributeValueCache1", "false"); UsduJob.runDaemonStandalone(); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test1"); - assertEquals("test1 my name is test.subject.0 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.0 fromid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.0 toid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.0 toid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId3()); - assertEquals("test1 my name is test.subject.1 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.1 fromid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.1 toid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.1 toid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); + assertEquals("test1 my name is test.subject.0 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.0 fromid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.0 toid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.0 toid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache3()); + assertEquals("test1 my name is test.subject.1 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.1 fromid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.1 toid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.1 toid3", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test2"); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test3"); - assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); - assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId3()); + assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); + assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache3()); // now test an update for test1 - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberFromId2", "test1 ${subject.name} fromid2 update"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberFromId3", "test1 ${subject.name} fromid3 update"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberToId2", "test1 ${subject.name} toid2 update"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberToId3", "test1 ${subject.name} toid3 update"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache0", "test1 ${subject.name} fromid2 update"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache1", "test1 ${subject.name} fromid3 update"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache2", "test1 ${subject.name} toid2 update"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache3", "test1 ${subject.name} toid3 update"); UsduJob.runDaemonStandalone(); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test1"); - assertEquals("test1 my name is test.subject.0 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.0 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId3()); - assertEquals("test1 my name is test.subject.1 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.1 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); + assertEquals("test1 my name is test.subject.0 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.0 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache3()); + assertEquals("test1 my name is test.subject.1 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.1 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test2"); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test3"); - assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); - assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId3()); + assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); + assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache3()); // disable sync for test1 - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoMemberFromId2", "false"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoMemberFromId3", "false"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoMemberToId2", "false"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoMemberToId3", "false"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoEntityAttributeValueCache0", "false"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoEntityAttributeValueCache1", "false"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoEntityAttributeValueCache2", "false"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoEntityAttributeValueCache3", "false"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberFromId2", "test1 ${subject.name} fromid2 update2"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberFromId3", "test1 ${subject.name} fromid3 update2"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberToId2", "test1 ${subject.name} toid2 update2"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.memberToId3", "test1 ${subject.name} toid3 update2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache0", "test1 ${subject.name} fromid2 update2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache1", "test1 ${subject.name} fromid3 update2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache2", "test1 ${subject.name} toid2 update2"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.entityAttributeValueCache3", "test1 ${subject.name} toid3 update2"); UsduJob.runDaemonStandalone(); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test1"); - assertEquals("test1 my name is test.subject.0 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.0 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId3()); - assertEquals("test1 my name is test.subject.1 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.1 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); + assertEquals("test1 my name is test.subject.0 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.0 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache3()); + assertEquals("test1 my name is test.subject.1 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.1 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test2"); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test3"); - assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); - assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId3()); + assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); + assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache3()); // disable provisioner for test1 GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.enabled", "false"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoMemberFromId2", "true"); - GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoMemberToId2", "true"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoEntityAttributeValueCache0", "true"); + GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.subjectLink.autoEntityAttributeValueCache2", "true"); UsduJob.runDaemonStandalone(); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test1"); - assertEquals("test1 my name is test.subject.0 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.0 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId3()); - assertEquals("test1 my name is test.subject.1 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.1 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); + assertEquals("test1 my name is test.subject.0 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.0 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache3()); + assertEquals("test1 my name is test.subject.1 fromid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.1 toid2 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test2"); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test3"); - assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); - assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId3()); + assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); + assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache3()); // enable provisioner for test1 GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.test1.common.enabled", "true"); @@ -239,33 +239,33 @@ public void test() { UsduJob.runDaemonStandalone(); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test1"); - assertEquals("test1 my name is test.subject.0 fromid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.0 toid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getMemberToId3()); - assertEquals("test1 my name is test.subject.1 fromid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertEquals("test1 my name is test.subject.1 toid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); + assertEquals("test1 my name is test.subject.0 fromid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.0 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.0 toid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.0 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member0.getId()).getEntityAttributeValueCache3()); + assertEquals("test1 my name is test.subject.1 fromid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertEquals("test1 my name is test.subject.1 fromid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertEquals("test1 my name is test.subject.1 toid2 update2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertEquals("test1 my name is test.subject.1 toid3 update", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test2"); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getMemberToId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member1.getId()).getEntityAttributeValueCache3()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); gcGrouperSync = GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, "test3"); - assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getMemberToId3()); - assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberFromId3()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId2()); - assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getMemberToId3()); + assertEquals("test3 my name is test.subject.2 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member2.getId()).getEntityAttributeValueCache3()); + assertEquals("test3 my name is test.subject.3 fromid2", gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache0()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache1()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache2()); + assertNull(gcGrouperSync.getGcGrouperSyncMemberDao().memberRetrieveByMemberId(member3.getId()).getEntityAttributeValueCache3()); } } \ No newline at end of file From 55ef92d6dd285f7a3594ab4e17b0d2bd1a3a62ed Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Mon, 25 Apr 2022 16:39:19 -0400 Subject: [PATCH 024/125] GRP-4007: fullSyncGroups wrong option in drop down --- grouper/conf/grouper-loader.base.properties | 8 ++++---- .../GrouperDaemonOtherJobTableSyncConfiguration.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index a15763b5290f..808d18347a75 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -1453,7 +1453,7 @@ otherJob.grouperLoaderJexlScriptFullSync.quartzCron = 31 19 * * * ? ## tableSync jobs should use class: edu.internet2.middleware.grouper.app.tableSync.TableSyncOtherJob ## and include a setting to point to the grouperClient config, if not same: otherJob..grouperClientTableSyncConfigKey = key ## this is the subtype of job to run: otherJob..syncType = fullSyncFull -## (can be: fullSyncFull, fullSyncGroupings, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey) +## (can be: fullSyncFull, fullSyncGroups, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey) ################################ # Object Type Job class @@ -1468,8 +1468,8 @@ otherJob.grouperLoaderJexlScriptFullSync.quartzCron = 31 19 * * * ? # {valueType: "string", required: true, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.sqlSync.SqlSyncConfiguration"} # otherJob.membershipSync.grouperClientTableSyncConfigKey = -# fullSyncFull, fullSyncGroupings, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey -# {valueType: "string", required: true, formElement: "dropdown", optionValues: ["fullSyncFull", "fullSyncGroupings", "fullSyncChangeFlag", "incrementalAllColumns", "incrementalPrimaryKey"]} +# fullSyncFull, fullSyncGroups, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey +# {valueType: "string", required: true, formElement: "dropdown", optionValues: ["fullSyncFull", "fullSyncGroups", "fullSyncChangeFlag", "incrementalAllColumns", "incrementalPrimaryKey"]} # otherJob.membershipSync.syncType = @@ -1486,7 +1486,7 @@ otherJob.recentMembershipsConfFull.quartzCron = 0 0 * * * ? # {valueType: "string"} otherJob.recentMembershipsConfFull.grouperClientTableSyncConfigKey = recentMembershipsConf -# fullSyncFull, fullSyncGroupings, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey +# fullSyncFull, fullSyncGroups, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey # {valueType: "string"} otherJob.recentMembershipsConfFull.syncType = fullSyncFull diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/daemon/GrouperDaemonOtherJobTableSyncConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/daemon/GrouperDaemonOtherJobTableSyncConfiguration.java index 0a2d9f1bb7a1..1c030fb970c1 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/daemon/GrouperDaemonOtherJobTableSyncConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/daemon/GrouperDaemonOtherJobTableSyncConfiguration.java @@ -19,7 +19,7 @@ public ConfigFileName getConfigFileName() { // ## tableSync jobs should use class: edu.internet2.middleware.grouper.app.tableSync.TableSyncOtherJob // ## and include a setting to point to the grouperClient config, if not same: otherJob..grouperClientTableSyncConfigKey = key // ## this is the subtype of job to run: otherJob..syncType = fullSyncFull - // ## (can be: fullSyncFull, fullSyncGroupings, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey) + // ## (can be: fullSyncFull, fullSyncGroups, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey) // ################################ // // # Object Type Job class @@ -34,7 +34,7 @@ public ConfigFileName getConfigFileName() { // # {valueType: "string"} // # otherJob.membershipSync.grouperClientTableSyncConfigKey = memberships // - // # fullSyncFull, fullSyncGroupings, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey + // # fullSyncFull, fullSyncGroups, fullSyncChangeFlag, incrementalAllColumns, incrementalPrimaryKey // # {valueType: "string"} // # otherJob.membershipSync.syncType = fullSyncFull From af70a7b4188a289f2aecbd303edb9511644c08bb Mon Sep 17 00:00:00 2001 From: Shilen Patel Date: Wed, 27 Apr 2022 08:18:03 -0400 Subject: [PATCH 025/125] GRP-4010: Add user audit when users change start/end dates on a membership --- .../internet2/middleware/grouper/Group.java | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/Group.java b/grouper/src/grouper/edu/internet2/middleware/grouper/Group.java index a222aadd4db1..97865a64ccf2 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/Group.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/Group.java @@ -47,6 +47,7 @@ import static edu.internet2.middleware.grouper.hooks.examples.GroupTypeTupleIncludeExcludeHook.systemOfRecordExtensionSuffix; import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -1436,7 +1437,37 @@ public Object callback(GrouperTransaction grouperTransaction) } //if a date didnt match up, then save the membership if (hasChange) { - GrouperDAOFactory.getFactory().getMembership().update(membership); + HibernateSession.callbackHibernateSession( + GrouperTransactionType.READ_WRITE_OR_USE_EXISTING, AuditControl.WILL_AUDIT, + new HibernateHandler() { + + public Object callback(HibernateHandlerBean hibernateHandlerBean) + throws GrouperDAOException { + GrouperDAOFactory.getFactory().getMembership().update(membership); + + if (!hibernateHandlerBean.isCallerWillCreateAudit()) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd h:mm a"); + String enabledTimeString = membership.getEnabledTime() == null ? null : sdf.format(membership.getEnabledTime()); + String disabledTimeString = membership.getDisabledTime() == null ? null : sdf.format(membership.getDisabledTime()); + + AuditEntry auditEntry = new AuditEntry(AuditTypeBuiltin.MEMBERSHIP_GROUP_UPDATE, "id", + membership.getUuid(), "fieldId", field.getUuid(), + "fieldName", field.getName(), "memberId", membership.getMemberUuid(), + "membershipType", membership.getType(), + "groupId", Group.this.getUuid(), "groupName", Group.this.getName()); + + auditEntry.setDescription("Updated membership: group: " + Group.this.getName() + + ", subject: " + subject.getSource().getId() + "." + subject.getId() + ", field: " + + field.getName() + + ", enabledTime: " + enabledTimeString + + ", disabledTime: " + disabledTimeString); + auditEntry.saveOrUpdate(true); + } + + return null; + } + }); } return hasChange; } From 0347402e757c4c4675bece482059eb3fd2e6c8fa Mon Sep 17 00:00:00 2001 From: Shilen Patel Date: Wed, 27 Apr 2022 10:40:55 -0400 Subject: [PATCH 026/125] GRP-4011: Grouper UI queries root folder twice --- .../grouperUi/beans/tree/DojoTreeItem.java | 24 ++++++++++++--- .../grouperUi/serviceLogic/UiV2Main.java | 2 +- .../public/assets/js/grouperUi.js | 29 +++++++++++-------- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/tree/DojoTreeItem.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/tree/DojoTreeItem.java index a2c9fd3156d5..cc328f0c9298 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/tree/DojoTreeItem.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/tree/DojoTreeItem.java @@ -26,7 +26,7 @@ public class DojoTreeItem { * @param args */ public static void main(String[] args) { - DojoTreeItem root = new DojoTreeItem("Root", "root", DojoTreeItemType.stem); + DojoTreeItem root = new DojoTreeItem("Root", "root", DojoTreeItemType.stem, true); DojoTreeItemChild child1 = new DojoTreeItemChild("Child1", "child1", DojoTreeItemType.group, true); DojoTreeItemChild child2 = new DojoTreeItemChild("Child2", "child2", DojoTreeItemType.stem, null); root.setChildren(new DojoTreeItemChild[]{child1, child2}); @@ -42,12 +42,14 @@ public static void main(String[] args) { * @param hasChildren * @param children * @param dojoTreeItemType + * @param root */ - public DojoTreeItem(String name, String id, DojoTreeItemType dojoTreeItemType) { + public DojoTreeItem(String name, String id, DojoTreeItemType dojoTreeItemType, boolean root) { super(); this.name = name; this.id = id; this.assignTheTypeEnum(dojoTreeItemType); + this.root = root; } /** @@ -75,6 +77,9 @@ public DojoTreeItem() { /** if group or folder */ private String theType = null; + + /** if this is the root in the tree */ + private boolean root = false; /** * what displays on the screen, display extension @@ -148,6 +153,17 @@ public void assignTheTypeEnum(DojoTreeItemType dojoTreeItemChildType1) { this.theType = dojoTreeItemChildType1 == null ? null : dojoTreeItemChildType1.name(); } - - + /** + * @return if this is the root folder + */ + public boolean isRoot() { + return root; + } + + /** + * @param root + */ + public void setRoot(boolean root) { + this.root = root; + } } diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Main.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Main.java index 7ecda2855ec2..f145199795d6 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Main.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Main.java @@ -321,7 +321,7 @@ public void folderMenu(HttpServletRequest httpServletRequest, HttpServletRespons //the id has to be root or it will make another request String id = stem.isRootStem() ? "root" : stem.getUuid(); - DojoTreeItem dojoTreeItem = new DojoTreeItem(displayExtension, id, DojoTreeItemType.stem); + DojoTreeItem dojoTreeItem = new DojoTreeItem(displayExtension, id, DojoTreeItemType.stem, StringUtils.equals("root", folderQueryString)); DojoTreeItemChild[] childrenDojoTreeItems = new DojoTreeItemChild[GrouperUtil.length(childrenStems) + GrouperUtil.length(childrenGroups) + GrouperUtil.length(childrenAttributeDefs) + GrouperUtil.length(childrenAttributeDefNames)]; diff --git a/grouper-ui/webapp/grouperExternal/public/assets/js/grouperUi.js b/grouper-ui/webapp/grouperExternal/public/assets/js/grouperUi.js index f29d0535f401..351004796308 100644 --- a/grouper-ui/webapp/grouperExternal/public/assets/js/grouperUi.js +++ b/grouper-ui/webapp/grouperExternal/public/assets/js/grouperUi.js @@ -590,17 +590,22 @@ function dojoInitMenu(autoSelectNode) { return "children" in object; }, getChildren: function(object, onComplete, onError){ - // retrieve the full copy of the object - this.get(object.id).then(function(fullObject){ - // copy to the original object so it has the children array as well. - object.children = fullObject.children; - // now that full object, we should have an array of children - onComplete(fullObject.children); - }, function(error){ - // an error occurred, log it, and indicate no children - console.error(error); - onComplete([]); - }); + if (object.root && Array.isArray(object.children)) { + // already have children + onComplete(object.children); + } else { + // retrieve the full copy of the object + this.get(object.id).then(function(fullObject){ + // copy to the original object so it has the children array as well. + object.children = fullObject.children; + // now that full object, we should have an array of children + onComplete(fullObject.children); + }, function(error){ + // an error occurred, log it, and indicate no children + console.error(error); + onComplete([]); + }); + } }, getRoot: function(onItem, onError){ // get the root object, we will do a get() and callback the result @@ -2677,4 +2682,4 @@ function showLinkToRefreshProvisioningConfig(focusOnElementName, provisionerConf // sometimes window is blocked on back button $(window).unload(function() { $.unblockUI(); -}); \ No newline at end of file +}); From 40ea466143db72bdf80276fbcd2d3e0d6444a65e Mon Sep 17 00:00:00 2001 From: chasegawa Date: Wed, 27 Apr 2022 13:59:44 -0700 Subject: [PATCH 027/125] IAMSE-1531 updates to get the build correct for the external auth plugin --- grouper-misc/grouper-authentication/README.md | 5 +++++ grouper-misc/grouper-authentication/plugin-pom.xml | 7 ++----- grouper-misc/grouper-authentication/pom.xml | 3 --- 3 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 grouper-misc/grouper-authentication/README.md diff --git a/grouper-misc/grouper-authentication/README.md b/grouper-misc/grouper-authentication/README.md new file mode 100644 index 000000000000..2d23317f6d0d --- /dev/null +++ b/grouper-misc/grouper-authentication/README.md @@ -0,0 +1,5 @@ +Grouper External Authentication Plugin +====================================== + +## Introduction +The external authentication plugin allows for authentication from an external source. \ No newline at end of file diff --git a/grouper-misc/grouper-authentication/plugin-pom.xml b/grouper-misc/grouper-authentication/plugin-pom.xml index ebcd549a089b..850c488ecb16 100644 --- a/grouper-misc/grouper-authentication/plugin-pom.xml +++ b/grouper-misc/grouper-authentication/plugin-pom.xml @@ -49,7 +49,6 @@ ${project.groupId} grouper-ui ${grouper.version} - provided org.pac4j @@ -80,12 +79,10 @@ org.apache.tomcat tomcat-catalina 8.5.60 - provided commons-logging commons-logging - provided ${project.groupId} @@ -122,8 +119,8 @@ ${project.groupId}.${project.artifactId} - ${project.artifactId} - ${pom.version} + ${project.artifactId}-bundle + 0.0.1-SNAPSHOT edu.internet2.middleware.grouper.authentication.plugin.filter edu.internet2.middleware.grouper.authentication.plugin.* *;scope=compile|runtime diff --git a/grouper-misc/grouper-authentication/pom.xml b/grouper-misc/grouper-authentication/pom.xml index c4af2cc6b1d4..e26ba589982e 100644 --- a/grouper-misc/grouper-authentication/pom.xml +++ b/grouper-misc/grouper-authentication/pom.xml @@ -50,7 +50,6 @@ ${project.groupId} grouper-ui ${grouper.version} - provided org.pac4j @@ -81,12 +80,10 @@ org.apache.tomcat tomcat-catalina 8.5.60 - provided commons-logging commons-logging - provided ${project.groupId} From c5402636421eaaed0ae23c04acd113979f94fa48 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Wed, 27 Apr 2022 14:01:03 -0700 Subject: [PATCH 028/125] IAMSE-1531 updating the properties for external auth --- grouper/conf/grouper.base.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/grouper/conf/grouper.base.properties b/grouper/conf/grouper.base.properties index 0b87c40a33a9..aab76481b469 100644 --- a/grouper/conf/grouper.base.properties +++ b/grouper/conf/grouper.base.properties @@ -4119,21 +4119,21 @@ grouper.felix.cache.rootdir = /opt/grouper/grouperWebapp/WEB-INF/grouperFelixCac ############################################ # Enable external authorization security filters # {valueType: "boolean", defaultValue: "false"} -# grouper.is.extAuth.enabled = +#grouper.is.extAuth.enabled=true # Name of the jar containing the external authorization plugin # {valueType: "string", required: true} -# grouper.extAuth.jarname = grouper-authentication-plugin-0.0.1-SNAPSHOT.jar +#grouper.extAuth.jarname=grouper-authentication-plugin-0.0.1-SNAPSHOT.jar # Callback filter implementation classname # ex: edu.internet2.middleware.grouper.plugins.testImplementation.SamplePluginProviderServiceImpl # ${valueType: "class", required: true} -# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.authentication.plugin.filter.CallbackFilterDecorator +#grouper.extAuth.filter.callback.implmentation.className=edu.internet2.middleware.grouper.authentication.plugin.filter.CallbackFilterDecorator # Security filter implementation classname # ex: edu.internet2.middleware.grouper.plugins.testImplementation.SamplePluginProviderServiceImpl # ${valueType: "class", required: true} -# grouper.extAuth.filter.callback.implmentation.className = edu.internet2.middleware.grouper.authentication.plugin.filter.SecurityFilterDecorator +#grouper.extAuth.filter.security.implmentation.className=edu.internet2.middleware.grouper.authentication.plugin.filter.SecurityFilterDecorator From cc3ce172a29ae7a8094a5d0496f9e422ce2552d1 Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Fri, 29 Apr 2022 00:46:09 -0700 Subject: [PATCH 029/125] Fix start with blank configuration. Fix GRP-4012 --- .../ui/ProvisionerConfigurationContainer.java | 25 +++++++++---------- .../UiV2ProvisionerConfiguration.java | 8 ++++-- .../provisionerConfigAdd.jsp | 12 ++++++++- grouper/conf/grouper-loader.base.properties | 2 +- .../ProvisioningConfiguration.java | 13 ++++++++++ 5 files changed, 43 insertions(+), 17 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisionerConfigurationContainer.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisionerConfigurationContainer.java index bc52900b0560..cb9e281ada8c 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisionerConfigurationContainer.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/ProvisionerConfigurationContainer.java @@ -3,14 +3,11 @@ import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; - import edu.internet2.middleware.grouper.app.provisioning.ProvisionerStartWithBase; import edu.internet2.middleware.grouper.app.provisioning.ProvisioningConfiguration; import edu.internet2.middleware.grouper.grouperUi.beans.json.GuiPaging; import edu.internet2.middleware.grouper.privs.PrivilegeHelper; import edu.internet2.middleware.grouper.ui.GrouperUiFilter; -import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncGroup; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncJob; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncMember; @@ -273,10 +270,10 @@ public String getCacheFieldPrefix() { private ProvisionerStartWithBase provisionerStartWith; + private boolean blankStartWithSelected; + private boolean showStartWithSection; - private ProvisionerStartWithBase previousProvisionerStartWith; - private String startWithSessionId; public String getCurrentConfigSuffix() { @@ -326,22 +323,23 @@ public void setShowStartWithSection(boolean showStartWithSection) { this.showStartWithSection = showStartWithSection; } - public void setPreviousProvisionerStartWith(ProvisionerStartWithBase previousProvisionerStartWith) { - this.previousProvisionerStartWith = previousProvisionerStartWith; + public void setStartWithSessionId(String startWithSessionId) { + this.startWithSessionId = startWithSessionId; } - public ProvisionerStartWithBase getPreviousProvisionerStartWith() { - return previousProvisionerStartWith; + public String getStartWithSessionId() { + return startWithSessionId; } - public void setStartWithSessionId(String startWithSessionId) { - this.startWithSessionId = startWithSessionId; + + public boolean isBlankStartWithSelected() { + return blankStartWithSelected; } - public String getStartWithSessionId() { - return startWithSessionId; + public void setBlankStartWithSelected(boolean blankStartWithSelected) { + this.blankStartWithSelected = blankStartWithSelected; } @@ -351,4 +349,5 @@ public String getStartWithSessionId() { + } diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java index cebd4381bcb2..6b02287ce069 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java @@ -809,9 +809,11 @@ public void addProvisionerConfiguration(final HttpServletRequest request, final String previousProvisionerStartWithClass = request.getParameter("previousProvisionerStartWithClass"); - boolean skipStartWith = StringUtils.isBlank(provisionerStartWithClass); - if (StringUtils.isNotBlank(provisionerStartWithClass) && StringUtils.equals(provisionerStartWithClass, "blank")) { + boolean skipStartWith = false; + if ( (StringUtils.isNotBlank(provisionerStartWithClass) && StringUtils.equals(provisionerStartWithClass, "blank")) || + (StringUtils.equals(previousProvisionerStartWithClass, "blank")) ) { skipStartWith = true; + provisionerConfigurationContainer.setBlankStartWithSelected(true); } if (!skipStartWith && StringUtils.isNotBlank(provisionerStartWithClass)) { @@ -1170,6 +1172,8 @@ public void editProvisionerConfiguration(final HttpServletRequest request, final provisionerConfigurationContainer.setGuiProvisionerConfiguration(guiProvisioningConfiguration); } + provisionerConfiguration.correctFormFieldsForExpressionLanguageValues(); + guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#grouperMainContentDivId", "/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigEdit.jsp")); diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp index f1f1e3c64b7b..dff694b145bf 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp @@ -57,7 +57,17 @@
    - + + + + + + + + + + + <%@ include file="provisionerConfigAddHelper.jsp" %> diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 808d18347a75..7459e016775d 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -4030,7 +4030,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.myGoogleProvisioner.class = edu.internet2.middleware.grouper.app.google.GrouperGoogleProvisioner # this is the google external system config id -# {valueType: "string", required: true, order: 20, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.changelogconsumer.googleapps.GoogleGrouperExternalSystem"} +# {valueType: "string", required: true, order: 20, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.google.GoogleGrouperExternalSystem"} # provisioner.myGoogleProvisioner.googleExternalSystemConfigId = # Name of the attribute diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java index 328d073c9f36..128ec1149db6 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java @@ -19,6 +19,7 @@ import edu.internet2.middleware.grouper.app.messagingProvisioning.MessagingProvisionerConfiguration; import edu.internet2.middleware.grouper.app.scim2Provisioning.GrouperScim2Configuration; import edu.internet2.middleware.grouper.app.sqlProvisioning.SqlProvisionerConfiguration; +import edu.internet2.middleware.grouper.cfg.dbConfig.ConfigItemFormElement; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSync; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncDao; @@ -286,6 +287,18 @@ public void validatePreSave(boolean isInsert, List errorsToDisplay, } } + + public void correctFormFieldsForExpressionLanguageValues() { + + for (GrouperConfigurationModuleAttribute grouperConfigurationModuleAttribute : GrouperUtil.nonNull(this.retrieveAttributes()).values()) { + + if (grouperConfigurationModuleAttribute.isExpressionLanguage()) { + grouperConfigurationModuleAttribute.setFormElement(ConfigItemFormElement.TEXT); + } + + } + + } } From 76962ecd4a4330f775682bacd52060a5496c2d22 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sat, 30 Apr 2022 10:46:21 -0400 Subject: [PATCH 030/125] GRP-4013: move attribute value cache from group attribute section to group2 section --- grouper/conf/grouper-loader.base.properties | 103 +++++++++++++++--- .../grouper.textNg.en.us.base.properties | 56 ++++++++-- 2 files changed, 135 insertions(+), 24 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 7459e016775d..af2c01b8919c 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2880,6 +2880,93 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", required: true, order: 79210, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.groupMembershipAttributeValue = +# Target group link - has groupAttributeValueCache? +# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups}", order: 78001} +# provisioner.genericProvisioner.groupAttributeValueCacheHas = + +# Target group link - has groupAttributeValueCache0? +# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78001} +# provisioner.genericProvisioner.groupAttributeValueCache0has = + +# Target group link - groupAttributeValueCache0 source +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has}", order: 78002, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.groupAttributeValueCache0source = + +# Target group link - groupAttributeValueCache0 type +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has}", order: 78004, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# provisioner.genericProvisioner.groupAttributeValueCache0type = + +# Target group link - groupAttributeValueCache0 groupAttribute +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has && groupAttributeValueCache0type == 'groupAttribute'}", order: 78006, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# provisioner.genericProvisioner.groupAttributeValueCache0groupAttribute = + +# Target group link - groupAttributeValueCache0 translationScript +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has && groupAttributeValueCache0type == 'translationScript'}", order: 78008} +# provisioner.genericProvisioner.groupAttributeValueCache0translationScript = + +# Target group link - has groupAttributeValueCache1? +# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78101} +# provisioner.genericProvisioner.groupAttributeValueCache1has = + +# Target group link - groupAttributeValueCache1 source +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has}", order: 78102, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.groupAttributeValueCache1source = + +# Target group link - groupAttributeValueCache1 type +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has}", order: 78104, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# provisioner.genericProvisioner.groupAttributeValueCache1type = + +# Target group link - groupAttributeValueCache1 groupAttribute +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has && groupAttributeValueCache1type == 'groupAttribute'}", order: 78106, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# provisioner.genericProvisioner.groupAttributeValueCache1groupAttribute = + +# Target group link - groupAttributeValueCache1 translationScript +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has && groupAttributeValueCache1type == 'translationScript'}", order: 78108} +# provisioner.genericProvisioner.groupAttributeValueCache1translationScript = + + +# Target group link - has groupAttributeValueCache2? +# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78201} +# provisioner.genericProvisioner.groupAttributeValueCache2has = + +# Target group link - groupAttributeValueCache2 source +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has}", order: 78202, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.groupAttributeValueCache2source = + +# Target group link - groupAttributeValueCache2 type +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has}", order: 78204, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# provisioner.genericProvisioner.groupAttributeValueCache2type = + +# Target group link - groupAttributeValueCache2 groupAttribute +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has && groupAttributeValueCache2type == 'groupAttribute'}", order: 78206, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# provisioner.genericProvisioner.groupAttributeValueCache2groupAttribute = + +# Target group link - groupAttributeValueCache2 translationScript +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has && groupAttributeValueCache2type == 'translationScript'}", order: 78208} +# provisioner.genericProvisioner.groupAttributeValueCache2translationScript = + + +# Target group link - has groupAttributeValueCache3? +# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78301} +# provisioner.genericProvisioner.groupAttributeValueCache3has = + +# Target group link - groupAttributeValueCache3 source +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has}", order: 78302, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.groupAttributeValueCache3source = + +# Target group link - groupAttributeValueCache3 type +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has}", order: 78304, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# provisioner.genericProvisioner.groupAttributeValueCache3type = + +# Target group link - groupAttributeValueCache3 groupAttribute +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has && groupAttributeValueCache3type == 'groupAttribute'}", order: 78306, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# provisioner.genericProvisioner.groupAttributeValueCache3groupAttribute = + +# Target group link - groupAttributeValueCache3 translationScript +# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has && groupAttributeValueCache3type == 'translationScript'}", order: 78308} +# provisioner.genericProvisioner.groupAttributeValueCache3translationScript = + + # group section 2 advanced options # {valueType: "boolean", defaultValue: "false", order: 79800, subSection: "group2", showEl: "${operateOnGrouperGroups}"} # provisioner.genericProvisioner.group2advanced = @@ -3129,22 +3216,6 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "integer", defaultValue: 20, subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139500} # provisioner.genericProvisioner.refreshGroupLinkIfLessThanAmount = -# Target group link - groupAttributeValueCache0 -# {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139600} -# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache0 = - -# Target group link - groupAttributeValueCache1 -# {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139700} -# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache1 = - -# Target group link - groupAttributeValueCache2 -# {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139800} -# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache2 = - -# Target group link - groupAttributeValueCache3 -# {valueType: "string", subSection: "advanced", showEl: "${operateOnGrouperGroups && hasTargetGroupLink && showAdvanced}", order: 139900} -# provisioner.genericProvisioner.common.groupLink.groupAttributeValueCache3 = - # refresh subject link if less than this amount # {valueType: "integer", defaultValue: 20, showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 140000, subSection: "advanced"} # provisioner.genericProvisioner.refreshSubjectLinkIfLessThanAmount = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index ba30965265b8..269e4b5efac7 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13873,14 +13873,54 @@ config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCach config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache1.label = Target entity link - entityAttributeValueCache1 config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache2.label = Target entity link - entityAttributeValueCache2 config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache3.label = Target entity link - entityAttributeValueCache3 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.label = Target group link - groupAttributeValueCache0 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.label = Target group link - groupAttributeValueCache1 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.label = Target group link - groupAttributeValueCache2 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.label = Target group link - groupAttributeValueCache3 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.description = Generally you do not need to edit this, and you will set this in an attribute configuration. This is one of four sync buckets. Enter a JEXL using the variable "targetGroup" (type ProvisioningGroup.java). Depending on the data returned by the provisioner's DAO, you can refer to fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} + +config.GenericConfiguration.attribute.groupAttributeValueCacheHas.label = Use group attribute value cache +config.GenericConfiguration.attribute.groupAttributeValueCacheHas.description = If you need to cache something in the database from the target or from grouper. There are four buckets to store data in + +config.GenericConfiguration.attribute.groupAttributeValueCache0has.label = Use group attribute value cache 0 +config.GenericConfiguration.attribute.groupAttributeValueCache0has.description = If you need to cache something in the database (grouper_sync_group.group_from_id2 column) from the target or from grouper. +config.GenericConfiguration.attribute.groupAttributeValueCache1has.label = Use group attribute value cache 1 +config.GenericConfiguration.attribute.groupAttributeValueCache1has.description = If you need to cache something in the database (grouper_sync_group.group_from_id3 column) from the target or from grouper. +config.GenericConfiguration.attribute.groupAttributeValueCache2has.label = Use group attribute value cache 2 +config.GenericConfiguration.attribute.groupAttributeValueCache2has.description = If you need to cache something in the database (grouper_sync_group.group_to_id2 column) from the target or from grouper. +config.GenericConfiguration.attribute.groupAttributeValueCache3has.label = Use group attribute value cache 3 +config.GenericConfiguration.attribute.groupAttributeValueCache3has.description = If you need to cache something in the database (grouper_sync_group.group_to_id3 column) from the target or from grouper. + +config.GenericConfiguration.attribute.groupAttributeValueCache0source.label = Group attribute value cache 0 source +config.GenericConfiguration.attribute.groupAttributeValueCache0source.description = Cache the data from Grouper or from target. You would pick Grouper if there is something in Grouper that might be needed during a delete that might not be available when the data is not in Grouper anymore (e.g. the search attribute). You would pick target when there is something in the target that is needed and maybe to help with performance (e.g. the UUID or DN). +config.GenericConfiguration.attribute.groupAttributeValueCache1source.label = Group attribute value cache 1 source +config.GenericConfiguration.attribute.groupAttributeValueCache1source.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0source.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache2source.label = Group attribute value cache 2 source +config.GenericConfiguration.attribute.groupAttributeValueCache2source.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0source.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache3source.label = Group attribute value cache 3 source +config.GenericConfiguration.attribute.groupAttributeValueCache3source.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0source.description$$ + +config.GenericConfiguration.attribute.groupAttributeValueCache0type.label = Group attribute value cache 0 type +config.GenericConfiguration.attribute.groupAttributeValueCache0type.description = grouperProvisioningGroupAttribute: Pick an attribute from the Grouper side to store in the database cache
    targetProvisioningGroupAttribute: Pick an attribute from the target side to store in the database cache
    translationScript: Translate data from the Grouper side to store in the database cache +config.GenericConfiguration.attribute.groupAttributeValueCache1type.label = Group attribute value cache 1 type +config.GenericConfiguration.attribute.groupAttributeValueCache1type.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0type.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache2type.label = Group attribute value cache 2 type +config.GenericConfiguration.attribute.groupAttributeValueCache2type.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0type.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache3type.label = Group attribute value cache 3 type +config.GenericConfiguration.attribute.groupAttributeValueCache3type.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0type.description$$ + +config.GenericConfiguration.attribute.groupAttributeValueCache0groupAttribute.label = Group attribute value cache 0 group attribute +config.GenericConfiguration.attribute.groupAttributeValueCache0groupAttribute.description = Pick an attribute from the provisioningGroup object (Grouper or target depending on the source) to store in the database cache +config.GenericConfiguration.attribute.groupAttributeValueCache1groupAttribute.label = Group attribute value cache 1 attribute +config.GenericConfiguration.attribute.groupAttributeValueCache1groupAttribute.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0groupAttribute.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache2groupAttribute.label = Group attribute value cache 2 attribute +config.GenericConfiguration.attribute.groupAttributeValueCache2groupAttribute.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0groupAttribute.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache3groupAttribute.label = Group attribute value cache 3 attribute +config.GenericConfiguration.attribute.groupAttributeValueCache3groupAttribute.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0groupAttribute.description$$ + +config.GenericConfiguration.attribute.groupAttributeValueCache0translationScript.label = Group attribute value cache 0 script +config.GenericConfiguration.attribute.groupAttributeValueCache0translationScript.description = If your source is 'Grouper' you can refer to grouper fields ${grouperProvisioningGroup.name} or attributes ${grouperProvisioningGroup.retrieveAttributeValue('someAttrName')}
    If your source is 'target', you can refer to target fields ${targetGroup.name} or attributes ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.groupAttributeValueCache1translationScript.label = Group attribute value cache 1 script +config.GenericConfiguration.attribute.groupAttributeValueCache1translationScript.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0translationScript.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache2translationScript.label = Group attribute value cache 2 script +config.GenericConfiguration.attribute.groupAttributeValueCache2translationScript.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0translationScript.description$$ +config.GenericConfiguration.attribute.groupAttributeValueCache3translationScript.label = Group attribute value cache 3 script +config.GenericConfiguration.attribute.groupAttributeValueCache3translationScript.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0translationScript.description$$ config.GenericConfiguration.attribute.targetGroupAttribute.i.name.label = __i+1__ - name config.GenericConfiguration.attribute.targetGroupAttribute.i.name.description = Attribute name is the key in the key/value pairs for this group From e05b4638d2cbee334caf0fd93c3275ae710839bf Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sat, 30 Apr 2022 11:31:54 -0400 Subject: [PATCH 031/125] GRP-4014: move attribute value cache from entity attribute section to entity2 section --- grouper/conf/grouper-loader.base.properties | 110 +++++++++++++++--- .../grouper.textNg.en.us.base.properties | 51 +++++++- 2 files changed, 141 insertions(+), 20 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index af2c01b8919c..2a50477bfbcc 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2869,15 +2869,15 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.subjectSourcesToProvision = # Advanced options, note, there might not be any -# {valueType: "boolean", order: 78500, defaultValue: "false", subSection: "membership2", showEl: "${operateOnGrouperMemberships}"} +# {valueType: "boolean", order: 77500, defaultValue: "false", subSection: "membership2", showEl: "${operateOnGrouperMemberships}"} # provisioner.genericProvisioner.membership2AdvancedOptions = # membership attribute name for groups -# {valueType: "string", required: true, order: 79200, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", required: true, order: 77900, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupMembershipAttributeName = # membership attribute value for groups -# {valueType: "string", required: true, order: 79210, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", required: true, order: 77910, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.groupMembershipAttributeValue = # Target group link - has groupAttributeValueCache? @@ -2979,6 +2979,94 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", required: true, order: 80210, subSection: "entity2", showEl: "${operateOnGrouperEntities && provisioningType == 'entityAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.entityMembershipAttributeValue = +# Target entity link - has entityAttributeValueCache? +# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities}", order: 80301} +# provisioner.genericProvisioner.entityAttributeValueCacheHas = + +# Target entity link - has entityAttributeValueCache0? +# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80301} +# provisioner.genericProvisioner.entityAttributeValueCache0has = + +# Target entity link - entityAttributeValueCache0 source +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80302, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.entityAttributeValueCache0source = + +# Target entity link - entityAttributeValueCache0 type +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80304, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# provisioner.genericProvisioner.entityAttributeValueCache0type = + +# Target entity link - entityAttributeValueCache0 entityAttribute +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && entityAttributeValueCache0type == 'entityAttribute'}", order: 80306, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# provisioner.genericProvisioner.entityAttributeValueCache0entityAttribute = + +# Target entity link - entityAttributeValueCache0 translationScript +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && entityAttributeValueCache0type == 'translationScript'}", order: 80308} +# provisioner.genericProvisioner.entityAttributeValueCache0translationScript = + +# Target entity link - has entityAttributeValueCache1? +# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80401} +# provisioner.genericProvisioner.entityAttributeValueCache1has = + +# Target entity link - entityAttributeValueCache1 source +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80402, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.entityAttributeValueCache1source = + +# Target entity link - entityAttributeValueCache1 type +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80404, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# provisioner.genericProvisioner.entityAttributeValueCache1type = + +# Target entity link - entityAttributeValueCache1 entityAttribute +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && entityAttributeValueCache1type == 'entityAttribute'}", order: 80406, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# provisioner.genericProvisioner.entityAttributeValueCache1entityAttribute = + +# Target entity link - entityAttributeValueCache1 translationScript +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && entityAttributeValueCache1type == 'translationScript'}", order: 80408} +# provisioner.genericProvisioner.entityAttributeValueCache1translationScript = + + +# Target entity link - has entityAttributeValueCache2? +# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80501} +# provisioner.genericProvisioner.entityAttributeValueCache2has = + +# Target entity link - entityAttributeValueCache2 source +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80502, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.entityAttributeValueCache2source = + +# Target entity link - entityAttributeValueCache2 type +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80504, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# provisioner.genericProvisioner.entityAttributeValueCache2type = + +# Target entity link - entityAttributeValueCache2 entityAttribute +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && entityAttributeValueCache2type == 'entityAttribute'}", order: 80506, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# provisioner.genericProvisioner.entityAttributeValueCache2entityAttribute = + +# Target entity link - entityAttributeValueCache2 translationScript +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && entityAttributeValueCache2type == 'translationScript'}", order: 80508} +# provisioner.genericProvisioner.entityAttributeValueCache2translationScript = + + +# Target entity link - has entityAttributeValueCache3? +# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80601} +# provisioner.genericProvisioner.entityAttributeValueCache3has = + +# Target entity link - entityAttributeValueCache3 source +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80602, formElement: "dropdown", optionValues: ["grouper", "target"]} +# provisioner.genericProvisioner.entityAttributeValueCache3source = + +# Target entity link - entityAttributeValueCache3 type +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80604, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# provisioner.genericProvisioner.entityAttributeValueCache3type = + +# Target entity link - entityAttributeValueCache3 entityAttribute +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && entityAttributeValueCache3type == 'entityAttribute'}", order: 80606, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# provisioner.genericProvisioner.entityAttributeValueCache3entityAttribute = + +# Target entity link - entityAttributeValueCache3 translationScript +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && entityAttributeValueCache3type == 'translationScript'}", order: 80608} +# provisioner.genericProvisioner.entityAttributeValueCache3translationScript = + + + # Show provisioning diagnostics # {valueType: "boolean", order: 82000, defaultValue: "false", subSection: "provisioningDiagnostics"} # provisioner.genericProvisioner.showProvisioningDiagnostics = @@ -3240,22 +3328,6 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "integer", defaultValue: 20, showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 145000, subSection: "advanced"} # provisioner.genericProvisioner.refreshEntityLinkIfLessThanAmount = -# Target user link - entityAttributeValueCache0 -# {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 146000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache0 = - -# Target user link - entityAttributeValueCache1 -# {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 147000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache1 = - -# Target user link - entityAttributeValueCache2 -# {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 148000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache2 = - -# Target user link - entityAttributeValueCache3 -# {valueType: "string", showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 149000, subSection: "advanced"} -# provisioner.genericProvisioner.common.entityLink.entityAttributeValueCache3 = - # if provisioning normal memberships or privileges # {valueType: "string", order: 150000, formElement: "dropdown", subSection: "advanced", showEl: "${operateOnGrouperMemberships && showAdvanced}", defaultValue: "members", optionValues: ["members", "read, admin", "update, admin", "admin"]} # provisioner.genericProvisioner.membershipFields = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 269e4b5efac7..176de881eab7 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13896,7 +13896,7 @@ config.GenericConfiguration.attribute.groupAttributeValueCache3source.label = Gr config.GenericConfiguration.attribute.groupAttributeValueCache3source.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0source.description$$ config.GenericConfiguration.attribute.groupAttributeValueCache0type.label = Group attribute value cache 0 type -config.GenericConfiguration.attribute.groupAttributeValueCache0type.description = grouperProvisioningGroupAttribute: Pick an attribute from the Grouper side to store in the database cache
    targetProvisioningGroupAttribute: Pick an attribute from the target side to store in the database cache
    translationScript: Translate data from the Grouper side to store in the database cache +config.GenericConfiguration.attribute.groupAttributeValueCache0type.description = groupAttribute: Pick an attribute from the object model to cache
    translationScript: Translate data from the Grouper side to store in the database cache config.GenericConfiguration.attribute.groupAttributeValueCache1type.label = Group attribute value cache 1 type config.GenericConfiguration.attribute.groupAttributeValueCache1type.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0type.description$$ config.GenericConfiguration.attribute.groupAttributeValueCache2type.label = Group attribute value cache 2 type @@ -13922,6 +13922,55 @@ config.GenericConfiguration.attribute.groupAttributeValueCache2translationScript config.GenericConfiguration.attribute.groupAttributeValueCache3translationScript.label = Group attribute value cache 3 script config.GenericConfiguration.attribute.groupAttributeValueCache3translationScript.description = $$config.GenericConfiguration.attribute.groupAttributeValueCache0translationScript.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCacheHas.label = Use entity attribute value cache +config.GenericConfiguration.attribute.entityAttributeValueCacheHas.description = If you need to cache something in the database from the target or from grouper. There are four buckets to store data in + +config.GenericConfiguration.attribute.entityAttributeValueCache0has.label = Use entity attribute value cache 0 +config.GenericConfiguration.attribute.entityAttributeValueCache0has.description = If you need to cache something in the database (grouper_sync_member.member_from_id2 column) from the target or from grouper. +config.GenericConfiguration.attribute.entityAttributeValueCache1has.label = Use entity attribute value cache 1 +config.GenericConfiguration.attribute.entityAttributeValueCache1has.description = If you need to cache something in the database (grouper_sync_member.member_from_id3 column) from the target or from grouper. +config.GenericConfiguration.attribute.entityAttributeValueCache2has.label = Use entity attribute value cache 2 +config.GenericConfiguration.attribute.entityAttributeValueCache2has.description = If you need to cache something in the database (grouper_sync_member.member_to_id2 column) from the target or from grouper. +config.GenericConfiguration.attribute.entityAttributeValueCache3has.label = Use entity attribute value cache 3 +config.GenericConfiguration.attribute.entityAttributeValueCache3has.description = If you need to cache something in the database (grouper_sync_member.member_to_id3 column) from the target or from grouper. + +config.GenericConfiguration.attribute.entityAttributeValueCache0source.label = Entity attribute value cache 0 source +config.GenericConfiguration.attribute.entityAttributeValueCache0source.description = Cache the data from Grouper or from target. You would pick Grouper if there is something in Grouper that might be needed during a delete that might not be available when the data is not in Grouper anymore (e.g. the search attribute). You would pick target when there is something in the target that is needed and maybe to help with performance (e.g. the UUID or DN). +config.GenericConfiguration.attribute.entityAttributeValueCache1source.label = Entity attribute value cache 1 source +config.GenericConfiguration.attribute.entityAttributeValueCache1source.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0source.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache2source.label = Entity attribute value cache 2 source +config.GenericConfiguration.attribute.entityAttributeValueCache2source.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0source.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache3source.label = Entity attribute value cache 3 source +config.GenericConfiguration.attribute.entityAttributeValueCache3source.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0source.description$$ + +config.GenericConfiguration.attribute.entityAttributeValueCache0type.label = Entity attribute value cache 0 type +config.GenericConfiguration.attribute.entityAttributeValueCache0type.description = groupAttribute: Pick an attribute from the object model to store in database cache
    translationScript: Translate data from the Grouper side to store in the database cache +config.GenericConfiguration.attribute.entityAttributeValueCache1type.label = Entity attribute value cache 1 type +config.GenericConfiguration.attribute.entityAttributeValueCache1type.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0type.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache2type.label = Entity attribute value cache 2 type +config.GenericConfiguration.attribute.entityAttributeValueCache2type.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0type.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache3type.label = Entity attribute value cache 3 type +config.GenericConfiguration.attribute.entityAttributeValueCache3type.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0type.description$$ + +config.GenericConfiguration.attribute.entityAttributeValueCache0entityAttribute.label = Entity attribute value cache 0 entity attribute +config.GenericConfiguration.attribute.entityAttributeValueCache0entityAttribute.description = Pick an attribute from the provisioningEntity object (Grouper or target depending on the source) to store in the database cache +config.GenericConfiguration.attribute.entityAttributeValueCache1entityAttribute.label = Entity attribute value cache 1 attribute +config.GenericConfiguration.attribute.entityAttributeValueCache1entityAttribute.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0entityAttribute.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache2entityAttribute.label = Entity attribute value cache 2 attribute +config.GenericConfiguration.attribute.entityAttributeValueCache2entityAttribute.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0entityAttribute.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache3entityAttribute.label = Entity attribute value cache 3 attribute +config.GenericConfiguration.attribute.entityAttributeValueCache3entityAttribute.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0entityAttribute.description$$ + +config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.label = Entity attribute value cache 0 script +config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description = If your source is 'Grouper' you can refer to grouper fields ${grouperProvisioningEntity.name} or attributes ${grouperProvisioningEntity.retrieveAttributeValue('someAttrName')}
    If your source is 'target', you can refer to target fields ${targetEntity.name} or attributes ${targetEntity.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.entityAttributeValueCache1translationScript.label = Entity attribute value cache 1 script +config.GenericConfiguration.attribute.entityAttributeValueCache1translationScript.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache2translationScript.label = Entity attribute value cache 2 script +config.GenericConfiguration.attribute.entityAttributeValueCache2translationScript.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description$$ +config.GenericConfiguration.attribute.entityAttributeValueCache3translationScript.label = Entity attribute value cache 3 script +config.GenericConfiguration.attribute.entityAttributeValueCache3translationScript.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description$$ + + config.GenericConfiguration.attribute.targetGroupAttribute.i.name.label = __i+1__ - name config.GenericConfiguration.attribute.targetGroupAttribute.i.name.description = Attribute name is the key in the key/value pairs for this group config.GenericConfiguration.attribute.option.targetGroupAttribute.i.groupAttributePrefix = Group From 470fa8b4932bbc4a1371338977692e70ca540edb Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 1 May 2022 10:45:44 -0400 Subject: [PATCH 032/125] GRP-4016: refactor subject link and cache --- grouper/conf/grouper-loader.base.properties | 42 ++++--------------- .../grouper.textNg.en.us.base.properties | 14 +------ 2 files changed, 11 insertions(+), 45 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 2a50477bfbcc..411f57430365 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2742,10 +2742,6 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "boolean", order: 42000, required: "true", subSection: "entity", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities)}"} # provisioner.genericProvisioner.selectAllEntities = -# If the subject api is needed before provisioning to ldap -# {valueType: "boolean", defaultValue: "false", order: 46000, subSection: "entity", showEl: "${operateOnGrouperEntities}"} -# provisioner.genericProvisioner.hasSubjectLink = - # if the entities need to be resolved in target # {valueType: "boolean", defaultValue: "false", showEl:"${operateOnGrouperEntities && selectEntities}", order: 53000, subSection: "entity"} # provisioner.genericProvisioner.hasTargetEntityLink = @@ -2992,7 +2988,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache0source = # Target entity link - entityAttributeValueCache0 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80304, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80304, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache0type = # Target entity link - entityAttributeValueCache0 entityAttribute @@ -3000,7 +2996,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache0entityAttribute = # Target entity link - entityAttributeValueCache0 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && entityAttributeValueCache0type == 'translationScript'}", order: 80308} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && (entityAttributeValueCache0type == 'translationScript' || entityAttributeValueCache0type == 'subjectTranslationScript')}", order: 80308} # provisioner.genericProvisioner.entityAttributeValueCache0translationScript = # Target entity link - has entityAttributeValueCache1? @@ -3012,7 +3008,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache1source = # Target entity link - entityAttributeValueCache1 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80404, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80404, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache1type = # Target entity link - entityAttributeValueCache1 entityAttribute @@ -3020,7 +3016,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache1entityAttribute = # Target entity link - entityAttributeValueCache1 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && entityAttributeValueCache1type == 'translationScript'}", order: 80408} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && (entityAttributeValueCache1type == 'translationScript' || entityAttributeValueCache1type == 'subjectTranslationScript')}", order: 80408} # provisioner.genericProvisioner.entityAttributeValueCache1translationScript = @@ -3033,7 +3029,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache2source = # Target entity link - entityAttributeValueCache2 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80504, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80504, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache2type = # Target entity link - entityAttributeValueCache2 entityAttribute @@ -3041,7 +3037,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache2entityAttribute = # Target entity link - entityAttributeValueCache2 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && entityAttributeValueCache2type == 'translationScript'}", order: 80508} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && (entityAttributeValueCache2type == 'translationScript' || entityAttributeValueCache2type == 'subjectTranslationScript')}", order: 80508} # provisioner.genericProvisioner.entityAttributeValueCache2translationScript = @@ -3054,7 +3050,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache3source = # Target entity link - entityAttributeValueCache3 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80604, formElement: "dropdown", optionValues: ["entityAttribute", "translationScript"]} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80604, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache3type = # Target entity link - entityAttributeValueCache3 entityAttribute @@ -3062,7 +3058,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCache3entityAttribute = # Target entity link - entityAttributeValueCache3 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && entityAttributeValueCache3type == 'translationScript'}", order: 80608} +# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && (entityAttributeValueCache3type == 'translationScript' || entityAttributeValueCache3type == 'subjectTranslationScript')}", order: 80608} # provisioner.genericProvisioner.entityAttributeValueCache3translationScript = @@ -3305,25 +3301,9 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.refreshGroupLinkIfLessThanAmount = # refresh subject link if less than this amount -# {valueType: "integer", defaultValue: 20, showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 140000, subSection: "advanced"} +# {valueType: "integer", defaultValue: 20, showEl: "${operateOnGrouperEntities && showAdvanced}", order: 140000, subSection: "advanced"} # provisioner.genericProvisioner.refreshSubjectLinkIfLessThanAmount = -# Subject link - entityAttributeValueCache0 -# {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 141000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache0 = - -# Subject link - entityAttributeValueCache1 -# {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 142000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache1 = - -# Subject link - entityAttributeValueCache2 -# {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 143000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache2 = - -# Subject link - entityAttributeValueCache3 -# {valueType: "string", showEl: "${hasSubjectLink && operateOnGrouperEntities && showAdvanced}", order: 144000, subSection: "advanced"} -# provisioner.genericProvisioner.common.subjectLink.entityAttributeValueCache3 = - # refresh target user link if less than this amount # {valueType: "integer", defaultValue: 20, showEl: "${hasTargetEntityLink && operateOnGrouperEntities && showAdvanced}", order: 145000, subSection: "advanced"} # provisioner.genericProvisioner.refreshEntityLinkIfLessThanAmount = @@ -4132,10 +4112,6 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # {valueType: "boolean", order: 39500, defaultValue: "false", subSection: "entity", showEl: "${false}"} # provisioner.myMessagingProvisioner.deleteEntitiesIfNotExistInGrouper = -# If the subject api is needed before provisioning to ldap -# {valueType: "boolean", defaultValue: "false", order: 46000, subSection: "entity", showEl: "${false}"} -# provisioner.myMessagingProvisioner.hasSubjectLink = - # if the entities need to be resolved in target # {valueType: "boolean", defaultValue: "false", showEl:"${false}", order: 53000, subSection: "entity"} # provisioner.myMessagingProvisioner.hasTargetEntityLink = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 176de881eab7..d2be0511e338 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13865,15 +13865,6 @@ config.GenericConfiguration.attribute.refreshEntityLinkIfLessThanAmount.label = config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.label = Refresh target group link config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.description = Target group links will be refreshed when they can be (full sync retrieve all groups), or when they must be (group link data is not cached in Grouper). Otherwise if there are groups to operate on, if there are only a few (less than this amount), then refresh the group link, otherwise for expediency just use the cached data. Generally you do not need to edit this value. This is an integer. -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache0.label = Subject link - entityAttributeValueCache0 -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache1.label = Subject link - entityAttributeValueCache1 -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache2.label = Subject link - entityAttributeValueCache2 -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache3.label = Subject link - entityAttributeValueCache3 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache0.label = Target entity link - entityAttributeValueCache0 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache1.label = Target entity link - entityAttributeValueCache1 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache2.label = Target entity link - entityAttributeValueCache2 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache3.label = Target entity link - entityAttributeValueCache3 - config.GenericConfiguration.attribute.groupAttributeValueCacheHas.label = Use group attribute value cache config.GenericConfiguration.attribute.groupAttributeValueCacheHas.description = If you need to cache something in the database from the target or from grouper. There are four buckets to store data in @@ -13944,7 +13935,7 @@ config.GenericConfiguration.attribute.entityAttributeValueCache3source.label = E config.GenericConfiguration.attribute.entityAttributeValueCache3source.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0source.description$$ config.GenericConfiguration.attribute.entityAttributeValueCache0type.label = Entity attribute value cache 0 type -config.GenericConfiguration.attribute.entityAttributeValueCache0type.description = groupAttribute: Pick an attribute from the object model to store in database cache
    translationScript: Translate data from the Grouper side to store in the database cache +config.GenericConfiguration.attribute.entityAttributeValueCache0type.description = groupAttribute: Pick an attribute from the object model to store in database cache
    subjectTranslationScript: Translate data from the Subject API for the entity being provisioned. Note, if you are using 'built-in' fields you don't need this... e.g. email, subjectId, subjectIdentifier0, subjectIdentifier1, subjectIdentifier2, you can just translate from a grouper entity attribute
    translationScript: Translate data from the Grouper side to store in the database cache config.GenericConfiguration.attribute.entityAttributeValueCache1type.label = Entity attribute value cache 1 type config.GenericConfiguration.attribute.entityAttributeValueCache1type.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0type.description$$ config.GenericConfiguration.attribute.entityAttributeValueCache2type.label = Entity attribute value cache 2 type @@ -13962,7 +13953,7 @@ config.GenericConfiguration.attribute.entityAttributeValueCache3entityAttribute. config.GenericConfiguration.attribute.entityAttributeValueCache3entityAttribute.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0entityAttribute.description$$ config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.label = Entity attribute value cache 0 script -config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description = If your source is 'Grouper' you can refer to grouper fields ${grouperProvisioningEntity.name} or attributes ${grouperProvisioningEntity.retrieveAttributeValue('someAttrName')}
    If your source is 'target', you can refer to target fields ${targetEntity.name} or attributes ${targetEntity.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description = If your source is 'Grouper' and type is 'translationScript' you can refer to grouper fields ${grouperProvisioningEntity.name} or attributes ${grouperProvisioningEntity.retrieveAttributeValue('someAttrName')}
    If your source is 'Grouper' and the type is 'subjectTranslationScript', you can use fields or attributes from the Subject API subject, e.g. ${subject.name} or ${subject.getAttributeValue('email')}
    If your source is 'target', you can refer to target fields ${targetEntity.name} or attributes ${targetEntity.retrieveAttributeValue('someAttrName')} config.GenericConfiguration.attribute.entityAttributeValueCache1translationScript.label = Entity attribute value cache 1 script config.GenericConfiguration.attribute.entityAttributeValueCache1translationScript.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description$$ config.GenericConfiguration.attribute.entityAttributeValueCache2translationScript.label = Entity attribute value cache 2 script @@ -13970,7 +13961,6 @@ config.GenericConfiguration.attribute.entityAttributeValueCache2translationScrip config.GenericConfiguration.attribute.entityAttributeValueCache3translationScript.label = Entity attribute value cache 3 script config.GenericConfiguration.attribute.entityAttributeValueCache3translationScript.description = $$config.GenericConfiguration.attribute.entityAttributeValueCache0translationScript.description$$ - config.GenericConfiguration.attribute.targetGroupAttribute.i.name.label = __i+1__ - name config.GenericConfiguration.attribute.targetGroupAttribute.i.name.description = Attribute name is the key in the key/value pairs for this group config.GenericConfiguration.attribute.option.targetGroupAttribute.i.groupAttributePrefix = Group From 29e6ebd246453f9256425541aa03e81e9df842a7 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 1 May 2022 17:10:16 -0400 Subject: [PATCH 033/125] GRP-4016: refactor subject link and cache --- .../grouper.textNg.en.us.base.properties | 2 - .../grouper.textNg.fr.fr.base.properties | 2 - .../GrouperProvisioningBehavior.java | 303 ++------------- .../GrouperProvisioningConfiguration.java | 285 ++++---------- ...isioningConfigurationAttributeDbCache.java | 102 +++++ ...ngConfigurationAttributeDbCacheSource.java | 21 + ...ningConfigurationAttributeDbCacheType.java | 30 ++ .../GrouperProvisioningGrouperSyncDao.java | 64 ++-- .../GrouperProvisioningLinkLogic.java | 360 ++++++++++++------ .../middleware/grouper/util/GrouperUtil.java | 12 +- 10 files changed, 537 insertions(+), 644 deletions(-) create mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCache.java create mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheSource.java create mode 100644 grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheType.java diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index d2be0511e338..8c8b0a8f77d2 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -14180,8 +14180,6 @@ config.GenericConfiguration.attribute.subjectSourcesToProvision.description = Ge grouperProvisioningSubjectSourcesToProvisionRequiresEntitiesInvalid = Error with '$$config.GenericConfiguration.attribute.subjectSourcesToProvision.label$$', if you configure sources then you need to '$$config.GenericConfiguration.attribute.operateOnGrouperEntities.label$$' -config.GenericConfiguration.attribute.hasSubjectLink.label = Has subject link -config.GenericConfiguration.attribute.hasSubjectLink.description = If the subjectId or the primary subjectIdentifier is needed to perform provisioning, then you do not need a subject link. If you need more subject attributes, then you do need a subject link to lookup subject attribute from the subject API. config.GenericConfiguration.attribute.hasTargetEntityLink.label = Has target entity link config.GenericConfiguration.attribute.hasTargetEntityLink.description = "Entity link" is when memberships refer to some data that does not exist in Grouper or the Subject API and needs to be retrieved from the target Entity object. This data is cached in the "member sync" database table. Here are some examples:
    1. Provisioning membership objects where the entity reference is a target DN or UUID.
    2. Provisioning groupAttributes where the entity value is a target DN or UUID
    diff --git a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties index 343704b4bb1c..8ae847e9bf5a 100644 --- a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties @@ -12850,8 +12850,6 @@ config.GenericConfiguration.attribute.deleteEntitiesIfGrouperCreated.description config.GenericConfiguration.attribute.subjectSourcesToProvision.label=Sources des sujets à approvisionner config.GenericConfiguration.attribute.subjectSourcesToProvision.description=Généralement, vous ne sélectionnerez que vos sources « personnes ». Si un sujet ne figure dans aucune des sources sélectionnées, il n'est pas considéré comme provisionnable. -config.GenericConfiguration.attribute.hasSubjectLink.label=A un lien de sujet -config.GenericConfiguration.attribute.hasSubjectLink.description=Si le subjectId ou le subjectIdentifier principal est nécessaire pour effectuer l'approvisionnement, vous n'avez pas besoin de lien d'objet. Si vous avez besoin de plus d'attributs de sujet, alors vous avez besoin d'un lien de sujet pour rechercher l'attribut de sujet à partir de l'API de sujet. config.GenericConfiguration.attribute.hasTargetEntityLink.label=A un lien d'entité cible config.GenericConfiguration.attribute.hasTargetEntityLink.description = "Entity link" is when memberships refer to some data that does not exist in Grouper or the Subject API and needs to be retrieved from the target Entity object. This data is cached in the "member sync" database table. Here are some examples:
    1. Provisioning membership objects where the entity reference is a target DN or UUID.
    2. Provisioning groupAttributes where the entity value is a target DN or UUID
    diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java index fb19bdc44c21..2d1c30a6b863 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java @@ -265,291 +265,42 @@ public void setHasTargetEntityLink(Boolean hasTargetEntityLink) { public boolean isHasSubjectLink() { - if (hasSubjectLink != null) { - return hasSubjectLink; - } - return this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().isHasSubjectLink(); - } - - - - public void setHasSubjectLink(Boolean hasSubjectLink) { - this.hasSubjectLink = hasSubjectLink; - } - - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasGroupLinkGroupAttributeValueCache0() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache0())) { - return true; - } - - if (null != getGroupLinkGroupAttributeValueCache0Attribute()) { - return true; - } - - return false; - - } - - public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache2Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } - - public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache0Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } - - public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache1Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } - - public GrouperProvisioningConfigurationAttribute getEntityLinkEntityAttributeValueCache3Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (StringUtils.equals("entityAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } - - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache2Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache2", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } - - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache3Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache3", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } - - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache0Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache0", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } - - public GrouperProvisioningConfigurationAttribute getGroupLinkGroupAttributeValueCache1Attribute() { - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (StringUtils.equals("groupAttributeValueCache1", grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return grouperProvisioningConfigurationAttribute; - } - } - return null; - } + if (hasSubjectLink == null) { + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + boolean hasSubjectLinkEntityAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + boolean hasSubjectLinkEntityAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasGroupLinkGroupAttributeValueCache1() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache1())) { - return true; - } + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + boolean hasSubjectLinkEntityAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); - if (null != getGroupLinkGroupAttributeValueCache1Attribute()) { - return true; + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + boolean hasSubjectLinkEntityAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript()); + this.hasSubjectLink = hasSubjectLinkEntityAttributeValueCache0 || hasSubjectLinkEntityAttributeValueCache1 + || hasSubjectLinkEntityAttributeValueCache2 || hasSubjectLinkEntityAttributeValueCache3; } - return false; + return hasSubjectLink; } - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasGroupLinkGroupAttributeValueCache2() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache2())) { - return true; - } - if (null != getGroupLinkGroupAttributeValueCache2Attribute()) { - return true; - } - - return false; - - } - - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasGroupLinkGroupAttributeValueCache3() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache3())) { - return true; - } - - if (null != getGroupLinkGroupAttributeValueCache3Attribute()) { - return true; - } - - return false; - - } - - - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasEntityLinkEntityAttributeValueCache2() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache2())) { - return true; - } - - if (null != getEntityLinkEntityAttributeValueCache2Attribute()) { - return true; - } - - return false; - - } - - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasEntityLinkEntityAttributeValueCache0() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache0())) { - return true; - } - - if (null != getEntityLinkEntityAttributeValueCache0Attribute()) { - return true; - } - - return false; - - } - - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasEntityLinkEntityAttributeValueCache1() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache1())) { - return true; - } - - if (null != getEntityLinkEntityAttributeValueCache1Attribute()) { - return true; - } - - return false; - - } - - - /** - * - * @return true if has script or an attribute mapped - */ - public boolean isHasEntityLinkEntityAttributeValueCache3() { - - if (StringUtils.isNotBlank(this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache3())) { - return true; - } - - if (null != getEntityLinkEntityAttributeValueCache3Attribute()) { - return true; - } - - return false; - + public void setHasSubjectLink(Boolean hasSubjectLink) { + this.hasSubjectLink = hasSubjectLink; } public boolean isHasTargetGroupLink() { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java index 2b96e3a55a15..4a853d6123bc 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java @@ -1023,68 +1023,6 @@ public void preConfigure() { private Set subjectSourcesToProvision = null; - private String subjectLinkEntityAttributeValueCache0; - - private String subjectLinkEntityAttributeValueCache1; - - private String subjectLinkEntityAttributeValueCache2; - - private String subjectLinkEntityAttributeValueCache3; - - - public String getSubjectLinkEntityAttributeValueCache0() { - return subjectLinkEntityAttributeValueCache0; - } - - - - - public void setSubjectLinkEntityAttributeValueCache0(String subjectLinkEntityAttributeValueCache0) { - this.subjectLinkEntityAttributeValueCache0 = subjectLinkEntityAttributeValueCache0; - } - - - - - public String getSubjectLinkEntityAttributeValueCache1() { - return subjectLinkEntityAttributeValueCache1; - } - - - - - public void setSubjectLinkEntityAttributeValueCache1(String subjectLinkEntityAttributeValueCache1) { - this.subjectLinkEntityAttributeValueCache1 = subjectLinkEntityAttributeValueCache1; - } - - - - - public String getSubjectLinkEntityAttributeValueCache2() { - return subjectLinkEntityAttributeValueCache2; - } - - - - - public void setSubjectLinkEntityAttributeValueCache2(String subjectLinkEntityAttributeValueCache2) { - this.subjectLinkEntityAttributeValueCache2 = subjectLinkEntityAttributeValueCache2; - } - - - - - public String getSubjectLinkEntityAttributeValueCache3() { - return subjectLinkEntityAttributeValueCache3; - } - - - - - public void setSubjectLinkEntityAttributeValueCache3(String subjectLinkEntityAttributeValueCache3) { - this.subjectLinkEntityAttributeValueCache3 = subjectLinkEntityAttributeValueCache3; - } - /** * attributes to use when searching, targetId is first if multiple */ @@ -2328,21 +2266,64 @@ public void configureGenericSettings() { } this.debugMap.put("subjectSourcesToProvision", GrouperUtil.join(this.subjectSourcesToProvision.iterator(), ',')); - this.subjectLinkEntityAttributeValueCache0 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache0", false); - this.subjectLinkEntityAttributeValueCache1 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache1", false); - this.subjectLinkEntityAttributeValueCache2 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache2", false); - this.subjectLinkEntityAttributeValueCache3 = this.retrieveConfigString("common.subjectLink.entityAttributeValueCache3", false); + this.groupAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupAttributeValueCacheHas", false), false); + if (this.groupAttributeValueCacheHas) { + this.grouperProvisioningConfigurationGroupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; - this.groupLinkGroupAttributeValueCache0 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache0", false); - this.groupLinkGroupAttributeValueCache1 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache1", false); - this.groupLinkGroupAttributeValueCache2 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache2", false); - this.groupLinkGroupAttributeValueCache3 = this.retrieveConfigString("common.groupLink.groupAttributeValueCache3", false); - - this.entityLinkEntityAttributeValueCache0 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache0", false); - this.entityLinkEntityAttributeValueCache1 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache1", false); - this.entityLinkEntityAttributeValueCache2 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache2", false); - this.entityLinkEntityAttributeValueCache3 = this.retrieveConfigString("common.entityLink.entityAttributeValueCache3", false); + for (int i=0;i<4;i++) { + boolean theGroupAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupAttributeValueCache" + i + "has", false), false); + if (!theGroupAttributeValueCacheHas) { + continue; + } + this.grouperProvisioningConfigurationGroupAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "group"); + String theGroupAttributeValueCache0source = this.retrieveConfigString("groupAttributeValueCache" + i + "source", true); + this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setSource( + GrouperProvisioningConfigurationAttributeDbCacheSource.valueOfIgnoreCase(theGroupAttributeValueCache0source, true)); + + String theGroupAttributeValueCache0type = this.retrieveConfigString("groupAttributeValueCache" + i + "type", true); + this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setType( + GrouperProvisioningConfigurationAttributeDbCacheType.valueOfIgnoreCase(theGroupAttributeValueCache0type, true)); + + if (this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("groupAttributeValueCache" + i + "groupAttribute", true)); + } else if (this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) { + this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("groupAttributeValueCache" + i + "translationScript", true)); + } else { + throw new RuntimeException("Invalid attribute cache type: " + "groupAttributeValueCache" + i + "type" + ", " + + this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].getType()); + } + } + } + + this.entityAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityAttributeValueCacheHas", false), false); + if (this.entityAttributeValueCacheHas) { + this.grouperProvisioningConfigurationEntityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; + for (int i=0;i<4;i++) { + boolean theEntityAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityAttributeValueCache" + i + "has", false), false); + if (!theEntityAttributeValueCacheHas) { + continue; + } + this.grouperProvisioningConfigurationEntityAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "entity"); + String theEntityAttributeValueCache0source = this.retrieveConfigString("entityAttributeValueCache" + i + "source", true); + this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setSource( + GrouperProvisioningConfigurationAttributeDbCacheSource.valueOfIgnoreCase(theEntityAttributeValueCache0source, true)); + + String theEntityAttributeValueCache0type = this.retrieveConfigString("entityAttributeValueCache" + i + "type", true); + this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setType( + GrouperProvisioningConfigurationAttributeDbCacheType.valueOfIgnoreCase(theEntityAttributeValueCache0type, true)); + + if (this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("entityAttributeValueCache" + i + "entityAttribute", true)); + } else if (this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) { + this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("entityAttributeValueCache" + i + "translationScript", true)); + } else { + throw new RuntimeException("Invalid attribute cache type: " + "entityAttributeValueCache" + i + "type" + ", " + + this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].getType()); + } + } + } + this.refreshSubjectLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshSubjectLinkIfLessThanAmount", false), 20); this.refreshGroupLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshGroupLinkIfLessThanAmount", false), 20); this.refreshEntityLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshEntityLinkIfLessThanAmount", false), 20); @@ -2609,11 +2590,31 @@ public boolean isGroupsRequireMembers() { return groupsRequireMembers; } + private boolean groupAttributeValueCacheHas; + public boolean isGroupAttributeValueCacheHas() { + return groupAttributeValueCacheHas; + } + private Boolean entityAttributeValueCacheHas; + public boolean isEntityAttributeValueCacheHas() { + return entityAttributeValueCacheHas; + } + private GrouperProvisioningConfigurationAttributeDbCache[] grouperProvisioningConfigurationGroupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; + + public GrouperProvisioningConfigurationAttributeDbCache[] getGrouperProvisioningConfigurationGroupAttributeDbCaches() { + return grouperProvisioningConfigurationGroupAttributeDbCaches; + } + + private GrouperProvisioningConfigurationAttributeDbCache[] grouperProvisioningConfigurationEntityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; + + public GrouperProvisioningConfigurationAttributeDbCache[] getGrouperProvisioningConfigurationEntityAttributeDbCaches() { + return grouperProvisioningConfigurationEntityAttributeDbCaches; + } + private void assignAutoTranslatedGroupsConfiguration() { if (this.getGrouperProvisioner().retrieveGrouperProvisioningTranslator().isTranslateGrouperToTargetAutomatically()) { @@ -2818,77 +2819,6 @@ public void setRecalculateAllOperations(boolean recalculateAllOperations) { */ private boolean configured = false; - private String entityLinkEntityAttributeValueCache0; - - private String entityLinkEntityAttributeValueCache1; - - private String entityLinkEntityAttributeValueCache2; - - private String entityLinkEntityAttributeValueCache3; - - - - public String getEntityLinkEntityAttributeValueCache0() { - return entityLinkEntityAttributeValueCache0; - } - - - - - public void setEntityLinkEntityAttributeValueCache0(String entityLinkEntityAttributeValueCache0) { - this.entityLinkEntityAttributeValueCache0 = entityLinkEntityAttributeValueCache0; - } - - - - - public String getEntityLinkEntityAttributeValueCache1() { - return entityLinkEntityAttributeValueCache1; - } - - - - - public void setEntityLinkEntityAttributeValueCache1(String entityLinkEntityAttributeValueCache1) { - this.entityLinkEntityAttributeValueCache1 = entityLinkEntityAttributeValueCache1; - } - - - - - public String getEntityLinkEntityAttributeValueCache2() { - return entityLinkEntityAttributeValueCache2; - } - - - - - public void setEntityLinkEntityAttributeValueCache2(String entityLinkEntityAttributeValueCache2) { - this.entityLinkEntityAttributeValueCache2 = entityLinkEntityAttributeValueCache2; - } - - - - - public String getEntityLinkEntityAttributeValueCache3() { - return entityLinkEntityAttributeValueCache3; - } - - - - - public void setEntityLinkEntityAttributeValueCache3(String entityLinkEntityAttributeValueCache3) { - this.entityLinkEntityAttributeValueCache3 = entityLinkEntityAttributeValueCache3; - } - - private String groupLinkGroupAttributeValueCache0; - - private String groupLinkGroupAttributeValueCache1; - - private String groupLinkGroupAttributeValueCache2; - - private String groupLinkGroupAttributeValueCache3; - /** * attribute name to config */ @@ -2909,60 +2839,6 @@ public Map getTargetEntityAtt } - public String getGroupLinkGroupAttributeValueCache0() { - return groupLinkGroupAttributeValueCache0; - } - - - - - public void setGroupLinkGroupAttributeValueCache0(String groupLinkGroupAttributeValueCache0) { - this.groupLinkGroupAttributeValueCache0 = groupLinkGroupAttributeValueCache0; - } - - - - - public String getGroupLinkGroupAttributeValueCache1() { - return groupLinkGroupAttributeValueCache1; - } - - - - - public void setGroupLinkGroupAttributeValueCache1(String groupLinkGroupAttributeValueCache1) { - this.groupLinkGroupAttributeValueCache1 = groupLinkGroupAttributeValueCache1; - } - - - - - public String getGroupLinkGroupAttributeValueCache2() { - return groupLinkGroupAttributeValueCache2; - } - - - - - public void setGroupLinkGroupAttributeValueCache2(String groupLinkGroupAttributeValueCache2) { - this.groupLinkGroupAttributeValueCache2 = groupLinkGroupAttributeValueCache2; - } - - - - - public String getGroupLinkGroupAttributeValueCache3() { - return groupLinkGroupAttributeValueCache3; - } - - - - - public void setGroupLinkGroupAttributeValueCache3(String groupLinkGroupAttributeValueCache3) { - this.groupLinkGroupAttributeValueCache3 = groupLinkGroupAttributeValueCache3; - } - - /** * configure the provisioner, call super if subclassing @@ -3013,15 +2889,6 @@ public void setDebugMap(Map debugMap) { } - public boolean isHasSubjectLink() { - return hasSubjectLink; - } - - - public void setHasSubjectLink(boolean hasSubjectLink) { - this.hasSubjectLink = hasSubjectLink; - } - public boolean isHasTargetGroupLink() { return hasTargetGroupLink; diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCache.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCache.java new file mode 100644 index 000000000000..16188e7cd383 --- /dev/null +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCache.java @@ -0,0 +1,102 @@ +package edu.internet2.middleware.grouper.app.provisioning; + +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +import edu.internet2.middleware.grouper.util.GrouperUtil; + +public class GrouperProvisioningConfigurationAttributeDbCache { + + public GrouperProvisioningConfigurationAttributeDbCache(GrouperProvisioner grouperProvisioner1, int index1, String objectType1) { + this.grouperProvisioner = grouperProvisioner1; + this.index = index1; + this.objectType = objectType1; + } + + public GrouperProvisioningConfigurationAttribute retrieveAttribute() { + if (this.type != GrouperProvisioningConfigurationAttributeDbCacheType.attribute + || StringUtils.isBlank(this.attributeName)) { + return null; + } + + Map targetGroupAttributeNameToConfig = null; + + if (StringUtils.equals("group", this.objectType)) { + targetGroupAttributeNameToConfig = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig(); + } else if (StringUtils.equals("entity", this.objectType)) { + targetGroupAttributeNameToConfig = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig(); + } else { + throw new RuntimeException("Invalid object type '" + this.objectType + "'"); + } + + GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = targetGroupAttributeNameToConfig.get(this.attributeName); + + GrouperUtil.assertion(grouperProvisioningConfigurationAttribute != null, this.objectType + " attribute cache " + this.index + " attribute not found: '" + this.attributeName + "'"); + + return grouperProvisioningConfigurationAttribute; + } + + private GrouperProvisioner grouperProvisioner = null; + + /** + * group or entity + */ + private String objectType; + + /** + * group or entity + * @return the object type + */ + public String getObjectType() { + return objectType; + } + + private int index; + + + private GrouperProvisioningConfigurationAttributeDbCacheSource source; + + private GrouperProvisioningConfigurationAttributeDbCacheType type; + + private String attributeName; + + private String translationScript; + + public int getIndex() { + return index; + } + + public GrouperProvisioningConfigurationAttributeDbCacheSource getSource() { + return source; + } + + public void setSource(GrouperProvisioningConfigurationAttributeDbCacheSource source) { + this.source = source; + } + + public GrouperProvisioningConfigurationAttributeDbCacheType getType() { + return type; + } + + public void setType(GrouperProvisioningConfigurationAttributeDbCacheType type) { + this.type = type; + } + + public String getAttributeName() { + return attributeName; + } + + public void setAttributeName(String attributeName) { + this.attributeName = attributeName; + } + + public String getTranslationScript() { + return translationScript; + } + + public void setTranslationScript(String translationScript) { + this.translationScript = translationScript; + } + +} diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheSource.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheSource.java new file mode 100644 index 000000000000..48ea4c516091 --- /dev/null +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheSource.java @@ -0,0 +1,21 @@ +package edu.internet2.middleware.grouper.app.provisioning; + +import edu.internet2.middleware.grouper.app.attestation.AttestationType; +import edu.internet2.middleware.grouper.util.GrouperUtil; + +public enum GrouperProvisioningConfigurationAttributeDbCacheSource { + grouper, target; + + /** + * do a case-insensitive matching + * + * @param string + * @param exceptionOnBlank will not allow null or blank entries + * @return the enum or null or exception if not found + */ + public static GrouperProvisioningConfigurationAttributeDbCacheSource valueOfIgnoreCase(String string, boolean exceptionOnBlank) { + return GrouperUtil.enumValueOfIgnoreCase(GrouperProvisioningConfigurationAttributeDbCacheSource.class, + string, exceptionOnBlank); + } + +} diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheType.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheType.java new file mode 100644 index 000000000000..77eb9722dea8 --- /dev/null +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttributeDbCacheType.java @@ -0,0 +1,30 @@ +package edu.internet2.middleware.grouper.app.provisioning; + +import org.apache.commons.lang3.StringUtils; + +import edu.internet2.middleware.grouper.util.GrouperUtil; + +/** + * + * @author mchyzer + * + */ +public enum GrouperProvisioningConfigurationAttributeDbCacheType { + + attribute, subjectTranslationScript, translationScript; + + /** + * do a case-insensitive matching + * + * @param string + * @param exceptionOnBlank will not allow null or blank entries + * @return the enum or null or exception if not found + */ + public static GrouperProvisioningConfigurationAttributeDbCacheType valueOfIgnoreCase(String string, boolean exceptionOnBlank) { + if (StringUtils.equalsIgnoreCase(string, "groupAttribute") || StringUtils.equalsIgnoreCase(string, "entityAttribute")) { + return GrouperProvisioningConfigurationAttributeDbCacheType.attribute; + } + return GrouperUtil.enumValueOfIgnoreCase(GrouperProvisioningConfigurationAttributeDbCacheType.class, + string, exceptionOnBlank); + } +} diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java index 41bf102e1bbb..ec4c43fc5894 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java @@ -472,24 +472,36 @@ public void updateSubjectLink( } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String subjectLinkEntityAttributeValueCache0 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache0(); - boolean hasSubjectLinkEntityAttributeValueCache0 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache0); - - String subjectLinkEntityAttributeValueCache1 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache1(); - boolean hasSubjectLinkEntityAttributeValueCache1 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache1); - - String subjectLinkEntityAttributeValueCache2 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache2(); - boolean hasSubjectLinkEntityAttributeValueCache2 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache2); - - String subjectLinkEntityAttributeValueCache3 = this.grouperProvisioner - .retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache3(); - boolean hasSubjectLinkEntityAttributeValueCache3 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache3); - - if (!hasSubjectLinkEntityAttributeValueCache0 && !hasSubjectLinkEntityAttributeValueCache1 - && !hasSubjectLinkEntityAttributeValueCache2 && !hasSubjectLinkEntityAttributeValueCache3) { + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + boolean hasSubjectLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper + && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + boolean hasSubjectLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper + && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + boolean hasSubjectLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper + && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + boolean hasSubjectLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper + && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript()); + + if (!hasSubjectLinkAttributeValueCache0 && !hasSubjectLinkAttributeValueCache1 + && !hasSubjectLinkAttributeValueCache2 && !hasSubjectLinkAttributeValueCache3) { return; } @@ -523,27 +535,27 @@ public void updateSubjectLink( Map variableMap = new HashMap(); variableMap.put("subject", subject); - if (hasSubjectLinkEntityAttributeValueCache0) { + if (hasSubjectLinkAttributeValueCache0) { String entityAttributeValueCache0Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache0, variableMap); + .substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript(), variableMap); gcGrouperSyncMember.setEntityAttributeValueCache0(entityAttributeValueCache0Value); } - if (hasSubjectLinkEntityAttributeValueCache1) { + if (hasSubjectLinkAttributeValueCache1) { String entityAttributeValueCache1Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache1, variableMap); + .substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript(), variableMap); gcGrouperSyncMember.setEntityAttributeValueCache1(entityAttributeValueCache1Value); } - if (hasSubjectLinkEntityAttributeValueCache2) { + if (hasSubjectLinkAttributeValueCache2) { String entityAttributeValueCache2Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache2, variableMap); + .substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript(), variableMap); gcGrouperSyncMember.setEntityAttributeValueCache2(entityAttributeValueCache2Value); } - if (hasSubjectLinkEntityAttributeValueCache1) { + if (hasSubjectLinkAttributeValueCache1) { String entityAttributeValueCache3Value = GrouperUtil - .substituteExpressionLanguage(subjectLinkEntityAttributeValueCache3, variableMap); + .substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript(), variableMap); gcGrouperSyncMember.setEntityAttributeValueCache3(entityAttributeValueCache3Value); } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java index 07c8d70a5d37..5adaec53389e 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java @@ -52,16 +52,31 @@ public boolean groupLinkMissing(GcGrouperSyncGroup gcGrouperSyncGroup) { } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasGroupLinkGroupAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache0(); - boolean hasGroupLinkGroupAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache1(); - boolean hasGroupLinkGroupAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache2(); - boolean hasGroupLinkGroupAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache3(); - + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + boolean hasGroupLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + boolean hasGroupLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + boolean hasGroupLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + boolean hasGroupLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + boolean needsRefresh = false; - needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache0())); - needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache1())); - needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache2())); - needsRefresh = needsRefresh || (hasGroupLinkGroupAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache3())); + needsRefresh = needsRefresh || (hasGroupLinkAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache0())); + needsRefresh = needsRefresh || (hasGroupLinkAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache1())); + needsRefresh = needsRefresh || (hasGroupLinkAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache2())); + needsRefresh = needsRefresh || (hasGroupLinkAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache3())); return needsRefresh; } @@ -77,17 +92,31 @@ public boolean entityLinkMissing(GcGrouperSyncMember gcGrouperSyncMember) { return false; } - // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasEntityLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache0(); - boolean hasEntityLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache1(); - boolean hasEntityLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache2(); - boolean hasEntityLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache3(); - + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + boolean hasEntityLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + boolean hasEntityLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + boolean hasEntityLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + boolean hasEntityLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + boolean needsRefresh = false; - needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache0())); - needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache1())); - needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache2())); - needsRefresh = needsRefresh || (hasEntityLinkEntityAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache3())); + needsRefresh = needsRefresh || (hasEntityLinkAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache0())); + needsRefresh = needsRefresh || (hasEntityLinkAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache1())); + needsRefresh = needsRefresh || (hasEntityLinkAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache2())); + needsRefresh = needsRefresh || (hasEntityLinkAttributeValueCache3 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache3())); return needsRefresh; } @@ -105,20 +134,34 @@ public void retrieveSubjectLink() { if (GrouperUtil.length(gcGrouperSyncMembers) == 0) { return; } - + if (!this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().isEntityAttributeValueCacheHas()) { + return; + } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String subjectLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache0(); - boolean hasSubjectLinkEntityAttributeValueCache0 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache0); - - String subjectLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache1(); - boolean hasSubjectLinkEntityAttributeValueCache1 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache1); - - String subjectLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache2(); - boolean hasSubjectLinkEntityAttributeValueCache2 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache2); - - String subjectLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache3(); - boolean hasSubjectLinkEntityAttributeValueCache3 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache3); - + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + boolean hasSubjectLinkEntityAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + boolean hasSubjectLinkEntityAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + boolean hasSubjectLinkEntityAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + boolean hasSubjectLinkEntityAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript()); + if (!hasSubjectLinkEntityAttributeValueCache0 && !hasSubjectLinkEntityAttributeValueCache1 && !hasSubjectLinkEntityAttributeValueCache2 && !hasSubjectLinkEntityAttributeValueCache3) { return; } @@ -150,7 +193,7 @@ public void retrieveSubjectLink() { /** * update group link for these groups - * @param gcGrouperSyncGroupsToRefreshGroupLink + * @param provisioningGroupWrappers */ public void updateGroupLink(Collection provisioningGroupWrappers) { @@ -159,26 +202,40 @@ public void updateGroupLink(Collection provisioningGro } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String groupLinkGroupAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache0(); - GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache0Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache0Attribute(); - boolean hasGroupLinkGroupAttributeValueCache0 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache0) || groupLinkGroupAttributeValueCache0Attribute != null; - String groupLinkGroupAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache1(); - GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache1Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache1Attribute(); - boolean hasGroupLinkGroupAttributeValueCache1 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache1) || groupLinkGroupAttributeValueCache1Attribute != null; - - String groupLinkGroupAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache2(); - GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache2Attribute(); - boolean hasGroupLinkGroupAttributeValueCache2 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache2) || groupLinkGroupAttributeValueCache2Attribute != null; - - String groupLinkGroupAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupLinkGroupAttributeValueCache3(); - GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getGroupLinkGroupAttributeValueCache3Attribute(); - boolean hasGroupLinkGroupAttributeValueCache3 = !StringUtils.isBlank(groupLinkGroupAttributeValueCache3) || groupLinkGroupAttributeValueCache3Attribute != null; - - if (!hasGroupLinkGroupAttributeValueCache0 && !hasGroupLinkGroupAttributeValueCache1 && !hasGroupLinkGroupAttributeValueCache2 && !hasGroupLinkGroupAttributeValueCache3) { + if (!this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().isGroupAttributeValueCacheHas()) { return; } - + // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + boolean hasGroupLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache0Attribute = + grouperProvisioningConfigurationAttributeDbCache0 == null ? null : grouperProvisioningConfigurationAttributeDbCache0.retrieveAttribute(); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + boolean hasGroupLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null; + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache1Attribute = + grouperProvisioningConfigurationAttributeDbCache1 == null ? null : grouperProvisioningConfigurationAttributeDbCache1.retrieveAttribute(); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + boolean hasGroupLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null; + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache2Attribute = + grouperProvisioningConfigurationAttributeDbCache2 == null ? null : grouperProvisioningConfigurationAttributeDbCache2.retrieveAttribute(); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + boolean hasGroupLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null; + GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache3Attribute = + grouperProvisioningConfigurationAttributeDbCache3 == null ? null : grouperProvisioningConfigurationAttributeDbCache3.retrieveAttribute(); + + if (!hasGroupLinkAttributeValueCache0 && !hasGroupLinkAttributeValueCache1 && !hasGroupLinkAttributeValueCache2 && !hasGroupLinkAttributeValueCache3) { + return; + } + int groupsCannotFindLinkData = 0; int groupsCannotFindSyncGroup = 0; @@ -211,12 +268,12 @@ public void updateGroupLink(Collection provisioningGro Map variableMap = new HashMap(); variableMap.put("targetGroup", targetGroup); - if (hasGroupLinkGroupAttributeValueCache0) { + if (hasGroupLinkAttributeValueCache0) { String groupAttributeValueCache0Value = null; if (groupLinkGroupAttributeValueCache0Attribute != null) { groupAttributeValueCache0Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache0Attribute); } else { - groupAttributeValueCache0Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache0, variableMap, true, false, true)); + groupAttributeValueCache0Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(groupAttributeValueCache0Value, gcGrouperSyncGroup.getGroupAttributeValueCache0())) { gcGrouperSyncGroup.setGroupAttributeValueCache0(groupAttributeValueCache0Value); @@ -224,12 +281,12 @@ public void updateGroupLink(Collection provisioningGro } } - if (hasGroupLinkGroupAttributeValueCache1) { + if (hasGroupLinkAttributeValueCache1) { String groupAttributeValueCache1Value = null; if (groupLinkGroupAttributeValueCache1Attribute != null) { groupAttributeValueCache1Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache1Attribute); } else { - groupAttributeValueCache1Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache1, variableMap, true, false, true)); + groupAttributeValueCache1Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(groupAttributeValueCache1Value, gcGrouperSyncGroup.getGroupAttributeValueCache1())) { gcGrouperSyncGroup.setGroupAttributeValueCache1(groupAttributeValueCache1Value); @@ -237,12 +294,12 @@ public void updateGroupLink(Collection provisioningGro } } - if (hasGroupLinkGroupAttributeValueCache2) { + if (hasGroupLinkAttributeValueCache2) { String groupAttributeValueCache2Value = null; if (groupLinkGroupAttributeValueCache2Attribute != null) { groupAttributeValueCache2Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache2Attribute); } else { - groupAttributeValueCache2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache2, variableMap, true, false, true)); + groupAttributeValueCache2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(groupAttributeValueCache2Value, gcGrouperSyncGroup.getGroupAttributeValueCache2())) { gcGrouperSyncGroup.setGroupAttributeValueCache2(groupAttributeValueCache2Value); @@ -250,12 +307,12 @@ public void updateGroupLink(Collection provisioningGro } } - if (hasGroupLinkGroupAttributeValueCache1) { + if (hasGroupLinkAttributeValueCache1) { String groupAttributeValueCache3Value = null; if (groupLinkGroupAttributeValueCache3Attribute != null) { groupAttributeValueCache3Value = targetGroup.retrieveAttributeValueString(groupLinkGroupAttributeValueCache3Attribute); } else { - groupAttributeValueCache3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(groupLinkGroupAttributeValueCache3, variableMap, true, false, true)); + groupAttributeValueCache3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(groupAttributeValueCache3Value, gcGrouperSyncGroup.getGroupAttributeValueCache3())) { gcGrouperSyncGroup.setGroupAttributeValueCache3(groupAttributeValueCache3Value); @@ -382,26 +439,44 @@ public void updateEntityLink(Collection provisioningE } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String entityLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache0(); - GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache0Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache0Attribute(); - boolean hasEntityLinkEntityAttributeValueCache0 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache0) || entityLinkEntityAttributeValueCache0Attribute != null; - String entityLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache1(); - GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache1Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache1Attribute(); - boolean hasEntityLinkEntityAttributeValueCache1 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache1) || entityLinkEntityAttributeValueCache1Attribute != null; - - String entityLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache2(); - GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache2Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache2Attribute(); - boolean hasEntityLinkEntityAttributeValueCache2 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache2) || entityLinkEntityAttributeValueCache2Attribute != null; - - String entityLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityLinkEntityAttributeValueCache3(); - GrouperProvisioningConfigurationAttribute entityLinkEntityAttributeValueCache3Attribute = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().getEntityLinkEntityAttributeValueCache3Attribute(); - boolean hasEntityLinkEntityAttributeValueCache3 = !StringUtils.isBlank(entityLinkEntityAttributeValueCache3) || entityLinkEntityAttributeValueCache3Attribute != null; - - if (!hasEntityLinkEntityAttributeValueCache0 && !hasEntityLinkEntityAttributeValueCache1 && !hasEntityLinkEntityAttributeValueCache2 && !hasEntityLinkEntityAttributeValueCache3) { + if (!this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().isEntityAttributeValueCacheHas()) { return; } - + // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + boolean hasEntityLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache0Attribute = + grouperProvisioningConfigurationAttributeDbCache0 == null ? null : grouperProvisioningConfigurationAttributeDbCache0.retrieveAttribute(); + + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + boolean hasEntityLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache1Attribute = + grouperProvisioningConfigurationAttributeDbCache1 == null ? null : grouperProvisioningConfigurationAttributeDbCache1.retrieveAttribute(); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + boolean hasEntityLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache2Attribute = + grouperProvisioningConfigurationAttributeDbCache2 == null ? null : grouperProvisioningConfigurationAttributeDbCache2.retrieveAttribute(); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + boolean hasEntityLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache3Attribute = + grouperProvisioningConfigurationAttributeDbCache3 == null ? null : grouperProvisioningConfigurationAttributeDbCache3.retrieveAttribute(); + + if (!hasEntityLinkAttributeValueCache0 && !hasEntityLinkAttributeValueCache1 && !hasEntityLinkAttributeValueCache2 && !hasEntityLinkAttributeValueCache3) { + return; + } + int entitiesCannotFindLinkData = 0; int entitiesCannotFindSyncMember = 0; @@ -432,12 +507,12 @@ public void updateEntityLink(Collection provisioningE Map variableMap = new HashMap(); variableMap.put("targetEntity", targetEntity); - if (hasEntityLinkEntityAttributeValueCache0) { + if (hasEntityLinkAttributeValueCache0) { String entityFromId2Value = null; - if (entityLinkEntityAttributeValueCache0Attribute != null) { - entityFromId2Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache0Attribute); + if (entityLinkGroupAttributeValueCache0Attribute != null) { + entityFromId2Value = targetEntity.retrieveAttributeValueString(entityLinkGroupAttributeValueCache0Attribute); } else { - entityFromId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache0, variableMap, true, false, true)); + entityFromId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(entityFromId2Value, gcGrouperSyncEntity.getEntityAttributeValueCache0())) { gcGrouperSyncEntity.setEntityAttributeValueCache0(entityFromId2Value); @@ -445,12 +520,12 @@ public void updateEntityLink(Collection provisioningE } } - if (hasEntityLinkEntityAttributeValueCache1) { + if (hasEntityLinkAttributeValueCache1) { String entityFromId3Value = null; - if (entityLinkEntityAttributeValueCache1Attribute != null) { - entityFromId3Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache1Attribute); + if (entityLinkGroupAttributeValueCache1Attribute != null) { + entityFromId3Value = targetEntity.retrieveAttributeValueString(entityLinkGroupAttributeValueCache1Attribute); } else { - entityFromId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache1, variableMap, true, false, true)); + entityFromId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(entityFromId3Value, gcGrouperSyncEntity.getEntityAttributeValueCache1())) { gcGrouperSyncEntity.setEntityAttributeValueCache1(entityFromId3Value); @@ -458,12 +533,12 @@ public void updateEntityLink(Collection provisioningE } } - if (hasEntityLinkEntityAttributeValueCache2) { + if (hasEntityLinkAttributeValueCache2) { String entityToId2Value = null; - if (entityLinkEntityAttributeValueCache2Attribute != null) { - entityToId2Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache2Attribute); + if (entityLinkGroupAttributeValueCache2Attribute != null) { + entityToId2Value = targetEntity.retrieveAttributeValueString(entityLinkGroupAttributeValueCache2Attribute); } else { - entityToId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache2, variableMap, true, false, true)); + entityToId2Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(entityToId2Value, gcGrouperSyncEntity.getEntityAttributeValueCache2())) { gcGrouperSyncEntity.setEntityAttributeValueCache2(entityToId2Value); @@ -471,12 +546,12 @@ public void updateEntityLink(Collection provisioningE } } - if (hasEntityLinkEntityAttributeValueCache3) { + if (hasEntityLinkAttributeValueCache3) { String entityToId3Value = null; - if (entityLinkEntityAttributeValueCache3Attribute != null) { - entityToId3Value = targetEntity.retrieveAttributeValueString(entityLinkEntityAttributeValueCache3Attribute); + if (entityLinkGroupAttributeValueCache3Attribute != null) { + entityToId3Value = targetEntity.retrieveAttributeValueString(entityLinkGroupAttributeValueCache3Attribute); } else { - entityToId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(entityLinkEntityAttributeValueCache3, variableMap, true, false, true)); + entityToId3Value = StringUtils.trimToNull(GrouperUtil.substituteExpressionLanguage(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript(), variableMap, true, false, true)); } if (!StringUtils.equals(entityToId3Value, gcGrouperSyncEntity.getEntityAttributeValueCache3())) { gcGrouperSyncEntity.setEntityAttributeValueCache3(entityToId3Value); @@ -542,17 +617,29 @@ public boolean subjectLinkMissing(GcGrouperSyncMember gcGrouperSyncMember) { } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - String subjectLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache0(); - boolean hasSubjectLinkEntityAttributeValueCache0 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache0); - - String subjectLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache1(); - boolean hasSubjectLinkEntityAttributeValueCache1 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache1); - - String subjectLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache2(); - boolean hasSubjectLinkEntityAttributeValueCache2 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache2); - - String subjectLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getSubjectLinkEntityAttributeValueCache3(); - boolean hasSubjectLinkEntityAttributeValueCache3 = !StringUtils.isBlank(subjectLinkEntityAttributeValueCache3); + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + boolean hasSubjectLinkEntityAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + boolean hasSubjectLinkEntityAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + boolean hasSubjectLinkEntityAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + boolean hasSubjectLinkEntityAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript + && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript()); boolean needsRefresh = false; needsRefresh = needsRefresh || (hasSubjectLinkEntityAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncMember.getEntityAttributeValueCache0())); @@ -580,14 +667,27 @@ public List retrieveIncrementalNonRecalcTargetEntitiesThatNe if (!GrouperUtil.booleanValue(this.getGrouperProvisioner().retrieveGrouperProvisioningBehavior().isHasTargetEntityLink(), false)) { return grouperTargetEntities; } + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + boolean hasEntityLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; - // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasEntityLinkEntityAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache0(); - boolean hasEntityLinkEntityAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache1(); - boolean hasEntityLinkEntityAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache2(); - boolean hasEntityLinkEntityAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasEntityLinkEntityAttributeValueCache3(); + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + boolean hasEntityLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; - if (!hasEntityLinkEntityAttributeValueCache0 && !hasEntityLinkEntityAttributeValueCache1 && !hasEntityLinkEntityAttributeValueCache2 && !hasEntityLinkEntityAttributeValueCache3) { + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + boolean hasEntityLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + boolean hasEntityLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + if (!hasEntityLinkAttributeValueCache0 && !hasEntityLinkAttributeValueCache1 && !hasEntityLinkAttributeValueCache2 && !hasEntityLinkAttributeValueCache3) { return grouperTargetEntities; } @@ -612,19 +712,19 @@ public List retrieveIncrementalNonRecalcTargetEntitiesThatNe continue; } - if (hasEntityLinkEntityAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache0())) { + if (hasEntityLinkAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache0())) { hasChange = true; } - if (hasEntityLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache1())) { + if (hasEntityLinkAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache1())) { hasChange = true; } - if (hasEntityLinkEntityAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache2())) { + if (hasEntityLinkAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache2())) { hasChange = true; } - if (hasEntityLinkEntityAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache3())) { + if (hasEntityLinkAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncEntity.getEntityAttributeValueCache3())) { hasChange = true; } if (hasChange) { @@ -653,13 +753,27 @@ public List retrieveIncrementalNonRecalcTargetGroupsThatNeedL return grouperTargetGroups; } - // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object - boolean hasGroupLinkGroupAttributeValueCache0 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache0(); - boolean hasGroupLinkGroupAttributeValueCache1 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache1(); - boolean hasGroupLinkGroupAttributeValueCache2 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache2(); - boolean hasGroupLinkGroupAttributeValueCache3 = this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isHasGroupLinkGroupAttributeValueCache3(); - - if (!hasGroupLinkGroupAttributeValueCache0 && !hasGroupLinkGroupAttributeValueCache1 && !hasGroupLinkGroupAttributeValueCache2 && !hasGroupLinkGroupAttributeValueCache3) { + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + boolean hasGroupLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null + && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + boolean hasGroupLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null + && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + boolean hasGroupLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null + && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + boolean hasGroupLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null + && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; + + if (!hasGroupLinkAttributeValueCache0 && !hasGroupLinkAttributeValueCache1 && !hasGroupLinkAttributeValueCache2 && !hasGroupLinkAttributeValueCache3) { return grouperTargetGroups; } @@ -684,19 +798,19 @@ public List retrieveIncrementalNonRecalcTargetGroupsThatNeedL continue; } - if (hasGroupLinkGroupAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache0())) { + if (hasGroupLinkAttributeValueCache0 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache0())) { hasChange = true; } - if (hasGroupLinkGroupAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache1())) { + if (hasGroupLinkAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache1())) { hasChange = true; } - if (hasGroupLinkGroupAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache2())) { + if (hasGroupLinkAttributeValueCache2 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache2())) { hasChange = true; } - if (hasGroupLinkGroupAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache3())) { + if (hasGroupLinkAttributeValueCache1 && StringUtils.isBlank(gcGrouperSyncGroup.getGroupAttributeValueCache3())) { hasChange = true; } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java b/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java index 4713b6eee079..326088ed9207 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java @@ -9092,13 +9092,13 @@ public synchronized static Properties propertiesFromResourceName(String resource * @param generic type * * @param string - * @param exceptionOnNotFound true if exception should be thrown on not found + * @param exceptionOnBlank true if exception should be thrown on not found * @return the enum or null or exception if not found * @throws RuntimeException if there is a problem */ public static > E enumValueOfIgnoreCase(Class theEnumClass, String string, - boolean exceptionOnNotFound) throws RuntimeException { - return enumValueOfIgnoreCase(theEnumClass, string, exceptionOnNotFound, true); + boolean exceptionOnBlank) throws RuntimeException { + return enumValueOfIgnoreCase(theEnumClass, string, exceptionOnBlank, true); } @@ -9108,15 +9108,15 @@ public static > E enumValueOfIgnoreCase(Class theEnumClass, * @param generic type * * @param string - * @param exceptionOnNotFound true if exception should be thrown on not found + * @param exceptionOnBlank true if exception should be thrown on not found * @param exceptionIfInvalid if there is a string, but it is invalid, if should throw exception * @return the enum or null or exception if not found * @throws RuntimeException if there is a problem */ public static > E enumValueOfIgnoreCase(Class theEnumClass, String string, - boolean exceptionOnNotFound, boolean exceptionIfInvalid) throws RuntimeException { + boolean exceptionOnBlank, boolean exceptionIfInvalid) throws RuntimeException { - if (!exceptionOnNotFound && isBlank(string)) { + if (!exceptionOnBlank && isBlank(string)) { return null; } for (E e : theEnumClass.getEnumConstants()) { From c77da18fdb36d28bbd3794282f0a028b8309ca15 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 1 May 2022 19:37:09 -0400 Subject: [PATCH 034/125] GRP-4017: provisioning sql specific column labels and descriptions --- .../grouper.textNg.en.us.base.properties | 31 ++++++++++++++----- .../GrouperConfigurationModuleBase.java | 17 +++++++--- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 8c8b0a8f77d2..4facd72cc7db 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13281,13 +13281,13 @@ config.GenericConfiguration.subSection.entity2.description = Entity configuratio config.GenericConfiguration.subSection.entity2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those config.GenericConfiguration.subSection.targetGroupAttribute.i.title = Target __i+1__ -config.GenericConfiguration.subSection.targetGroupAttribute.i.description = Configuration for the group field / attribute +config.GenericConfiguration.subSection.targetGroupAttribute.i.description = Configuration for the group attribute config.GenericConfiguration.subSection.targetEntityAttribute.i.title = Target __i+1__ -config.GenericConfiguration.subSection.targetEntityAttribute.i.description = Configuration for the entity field / attribute +config.GenericConfiguration.subSection.targetEntityAttribute.i.description = Configuration for the entity attribute config.GenericConfiguration.subSection.targetMembershipAttribute.i.title = Target __i+1__ -config.GenericConfiguration.subSection.targetMembershipAttribute.i.description = Configuration for the membership field / attribute +config.GenericConfiguration.subSection.targetMembershipAttribute.i.description = Configuration for the membership attribute config.GenericConfiguration.attribute.class.label = Class config.GenericConfiguration.attribute.quartzCron.label = Quartz cron @@ -13342,7 +13342,7 @@ config.GenericConfiguration.attribute.deleteGroupsIfGrouperDeleted.description = config.GenericConfiguration.attribute.deleteGroupsIfGrouperCreated.label = Delete groups if created by Grouper config.GenericConfiguration.attribute.deleteGroupsIfGrouperCreated.description = Delete groups if Grouper provisioned the group at some point in the past and the group was removed in Grouper. This is the default behavior. config.GenericConfiguration.attribute.updateGroups.label = Update groups -config.GenericConfiguration.attribute.updateGroups.description = If group fields and attributes which differ from the target should cause the target data to be updated. This does not include the membership attribute if the membership provisioning type is groupAttributes. +config.GenericConfiguration.attribute.updateGroups.description = If group attributes which differ from the target should cause the target data to be updated. This does not include the membership attribute if the membership provisioning type is groupAttributes. config.GenericConfiguration.attribute.groupRequireMembers.label = Require members config.GenericConfiguration.attribute.groupRequireMembers.description = If the group has no members, then consider it not provisionable (e.g. it is eligible to be removed from target) @@ -13378,7 +13378,7 @@ config.GenericConfiguration.attribute.readOnly.label = Read only config.GenericConfiguration.attribute.readOnly.description = Run this provisioner in read only mode meaning no changes will be made to the target. The "log all objects verbose" will show what the provisioner would have done. config.GenericConfiguration.attribute.numberOfGroupAttributes.label = Number of group attributes config.GenericConfiguration.attribute.numberOfMembershipAttributes.label = Number of membership attributes -config.GenericConfiguration.attribute.numberOfGroupAttributes.description = In the object that represents a target group, this is the number of fields and attributes +config.GenericConfiguration.attribute.numberOfGroupAttributes.description = In the object that represents a target group, this is the number of attributes config.GenericConfiguration.attribute.numberOfMembershipAttributes.description = In the object that represents a target membership, this is the number of attributes config.GenericConfiguration.attribute.recalculateAllOperations.label = Recalculate all real time events config.GenericConfiguration.attribute.provisioningType.label = Provisioning type @@ -13963,6 +13963,7 @@ config.GenericConfiguration.attribute.entityAttributeValueCache3translationScrip config.GenericConfiguration.attribute.targetGroupAttribute.i.name.label = __i+1__ - name config.GenericConfiguration.attribute.targetGroupAttribute.i.name.description = Attribute name is the key in the key/value pairs for this group +config.SqlProvisionerConfiguration.attribute.targetGroupAttribute.i.name.description = Column name for this column, or attribute name if the attribute is in a separate attributes table config.GenericConfiguration.attribute.option.targetGroupAttribute.i.groupAttributePrefix = Group config.GenericConfiguration.attribute.option.targetMembershipAttribute.i.membershipAttributePrefix = Membership config.GenericConfiguration.attribute.option.targetEntityAttribute.i.entityAttributePrefix = Entity @@ -14075,7 +14076,7 @@ config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromG provisioning.helper.variable.grouperProvisioningGroup = grouperProvisioningGroup (ProvisioningGroup.java): this is the Grouper representation of the group. Fields include: id, idIndex, name, displayName. Attributes include: description. Here is an example of a regex replace all non alphanumeric ids: ${grouperProvisioningGroup.name.replaceAll('[^a-zA-Z0-9]', '_')} provisioning.helper.variable.gcGrouperSyncGroup = gcGrouperSyncGroup (GcGrouperSyncGroup.java): this is the "sync" group object. Fields include: groupAttributeValueCache0, groupAttributeValueCache1, groupAttributeValueCache2, groupAttributeValueCache3 provisioning.helper.variable.provisioningGroupWrapper = provisioningGroupWrapper (ProvisioningGroupWrapper.java): holds references to all group data. Fields include: create, delete, recalc, gcGrouperSyncGroup, grouperProvisioningGroup, grouperTargetGroup, targetProvisioningGroup, targetNativeGroup -provisioning.helper.variable.grouperTargetGroup = grouperTargetGroup (ProvisioningGroup.java): generally this is not needed since it is being built by the translation process. Fields and attributes depend on the provisioner. +provisioning.helper.variable.grouperTargetGroup = grouperTargetGroup (ProvisioningGroup.java): generally this is not needed since it is being built by the translation process. Attributes depend on the provisioner. config.GenericConfiguration.attribute.targetGroupAttribute.i.valueType.label = __i+1__ - value type config.GenericConfiguration.attribute.targetGroupAttribute.i.valueType.description = Generally this is going to be a string (text). int means 4 byte signed integer (-2 billion to 2 billion). long is for large integers @@ -14139,6 +14140,10 @@ config.SqlProvisionerConfiguration.attribute.targetGroupAttribute.i.storageType. config.SqlProvisionerConfiguration.attribute.targetEntityAttribute.i.storageType.label = __i+1__ - Storage type config.SqlProvisionerConfiguration.attribute.targetEntityAttribute.i.storageType.description = Storage type +config.SqlProvisionerConfiguration.attribute.option.targetGroupAttribute.i.attributePrefix = col / attr +config.SqlProvisionerConfiguration.attribute.option.targetEntityAttribute.i.attributePrefix = col / attr + + config.GenericConfiguration.attribute.operateOnGrouperEntities.label = Operate on entities config.GenericConfiguration.attribute.operateOnGrouperEntities.description = If the provisioner involves entity objects. This might not be true if you are provisioning memberships or groupAttributes without a target entity link. @@ -14165,7 +14170,7 @@ config.GenericConfiguration.attribute.selectEntities.description = If entities s config.GenericConfiguration.attribute.insertEntities.label = Insert entities config.GenericConfiguration.attribute.insertEntities.description = If provisionable entities in Grouper which do not exist in the target should be created in the target. This will not be true if all the needed entities exist in the target or if the target manages entities it another process. config.GenericConfiguration.attribute.updateEntities.label = Update entities -config.GenericConfiguration.attribute.updateEntities.description = If entity fields and attributes which differ from the target should cause the target data to be updated. This does not include the membership attribute if the membership provisioning type is entityAttributes. +config.GenericConfiguration.attribute.updateEntities.description = If entity attributes which differ from the target should cause the target data to be updated. This does not include the membership attribute if the membership provisioning type is entityAttributes. config.GenericConfiguration.attribute.deleteEntities.label = Delete entities config.GenericConfiguration.attribute.deleteEntities.description = If you want to delete entities in the target (default yes delete if Grouper created and then deleted the entity). Note, there are a few types of "deletes" you can choose from if you select "true", you must pick which delete option below. config.GenericConfiguration.attribute.deleteEntitiesIfNotExistInGrouper.label = Delete entities if not exist in Grouper @@ -14184,15 +14189,18 @@ config.GenericConfiguration.attribute.hasTargetEntityLink.label = Has target ent config.GenericConfiguration.attribute.hasTargetEntityLink.description = "Entity link" is when memberships refer to some data that does not exist in Grouper or the Subject API and needs to be retrieved from the target Entity object. This data is cached in the "member sync" database table. Here are some examples:
    1. Provisioning membership objects where the entity reference is a target DN or UUID.
    2. Provisioning groupAttributes where the entity value is a target DN or UUID
    config.GenericConfiguration.attribute.numberOfEntityAttributes.label = Number of entity attributes +config.GenericConfiguration.attribute.numberOfEntityAttributes.description = In the object that represents a target entity, this is the number of attributes config.GenericConfiguration.attribute.targetEntityAttribute.i.name.label = __i+1__ - name config.GenericConfiguration.attribute.targetEntityAttribute.i.name.description = Attribute name is the key in the key/value pairs for this entity +config.SqlProvisionerConfiguration.attribute.targetEntityAttribute.i.name.description = Column name for this column, or attribute name if the attribute is in a separate attributes table + config.GenericConfiguration.attribute.option.targetEntityAttribute.i.attributePrefix = attr provisioning.helper.variable.grouperProvisioningEntity = grouperProvisioningEntity (ProvisioningEntity.java): this is the Grouper representation of the entity. Fields include: email (needs configuration), id, loginId (needs configuration), name, subjectId. Attributes include: subjectSourceId, description, subjectIdentifier0 provisioning.helper.variable.gcGrouperSyncMember = gcGrouperSyncMember (GcGrouperSyncMember.java): this is the "sync" entity object. Fields include: entityAttributeValueCache0, entityAttributeValueCache1, entityAttributeValueCache2, entityAttributeValueCache3 provisioning.helper.variable.provisioningEntityWrapper = provisioningEntityWrapper (ProvisioningGroupWrapper.java): holds references to all entity data. Fields include: create, delete, recalc, gcGrouperSyncMember, grouperProvisioningEntity, grouperTargetEntity, targetProvisioningEntity, targetNativeEntity -provisioning.helper.variable.grouperTargetEntity = grouperTargetEntity (ProvisioningEntity.java): generally this is not needed since it is being built by the translation process. Fields and attributes depend on the provisioner. +provisioning.helper.variable.grouperTargetEntity = grouperTargetEntity (ProvisioningEntity.java): generally this is not needed since it is being built by the translation process. Attributes depend on the provisioner. config.GenericConfiguration.attribute.targetEntityAttribute.i.valueType.label = __i+1__ - value type config.GenericConfiguration.attribute.targetEntityAttribute.i.valueType.description = Generally this is going to be a string (text). int means 4 byte signed integer (-2 billion to 2 billion). long is for large integers @@ -14368,6 +14376,13 @@ config.SqlProvisionerConfiguration.attribute.userPrimaryKey.label = Entity prima config.SqlProvisionerConfiguration.attribute.userSearchQuery.label = Entity search query config.SqlProvisionerConfiguration.attribute.insertEntities.label = Insert entities +config.SqlProvisionerConfiguration.attribute.numberOfGroupAttributes.label = Number of group columns or attributes +config.SqlProvisionerConfiguration.attribute.numberOfGroupAttributes.description = In the object that represents a target group, this is the number of columns in the group table (and if you have a group attributes table then also the attributes in that table). +config.SqlProvisionerConfiguration.attribute.numberOfMembershipAttributes.label = Number of membership columns +config.SqlProvisionerConfiguration.attribute.numberOfMembershipAttributes.description = In the object that represents a target membership, this is the number of attributes +config.SqlProvisionerConfiguration.attribute.numberOfEntityAttributes.label = Number of entity columns or attributes +config.SqlProvisionerConfiguration.attribute.numberOfEntityAttributes.description = In the object that represents a target entity, this is the number of columns in the entity table (and if you have an entity attributes table then also the attributes in that table). + config.SqlProvisionerConfiguration.attribute.membershipPrimaryKey.label = Membership primary key config.SqlProvisionerConfiguration.attribute.membershipPrimaryKey.description = Leave blank and the primary key will be the tuple of the group and entity foreign keys. Or select a column if it is a uuid or something. config.SqlProvisionerConfiguration.attribute.membershipGroupForeignKeyColumn.label = Membership group foreign key diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java index 3f87ecbef90a..3b1ee1e82862 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java @@ -26,6 +26,7 @@ import org.apache.commons.logging.Log; import edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig; +import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioner; import edu.internet2.middleware.grouper.cfg.dbConfig.CheckboxValueDriver; import edu.internet2.middleware.grouper.cfg.dbConfig.ConfigFileMetadata; import edu.internet2.middleware.grouper.cfg.dbConfig.ConfigFileName; @@ -1630,21 +1631,21 @@ public boolean isMultiple() { public String getCacheAttributePrefix() { if (this.cacheAttributePrefix == null) { - this.cacheAttributePrefix = GrouperTextContainer.textOrNull("config.GenericConfiguration.attribute.option.targetGroupAttribute.i.attributePrefix"); + this.cacheAttributePrefix = this.retrieveText("attribute.option.targetGroupAttribute.i.attributePrefix"); } return cacheAttributePrefix; } public String getCacheEntityAttributePrefix() { if (this.cacheEntityAttributePrefix == null) { - this.cacheEntityAttributePrefix = GrouperTextContainer.textOrNull("config.GenericConfiguration.attribute.option.targetEntityAttribute.i.entityAttributePrefix"); + this.cacheEntityAttributePrefix = this.retrieveText("attribute.option.targetEntityAttribute.i.entityAttributePrefix"); } return cacheEntityAttributePrefix; } public String getCacheMembershipAttributePrefix() { if (this.cacheMembershipAttributePrefix == null) { - this.cacheMembershipAttributePrefix = GrouperTextContainer.textOrNull("config.GenericConfiguration.attribute.option.targetMembershipAttribute.i.membershipAttributePrefix"); + this.cacheMembershipAttributePrefix = this.retrieveText("attribute.option.targetMembershipAttribute.i.membershipAttributePrefix"); } return cacheMembershipAttributePrefix; } @@ -1652,10 +1653,18 @@ public String getCacheMembershipAttributePrefix() { public String getCacheGroupAttributePrefix() { if (this.cacheGroupAttributePrefix == null) { - this.cacheGroupAttributePrefix = GrouperTextContainer.textOrNull("config.GenericConfiguration.attribute.option.targetGroupAttribute.i.groupAttributePrefix"); + this.cacheGroupAttributePrefix = this.retrieveText("attribute.option.targetGroupAttribute.i.groupAttributePrefix"); } return cacheGroupAttributePrefix; } + public String retrieveText(String suffix) { + String label = GrouperTextContainer.textOrNull("config." + this.getClass().getSimpleName() + "." + suffix); + + if (StringUtils.isBlank(label)) { + label = GrouperTextContainer.textOrNull("config.GenericConfiguration." + suffix); + } + return label; + } } From e3f6e3cd0da0f43b969f13e263417ac35bfd701b Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 1 May 2022 21:44:33 -0400 Subject: [PATCH 035/125] GRP-4018: provisioning config indent hide/show --- .../UiV2ProvisionerConfiguration.java | 2 +- .../grouper/ui/tags/ConfigFormElement.java | 27 +- .../grouperUi2/admin/adminDaemonJobAdd.jsp | 1 + .../grouperUi2/admin/adminDaemonJobEdit.jsp | 1 + .../editWsTrustedJwtConfigDetails.jsp | 1 + .../editWsTrustedOidcConfigDetails.jsp | 1 + .../wsTrustedJwtConfigAddHelper.jsp | 1 + .../wsTrustedOidcConfigAddHelper.jsp | 1 + .../customUi/customUiConfigAddHelper.jsp | 1 + .../customUi/editCustomUiConfigDetails.jsp | 1 + .../editExternalSystemConfigDetails.jsp | 1 + .../externalSystemConfigAddHelper.jsp | 1 + ...itGlobalAttributeResolverConfigDetails.jsp | 1 + ...globalAttributeResolverConfigAddHelper.jsp | 1 + .../grouperUi2/group/groupNewTemplate.jsp | 1 + .../editGshTemplateConfigDetails.jsp | 1 + .../gshTemplateConfigAddHelper.jsp | 1 + .../provisionerConfigAddHelper.jsp | 2 + .../provisionerConfigEdit.jsp | 1 + .../sqlSync/editSqlSyncConfigDetails.jsp | 1 + .../sqlSync/sqlSyncConfigAddHelper.jsp | 1 + .../grouperUi2/stem/stemNewTemplate.jsp | 2 + .../subjectSourceConfigAddHelper.jsp | 1 + .../subjectSource/subjectSourceEdit.jsp | 1 + grouper-ui/webapp/WEB-INF/tld/grouper-el.tld | 9 + grouper/conf/grouper-loader.base.properties | 288 +++++++++--------- .../cfg/dbConfig/ConfigItemMetadata.java | 29 ++ 27 files changed, 233 insertions(+), 146 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java index 6b02287ce069..21f34d156c2d 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java @@ -996,7 +996,7 @@ public void addProvisionerConfigurationSubmit(final HttpServletRequest request, String provisionerStartWithClass = request.getParameter("provisionerStartWithClass"); - if (StringUtils.isNotBlank(provisionerStartWithClass)) { + if (StringUtils.isNotBlank(provisionerStartWithClass) && !StringUtils.equals("empty", provisionerStartWithClass)) { Class startWithKlass = (Class) GrouperUtil.forName(provisionerStartWithClass); ProvisionerStartWithBase provisionerStartWith = (ProvisionerStartWithBase) GrouperUtil.newInstance(startWithKlass); provisionerStartWith.setConfigId(provisionerConfigId); diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/ui/tags/ConfigFormElement.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/ui/tags/ConfigFormElement.java index 89abc8a0c2d5..daae127002a0 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/ui/tags/ConfigFormElement.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/ui/tags/ConfigFormElement.java @@ -317,6 +317,27 @@ public void setAjaxCallback(String ajaxCallback) { this.ajaxCallback = ajaxCallback; } + /** + * number of levels to indent + */ + private Integer indent; + + /** + * number of levels to indent + * @return + */ + public Integer getIndent() { + return indent; + } + + /** + * number of levels to indent + * @param indent + */ + public void setIndent(Integer indent) { + this.indent = indent; + } + /** * html to render */ @@ -330,7 +351,11 @@ public void doTag() throws JspException, IOException { } field.append("
    "); - field.append(""); diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobAdd.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobAdd.jsp index f582c9d8eaac..0deae0d036da 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobAdd.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobAdd.jsp @@ -135,6 +135,7 @@ ajaxCallback="ajax('../app/UiV2Admin.addDaemon?daemonConfigId=${guiGrouperDaemonConfiguration.grouperDaemonConfiguration.configId}&daemonConfigType=${guiGrouperDaemonConfiguration.grouperDaemonConfiguration['class'].name}', {formIds: 'addDaemonFormId'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobEdit.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobEdit.jsp index d39b2a14ef07..fcb882e79f39 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobEdit.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/admin/adminDaemonJobEdit.jsp @@ -103,6 +103,7 @@ ajaxCallback="ajax('../app/UiV2Admin.editDaemon?daemonConfigId=${guiGrouperDaemonConfiguration.grouperDaemonConfiguration.configId}&daemonConfigType=${guiGrouperDaemonConfiguration.grouperDaemonConfiguration['class'].name}', {formIds: 'editDaemonFormId'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedJwtConfigDetails.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedJwtConfigDetails.jsp index 0e719672a25d..25986571b507 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedJwtConfigDetails.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedJwtConfigDetails.jsp @@ -72,6 +72,7 @@ ajaxCallback="ajax('../app/UiV2AuthenticationConfig.editWsTrustedJwtConfig?wsTrustedJwtConfigId=${grouperRequestContainer.authenticationContainer.guiWsTrustedJwtConfiguration.wsTrustedJwtConfiguration.configId}', {formIds: 'wsTrustedJwtConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedOidcConfigDetails.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedOidcConfigDetails.jsp index 1e8f39bdda09..c118ce750d7c 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedOidcConfigDetails.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/editWsTrustedOidcConfigDetails.jsp @@ -73,6 +73,7 @@ ajaxCallback="ajax('../app/UiV2OidcConfig.editOidcConfig?oidcConfigId=${grouperRequestContainer.oidcConfigContainer.guiOidcConfiguration.oidcConfiguration.configId}', {formIds: 'wsTrustedJwtConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedJwtConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedJwtConfigAddHelper.jsp index 1d5e5343d552..ad0b905c3a77 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedJwtConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedJwtConfigAddHelper.jsp @@ -75,6 +75,7 @@ ajaxCallback="ajax('../app/UiV2AuthenticationConfig.addWsTrustedJwt', {formIds: 'wsTrustedJwtConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedOidcConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedOidcConfigAddHelper.jsp index 1cc558bbefcf..73406981df5b 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedOidcConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/authentication/wsTrustedOidcConfigAddHelper.jsp @@ -75,6 +75,7 @@ ajaxCallback="ajax('../app/UiV2OidcConfig.addOidcConfig', {formIds: 'wsTrustedOidcConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/customUiConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/customUiConfigAddHelper.jsp index a644eb98df63..8fe2a6ee2d84 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/customUiConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/customUiConfigAddHelper.jsp @@ -75,6 +75,7 @@ ajaxCallback="ajax('../app/UiV2CustomUiConfig.addCustomUiConfig', {formIds: 'customUiConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/editCustomUiConfigDetails.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/editCustomUiConfigDetails.jsp index d604364ce5cc..26f05229e533 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/editCustomUiConfigDetails.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/customUi/editCustomUiConfigDetails.jsp @@ -72,6 +72,7 @@ ajaxCallback="ajax('../app/UiV2CustomUiConfig.editCustomUiConfig?customUiConfigId=${grouperRequestContainer.customUiContainer.guiCustomUiConfiguration.customUiConfiguration.configId}', {formIds: 'customUiConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/editExternalSystemConfigDetails.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/editExternalSystemConfigDetails.jsp index add7a44b2752..61e60937e6e9 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/editExternalSystemConfigDetails.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/editExternalSystemConfigDetails.jsp @@ -76,6 +76,7 @@ ajaxCallback="ajax('../app/UiV2ExternalSystem.editExternalSystemConfigDetails?externalSystemConfigId=${grouperRequestContainer.externalSystemContainer.guiGrouperExternalSystem.grouperExternalSystem.configId}&externalSystemType=${grouperRequestContainer.externalSystemContainer.guiGrouperExternalSystem.grouperExternalSystem['class'].name}', {formIds: 'externalSystemConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/externalSystemConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/externalSystemConfigAddHelper.jsp index 3a5858a2df66..99480dd49dd2 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/externalSystemConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/externalSystems/externalSystemConfigAddHelper.jsp @@ -65,6 +65,7 @@ ajaxCallback="ajax('../app/UiV2ExternalSystem.addExternalSystem?externalSystemConfigId=${guiGrouperExternalSystem.grouperExternalSystem.configId}&externalSystemType=${guiGrouperExternalSystem.grouperExternalSystem['class'].name}', {formIds: 'externalSystemConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/editGlobalAttributeResolverConfigDetails.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/editGlobalAttributeResolverConfigDetails.jsp index 589913464c13..ff0b113c539e 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/editGlobalAttributeResolverConfigDetails.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/editGlobalAttributeResolverConfigDetails.jsp @@ -72,6 +72,7 @@ ajaxCallback="ajax('../app/UiV2GlobalAttributeResolverConfig.editGlobalAttributeResolverConfig?globalAttributeResolverConfigId=${grouperRequestContainer.globalAttributeResolverConfigContainer.guiGlobalAttributeResolverConfiguration.globalAttributeResolverConfiguration.configId}', {formIds: 'globalAttributeResolverConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/globalAttributeResolverConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/globalAttributeResolverConfigAddHelper.jsp index d0f8c2253d46..2c8a1fa09860 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/globalAttributeResolverConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/globalAttributeResolver/globalAttributeResolverConfigAddHelper.jsp @@ -75,6 +75,7 @@ ajaxCallback="ajax('../app/UiV2GlobalAttributeResolverConfig.addGlobalAttributeResolverConfig', {formIds: 'globalAttributeResolverConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupNewTemplate.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupNewTemplate.jsp index 36c8b830edd6..9c4d0313c197 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupNewTemplate.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupNewTemplate.jsp @@ -52,6 +52,7 @@ hasExpressionLanguage="false" ajaxCallback="ajax('../app/UiV2Template.newTemplate?templateType=${grouperRequestContainer.groupStemTemplateContainer.templateType}', {formIds: 'newGroupTemplateFormId'}); return false;" valuesAndLabels="${guiGshTemplateInputConfig.gshTemplateInputConfig.dropdownKeysAndLabels}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/editGshTemplateConfigDetails.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/editGshTemplateConfigDetails.jsp index 330ce6c92a99..276e9ef1f0c5 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/editGshTemplateConfigDetails.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/editGshTemplateConfigDetails.jsp @@ -72,6 +72,7 @@ ajaxCallback="ajax('../app/UiV2GshTemplateConfig.editGshTemplate?gshTemplateConfigId=${grouperRequestContainer.gshTemplateContainer.guiGshTemplateConfiguration.gshTemplateConfiguration.configId}', {formIds: 'gshTemplateConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/gshTemplateConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/gshTemplateConfigAddHelper.jsp index 4c8c13b00f88..eba213f10a5f 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/gshTemplateConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/gshTemplate/gshTemplateConfigAddHelper.jsp @@ -75,6 +75,7 @@ ajaxCallback="ajax('../app/UiV2GshTemplateConfig.addGshTemplate', {formIds: 'gshTemplateConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp index b84cbd8b0763..5a9d5bb77f9b 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp @@ -112,6 +112,7 @@ ajaxCallback="ajax('../app/UiV2ProvisionerConfiguration.addProvisionerConfiguration?focusOnElementName=config_${attribute.configSuffix}&provisionerConfigId=${guiProvisionerConfiguration.provisionerConfiguration.configId}&provisionerConfigType=${guiProvisionerConfiguration.provisionerConfiguration['class'].name}', {formIds: 'provisionerConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> @@ -164,6 +165,7 @@ ajaxCallback="ajax('../app/UiV2ProvisionerConfiguration.addProvisionerConfiguration?focusOnElementName=config_${attribute.configSuffix}&provisionerConfigId=${guiProvisionerConfiguration.provisionerConfiguration.configId}&provisionerConfigType=${guiProvisionerConfiguration.provisionerConfiguration['class'].name}', {formIds: 'provisionerConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigEdit.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigEdit.jsp index ea9bbd462b26..216eb63ed238 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigEdit.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigEdit.jsp @@ -93,6 +93,7 @@ ajaxCallback="ajax('../app/UiV2ProvisionerConfiguration.editProvisionerConfiguration?focusOnElementName=config_${attribute.configSuffix}&provisionerConfigId=${grouperRequestContainer.provisionerConfigurationContainer.guiProvisionerConfiguration.provisionerConfiguration.configId}&provisionerConfigType=${grouperRequestContainer.provisionerConfigurationContainer.guiProvisionerConfiguration.provisionerConfiguration['class'].name}', {formIds: 'provisionerConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/editSqlSyncConfigDetails.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/editSqlSyncConfigDetails.jsp index bf106ac11009..ed83e9a76c7b 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/editSqlSyncConfigDetails.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/editSqlSyncConfigDetails.jsp @@ -64,6 +64,7 @@ ajaxCallback="ajax('../app/UiV2SqlSyncConfiguration.editSqlSyncConfig?sqlSyncConfigId=${grouperRequestContainer.sqlSyncConfigurationContainer.guiSqlSyncConfiguration.sqlSyncConfiguration.configId}', {formIds: 'sqlSyncConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/sqlSyncConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/sqlSyncConfigAddHelper.jsp index d8e8fbe79036..8102284cf8eb 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/sqlSyncConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/sqlSync/sqlSyncConfigAddHelper.jsp @@ -75,6 +75,7 @@ ajaxCallback="ajax('../app/UiV2SqlSyncConfiguration.addSqlSyncConfiguration', {formIds: 'sqlSyncConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemNewTemplate.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemNewTemplate.jsp index a4bef56d6f58..6ecbd5d35aa7 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemNewTemplate.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemNewTemplate.jsp @@ -122,6 +122,8 @@ hasExpressionLanguage="false" ajaxCallback="ajax('../app/UiV2Template.newTemplate?templateType=${grouperRequestContainer.groupStemTemplateContainer.templateType}', {formIds: 'newStemTemplateFormId'}); return false;" valuesAndLabels="${guiGshTemplateInputConfig.gshTemplateInputConfig.dropdownKeysAndLabels}" + indent="${attribute.configItemMetadata.indent}" + /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceConfigAddHelper.jsp index b123f92e717a..2e2dba5a4287 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceConfigAddHelper.jsp @@ -86,6 +86,7 @@ ajaxCallback="ajax('../app/UiV2SubjectSource.addSubjectSource?focusOnElementName=config_${attribute.configSuffix}&sourceConfigId=${guiSubjectSourceConfiguration.subjectSourceConfiguration.configId}&sourceConfigType=${guiSubjectSourceConfiguration.subjectSourceConfiguration['class'].name}', {formIds: 'sourceConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceEdit.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceEdit.jsp index 175d88cd18cd..3b95ee17b1cc 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceEdit.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/subjectSource/subjectSourceEdit.jsp @@ -80,6 +80,7 @@ ajaxCallback="ajax('../app/UiV2SubjectSource.editSubjectSource?focusOnElementName=config_${attribute.configSuffix}&subjectSourceId=${grouperRequestContainer.subjectSourceContainer.subjectSourceId}', {formIds: 'sourceConfigDetails'}); return false;" valuesAndLabels="${attribute.dropdownValuesAndLabels }" checkboxAttributes="${attribute.checkboxAttributes}" + indent="${attribute.configItemMetadata.indent}" /> diff --git a/grouper-ui/webapp/WEB-INF/tld/grouper-el.tld b/grouper-ui/webapp/WEB-INF/tld/grouper-el.tld index 61afa355d2e9..1d4f63a676bd 100644 --- a/grouper-ui/webapp/WEB-INF/tld/grouper-el.tld +++ b/grouper-ui/webapp/WEB-INF/tld/grouper-el.tld @@ -223,6 +223,15 @@ true + + + Number of levels to indent + + indent + false + true + + Is the field read only diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 411f57430365..62d85d341366 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2283,55 +2283,55 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityResolver.resolveAttributesWithSQL = # Use global SQL resolver -# {valueType: "boolean", order: 406, defaultValue: "false", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL}"} +# {valueType: "boolean", order: 406, indent: 1, defaultValue: "false", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL}"} # provisioner.genericProvisioner.entityResolver.useGlobalSQLResolver = # Global SQL resolver -# {valueType: "string", order: 408, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.attr.resolver.SqlGlobalAttributeResolverOptionValueDriver"} +# {valueType: "string", order: 408, indent: 2, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.attr.resolver.SqlGlobalAttributeResolverOptionValueDriver"} # provisioner.genericProvisioner.entityResolver.globalSQLResolver = # SQL config id -# {valueType: "string", order: 410, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.loader.db.DatabaseGrouperExternalSystem"} +# {valueType: "string", order: 410, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.loader.db.DatabaseGrouperExternalSystem"} # provisioner.genericProvisioner.entityResolver.sqlConfigId = # Table or view name -# {valueType: "string", order: 412, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} +# {valueType: "string", order: 412, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} # provisioner.genericProvisioner.entityResolver.tableOrViewName = # Comma separated column names from the entity attributes table that need to be added as attributes in the target system -# {valueType: "string", order: 413, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} +# {valueType: "string", order: 413, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} # provisioner.genericProvisioner.entityResolver.columnNames = # Subject source id column -# {valueType: "string", order: 414, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.subject.provider.SourceManagerOptionValueDriver"} +# {valueType: "string", order: 414, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.subject.provider.SourceManagerOptionValueDriver"} # provisioner.genericProvisioner.entityResolver.subjectSourceIdColumn = # Subject search / matching column -# {valueType: "string", order: 416, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} +# {valueType: "string", order: 416, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} # provisioner.genericProvisioner.entityResolver.subjectSearchMatchingColumn = # SQL mapping type -# {valueType: "string", order: 418, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValues: ["entityAttribute", "translation"]} +# {valueType: "string", order: 418, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValues: ["entityAttribute", "translation"]} # provisioner.genericProvisioner.entityResolver.sqlMappingType = # SQL mapping entity attribute -# {valueType: "string", order: 420, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver && sqlMappingType == 'entityAttribute' }", formElement: "dropdown", optionValues: ['subjectId', 'subjectIdentifer0']} +# {valueType: "string", order: 420, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver && sqlMappingType == 'entityAttribute' }", formElement: "dropdown", optionValues: ['subjectId', 'subjectIdentifer0']} # provisioner.genericProvisioner.entityResolver.sqlMappingEntityAttribute = # SQL mapping expression -# {valueType: "string", order: 422, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver && sqlMappingType == 'translation' }"} +# {valueType: "string", order: 422, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver && sqlMappingType == 'translation' }"} # provisioner.genericProvisioner.entityResolver.sqlMappingExpression = # Last updated column -# {valueType: "string", order: 424, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} +# {valueType: "string", order: 424, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}"} # provisioner.genericProvisioner.entityResolver.lastUpdatedColumn = # Last updated type -# {valueType: "string", order: 426, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValues: ["timestamp", "millisSince1970"]} +# {valueType: "string", order: 426, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL && !entityResolver.useGlobalSQLResolver}", formElement: "dropdown", optionValues: ["timestamp", "millisSince1970"]} # provisioner.genericProvisioner.entityResolver.lastUpdatedType = # Select all SQL on full -# {valueType: "boolean", order: 428, defaultValue: "true", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL}"} +# {valueType: "boolean", order: 428, indent: 1, defaultValue: "true", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithSQL}"} # provisioner.genericProvisioner.entityResolver.selectAllSQLOnFull = # Resolve attributes with LDAP @@ -2339,67 +2339,67 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityResolver.resolveAttributesWithLDAP = # Use global LDAP resolver -# {valueType: "boolean", order: 432, defaultValue: "false", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP}"} +# {valueType: "boolean", order: 432, indent: 1, defaultValue: "false", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP}"} # provisioner.genericProvisioner.entityResolver.useGlobalLDAPResolver = # Global LDAP resolver -# {valueType: "string", order: 434, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.attr.resolver.LdapGlobalAttributeResolverOptionValueDriver"} +# {valueType: "string", order: 434, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.attr.resolver.LdapGlobalAttributeResolverOptionValueDriver"} # provisioner.genericProvisioner.entityResolver.globalLDAPResolver = # LDAP config id -# {valueType: "string", order: 436, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.externalSystem.LdapGrouperExternalSystem"} +# {valueType: "string", order: 436, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.externalSystem.LdapGrouperExternalSystem"} # provisioner.genericProvisioner.entityResolver.ldapConfigId = # Base DN -# {valueType: "string", order: 438, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} +# {valueType: "string", order: 438, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} # provisioner.genericProvisioner.entityResolver.baseDN = # Subject source id of subjects -# {valueType: "string", order: 439, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.subject.provider.SourceManagerOptionValueDriver"} +# {valueType: "string", order: 439, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.subject.provider.SourceManagerOptionValueDriver"} # provisioner.genericProvisioner.entityResolver.subjectSourceId = # Search scope -# {valueType: "string", order: 440, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValues: ['ONELEVEL_SCOPE', ' SUBTREE_SCOPE']} +# {valueType: "string", order: 440, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValues: ['ONELEVEL_SCOPE', ' SUBTREE_SCOPE']} # provisioner.genericProvisioner.entityResolver.searchScope = # Filter part -# {valueType: "string", order: 442, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} +# {valueType: "string", order: 442, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} # provisioner.genericProvisioner.entityResolver.filterPart = # Attributes -# {valueType: "string", order: 444, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} +# {valueType: "string", order: 444, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} # provisioner.genericProvisioner.entityResolver.attributes = # Attributes -# {valueType: "string", order: 444, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} +# {valueType: "string", order: 444, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} # provisioner.genericProvisioner.entityResolverr.multiValuedLdapAttributes = # LDAP matching / search attribute -# {valueType: "string", order: 446, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} +# {valueType: "string", order: 446, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} # provisioner.genericProvisioner.entityResolver.ldapMatchingSearchAttribute = # LDAP mapping type -# {valueType: "string", order: 448, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValues: ["entityAttribute", "translation"]} +# {valueType: "string", order: 448, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValues: ["entityAttribute", "translation"]} # provisioner.genericProvisione.entityResolverr.ldapMappingType = # LDAP mapping entity attribute -# {valueType: "string", order: 450, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver && entityResolver.ldapMappingType == 'entityAttribute'}", formElement: "dropdown", optionValues: ['subjectId', 'subjectIdentifier0']} +# {valueType: "string", order: 450, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver && entityResolver.ldapMappingType == 'entityAttribute'}", formElement: "dropdown", optionValues: ['subjectId', 'subjectIdentifier0']} # provisioner.genericProvisioner.entityResolver.ldapMappingEntityAttribute = # LDAP matching expression -# {valueType: "string", order: 452, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver && entityResolver.ldapMappingType == 'translation'}"} +# {valueType: "string", order: 452, indent: 1, required: true, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver && entityResolver.ldapMappingType == 'translation'}"} # provisioner.genericProvisioner.entityResolver.ldapMatchingExpression = # Filter all LDAP on full -# {valueType: "boolean", order: 454, defaultValue: "true", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP}"} +# {valueType: "boolean", order: 454, indent: 1, defaultValue: "true", subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP}"} # provisioner.genericProvisioner.entityResolver.filterAllLDAPOnFull = # Last updated attribute -# {valueType: "string", order: 456, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} +# {valueType: "string", order: 456, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}"} # provisioner.genericProvisioner.entityResolver.lastUpdatedAttribute = # LDAP last updated format -# {valueType: "string", order: 458, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValues: ["default", "activeDirectory"]} +# {valueType: "string", order: 458, indent: 1, subSection: "entityAttributes", showEl: "${entityResolver.entityAttributesNotInSubjectSource && entityResolver.resolveAttributesWithLDAP && !entityResolver.useGlobalLDAPResolver}", formElement: "dropdown", optionValues: ["default", "activeDirectory"]} # provisioner.genericProvisioner.entityResolver.lastUpdatedFormat = @@ -2417,27 +2417,27 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.customizeMembershipCrud = # Select memberships -# {valueType: "boolean", order: 1500, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud}"} +# {valueType: "boolean", order: 1500, indent: 1, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud}"} # provisioner.genericProvisioner.selectMemberships = # Insert memberships -# {valueType: "boolean", order: 2500, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud}"} +# {valueType: "boolean", order: 2500, indent: 1, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud}"} # provisioner.genericProvisioner.insertMemberships = # Delete memberships -# {valueType: "boolean", order: 3500, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud}"} +# {valueType: "boolean", order: 3500, indent: 1, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud}"} # provisioner.genericProvisioner.deleteMemberships = # Delete memberships if not exist in grouper -# {valueType: "boolean", order: 4500, defaultValue: "false", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud && deleteMemberships}"} +# {valueType: "boolean", order: 4500, indent: 2, defaultValue: "false", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud && deleteMemberships}"} # provisioner.genericProvisioner.deleteMembershipsIfNotExistInGrouper = # Delete memberships if deleted in grouper -# {valueType: "boolean", order: 5500, defaultValue: "false", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud && deleteMemberships && !deleteMembershipsIfNotExistInGrouper}"} +# {valueType: "boolean", order: 5500, indent: 2, defaultValue: "false", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud && deleteMemberships && !deleteMembershipsIfNotExistInGrouper}"} # provisioner.genericProvisioner.deleteMembershipsIfGrouperDeleted = # Delete memberships if deleted in grouper -# {valueType: "boolean", order: 5600, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud && deleteMemberships && !deleteMembershipsIfNotExistInGrouper && !deleteMembershipsIfGrouperDeleted}"} +# {valueType: "boolean", order: 5600, indent: 2, defaultValue: "true", subSection: "membership", showEl: "${operateOnGrouperMemberships && customizeMembershipCrud && deleteMemberships && !deleteMembershipsIfNotExistInGrouper && !deleteMembershipsIfGrouperDeleted}"} # provisioner.genericProvisioner.deleteMembershipsIfGrouperCreated = # Advanced options, note, there might not be any @@ -2480,70 +2480,70 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # Show membership attribute crud -# {valueType: "boolean", order: 5820, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5820, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAttributeCrud = # Select attribute? -# {valueType: "boolean", order: 5880, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (selectMemberships == null || selectMemberships) && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5880, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (selectMemberships == null || selectMemberships) && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.select = # Insert attribute? -# {valueType: "boolean", order: 5900, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (insertMemberships == null || insertMemberships) && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5900, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && (insertMemberships == null || insertMemberships) && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeCrud}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.insert = # Show membership attribute validation -# {valueType: "boolean", order: 5925, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 5925, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAttributeValueSettings = # Value type -# {valueType: "string", order: 5950, defaultValue: "string", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetMembershipAttribute", repeatCount: 20 } +# {valueType: "string", order: 5950, indent: 2, defaultValue: "string", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetMembershipAttribute", repeatCount: 20 } # provisioner.genericProvisioner.targetMembershipAttribute.$i$.valueType = # Ignore this group if this attribute matches any of these values (comma separated) -# {valueType: "string", order: 6050, multiple: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6050, indent: 2, multiple: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.ignoreIfMatchesValue = # Default value if there is not a value -# {valueType: "string", order: 6075, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6075, indent: 2, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.defaultValue = # Show membership attribute validation -# {valueType: "boolean", order: 6080, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 6080, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.showAttributeValidation = # If a value is required to provision this group -# {valueType: "boolean", order: 6100, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "boolean", order: 6100, indent: 2, defaultValue: "false", showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.required = # Maximum length of this attribute to be valid for provisioning -# {valueType: "integer", order: 6125, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "integer", order: 6125, indent: 2, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.maxlength = # Validate value with jexl to see if valid for provisioning, the variable 'value' represents the current value. return true if valid and false if invalid -# {valueType: "string", order: 6150, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6150, indent: 2, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.showAdvancedAttribute && targetMembershipAttribute.$i$.showAttributeValidation}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.validExpression = # Translate expression create only type -# {valueType: "string", order: 6175, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6175, indent: 1, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly = # Translate from field create only -# {valueType: "string", order: 6200, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6200, indent: 1, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningGroupFieldCreateOnly = # Translate from field create only -# {valueType: "string", order: 6250, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "memberId", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6250, indent: 1, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField' && targetMembershipAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "memberId", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromGrouperProvisioningEntityFieldCreateOnly = # Translate from static values create only -# {valueType: "string", order: 6275, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues' && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6275, indent: 1, required: true, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues' && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateFromStaticValuesCreateOnly = # Translate expression create only -# {valueType: "string", order: 6300, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript' && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} +# {valueType: "string", order: 6300, indent: 1, required: false, showEl: "${operateOnGrouperMemberships && numberOfMembershipAttributes > $i$ && targetMembershipAttribute.$i$.insert && targetMembershipAttribute.$i$.update && targetMembershipAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript' && targetMembershipAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetMembershipAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetMembershipAttribute.$i$.translateExpressionCreateOnly = # Operate on grouper groups @@ -2555,31 +2555,31 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.customizeGroupCrud = # Select groups -# {valueType: "boolean", order: 8500, defaultValue: "true", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} +# {valueType: "boolean", order: 8500, indent: 1, defaultValue: "true", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} # provisioner.genericProvisioner.selectGroups = # Insert groups -# {valueType: "boolean", order: 9000, subSection: "group", defaultValue: "true", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} +# {valueType: "boolean", order: 9000, indent: 1, subSection: "group", defaultValue: "true", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} # provisioner.genericProvisioner.insertGroups = # Delete groups -# {valueType: "boolean", order: 9500, defaultValue: "true", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} +# {valueType: "boolean", order: 9500, indent: 1, defaultValue: "true", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} # provisioner.genericProvisioner.deleteGroups = # Delete groups if not exist in grouper -# {valueType: "boolean", order: 10000, defaultValue: "false", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud && deleteGroups}"} +# {valueType: "boolean", order: 10000, indent: 2, defaultValue: "false", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud && deleteGroups}"} # provisioner.genericProvisioner.deleteGroupsIfNotExistInGrouper = # Delete groups if deleted in grouper -# {valueType: "boolean", order: 10500, defaultValue: "false", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud && deleteGroups && deleteGroupsIfNotExistInGrouper == false}"} +# {valueType: "boolean", order: 10500, indent: 2, defaultValue: "false", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud && deleteGroups && deleteGroupsIfNotExistInGrouper == false}"} # provisioner.genericProvisioner.deleteGroupsIfGrouperDeleted = # Delete groups if not exist in grouper -# {valueType: "boolean", order: 10600, defaultValue: "true", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud && deleteGroups && deleteGroupsIfNotExistInGrouper == false && deleteGroupsIfGrouperDeleted == false}"} +# {valueType: "boolean", order: 10600, indent: 2, defaultValue: "true", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud && deleteGroups && deleteGroupsIfNotExistInGrouper == false && deleteGroupsIfGrouperDeleted == false}"} # provisioner.genericProvisioner.deleteGroupsIfGrouperCreated = # Update groups -# {valueType: "boolean", order: 11500, defaultValue: "false", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} +# {valueType: "boolean", order: 11500, indent: 1, defaultValue: "false", subSection: "group", showEl: "${operateOnGrouperGroups && customizeGroupCrud}"} # provisioner.genericProvisioner.updateGroups = # if the groups need to be resolved in target @@ -2615,71 +2615,71 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAdvancedAttribute = # Show group attribute crud -# {valueType: "boolean", order: 22400, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 22400, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAttributeCrud = # Select attribute? -# {valueType: "boolean", order: 22500, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (selectGroups == null || selectGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 22500, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (selectGroups == null || selectGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.select = # Insert attribute? -# {valueType: "boolean", order: 23000, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (insertGroups == null || insertGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 23000, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (insertGroups == null || insertGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.insert = # Update attribute? -# {valueType: "boolean", order: 24000, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (updateGroups == null || updateGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 24000, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && (updateGroups == null || updateGroups) && targetGroupAttribute.$i$.showAttributeCrud}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.update = # Show group attribute validation -# {valueType: "boolean", order: 25000, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 25000, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAttributeValueSettings = # Value type -# {valueType: "string", order: 25100, defaultValue: "string", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetGroupAttribute", repeatCount: 20 } +# {valueType: "string", order: 25100, indent: 2, defaultValue: "string", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetGroupAttribute", repeatCount: 20 } # provisioner.genericProvisioner.targetGroupAttribute.$i$.valueType = # Multi-valued attribute? -# {valueType: "boolean", order: 25200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 25200, indent: 2, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.multiValued = # Default value if there is not a value -# {valueType: "string", order: 25500, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 25500, indent: 2, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.defaultValue = # Ignore this group if this attribute matches any of these values (comma separated) -# {valueType: "string", order: 26000, multiple: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 26000, indent: 2, multiple: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.ignoreIfMatchesValue = # Show group attribute validation -# {valueType: "boolean", order: 29200, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 29200, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.showAttributeValidation = # If a value is required to provision this group -# {valueType: "boolean", order: 29250, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "boolean", order: 29250, indent: 2, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.required = # Maximum length of this field to be valid for provisioning -# {valueType: "integer", order: 29500, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "integer", order: 29500, indent: 2, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.maxlength = # Validate value with jexl to see if valid for provisioning, the variable 'value' represents the current value. return true if valid and false if invalid -# {valueType: "string", order: 29750, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 29750, indent: 2, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.showAttributeValidation}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.validExpression = # Translate expression create only type -# {valueType: "string", order: 31300, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "staticValues", "translationScript"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 31300, indent: 1, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningGroupField", "staticValues", "translationScript"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpressionTypeCreateOnly = # Translate from field create only -# {valueType: "string", order: 31600, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 31600, indent: 1, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningGroupField'}", formElement: "dropdown", optionValues: ["id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "name", "description"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromGrouperProvisioningGroupFieldCreateOnly = # Translate from static values create only -# {valueType: "string", order: 31800, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 31800, indent: 1, required: true, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateFromStaticValuesCreateOnly = # Translate expression create only -# {valueType: "string", order: 32000, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 32000, indent: 1, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpressionCreateOnly = # Search attribute? @@ -2711,31 +2711,31 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.customizeEntityCrud = # Select entities -# {valueType: "boolean", order: 37500, defaultValue: "true", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud}"} +# {valueType: "boolean", order: 37500, indent: 1, defaultValue: "true", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud}"} # provisioner.genericProvisioner.selectEntities = # Insert entities -# {valueType: "boolean", order: 38000, subSection: "entity", defaultValue: "true", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities}"} +# {valueType: "boolean", order: 38000, indent: 1, subSection: "entity", defaultValue: "true", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities}"} # provisioner.genericProvisioner.insertEntities = # Delete entities -# {valueType: "boolean", order: 39000, subSection: "entity", defaultValue: "true", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities}"} +# {valueType: "boolean", order: 39000, indent: 1, subSection: "entity", defaultValue: "true", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities}"} # provisioner.genericProvisioner.deleteEntities = # Delete entities if not exist in grouper -# {valueType: "boolean", order: 39500, defaultValue: "false", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities && deleteEntities}"} +# {valueType: "boolean", order: 39500, indent: 2, defaultValue: "false", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities && deleteEntities}"} # provisioner.genericProvisioner.deleteEntitiesIfNotExistInGrouper = # Delete entities if deleted in grouper -# {valueType: "boolean", order: 40000, defaultValue: "false", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities && deleteEntities && !deleteEntitiesIfNotExistInGrouper}"} +# {valueType: "boolean", order: 40000, indent: 2, defaultValue: "false", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities && deleteEntities && !deleteEntitiesIfNotExistInGrouper}"} # provisioner.genericProvisioner.deleteEntitiesIfGrouperDeleted = # Delete entities if not exist in grouper -# {valueType: "boolean", order: 40100, defaultValue: "true", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities && deleteEntities && !deleteEntitiesIfNotExistInGrouper && !deleteEntitiesIfGrouperDeleted}"} +# {valueType: "boolean", order: 40100, indent: 2, defaultValue: "true", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities && deleteEntities && !deleteEntitiesIfNotExistInGrouper && !deleteEntitiesIfGrouperDeleted}"} # provisioner.genericProvisioner.deleteEntitiesIfGrouperCreated = # Update entities -# {valueType: "boolean", order: 41000, defaultValue: "true", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities}"} +# {valueType: "boolean", order: 41000, indent: 1, defaultValue: "true", subSection: "entity", showEl: "${operateOnGrouperEntities && customizeEntityCrud && makeChangesToEntities}"} # provisioner.genericProvisioner.updateEntities = # Select all entities @@ -2775,88 +2775,88 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAdvancedAttribute = # Show entity attribute crud -# {valueType: "boolean", order: 62000, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 62000, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeCrud = # Select attribute? -# {valueType: "boolean", order: 63000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && (selectEntities == null || selectEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 63000, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && (selectEntities == null || selectEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.select = # Insert attribute? -# {valueType: "boolean", order: 64000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && makeChangesToEntities && (insertEntities == null || insertEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 64000, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && makeChangesToEntities && (insertEntities == null || insertEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.insert = # Update attribute? -# {valueType: "boolean", order: 65000, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && makeChangesToEntities && (updateEntities == null || updateEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 65000, indent: 2, defaultValue: "true", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && makeChangesToEntities && (updateEntities == null || updateEntities) && targetEntityAttribute.$i$.showAttributeCrud}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.update = # Show entity attribute validation -# {valueType: "boolean", order: 67100, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 67100, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeValueSettings = # Value type -# {valueType: "string", order: 67200, defaultValue: "string", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetEntityAttribute", repeatCount: 20 } +# {valueType: "string", order: 67200, indent: 2, defaultValue: "string", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", formElement: "dropdown", optionValues: ["string", "long", "int"], repeatGroup: "targetEntityAttribute", repeatCount: 20 } # provisioner.genericProvisioner.targetEntityAttribute.$i$.valueType = # Multi-valued attribute? -# {valueType: "boolean", order: 67300, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 67300, indent: 2, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.multiValued = # Default value if there is not a value -# {valueType: "string", order: 67400, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 67400, indent: 2, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.defaultValue = # Ignore entity if this attribute matches any of these values (comma separated) -# {valueType: "string", order: 67500, multiple: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 67500, indent: 2, multiple: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValueSettings}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.ignoreIfMatchesValue = # Show entity attribute validation -# {valueType: "boolean", order: 69125, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 69125, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.showAttributeValidation = # If a value is required to provision this entity -# {valueType: "boolean", order: 69250, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 69250, indent: 2, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.required = # Maximum length of this field to be valid for provisioning -# {valueType: "string", order: 69500, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 69500, indent: 2, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.maxlength = # Validate value with jexl to see if valid for provisioning -# {valueType: "string", order: 69750, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 69750, indent: 2, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.validExpression = # Search attribute? -# {valueType: "boolean", order: 70500, defaultValue: "false", showEl: "${operateOnGrouperEntities && selectEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && !targetEntityAttribute.$i$.multiValued && targetEntityAttribute.$i$.select}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 70500, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperEntities && selectEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && !targetEntityAttribute.$i$.multiValued && targetEntityAttribute.$i$.select}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.searchAttribute = # Translate expression create only type -# {valueType: "string", order: 70650, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 70650, indent: 1, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionTypeCreateOnly = # Translate from field create only -# {valueType: "string", order: 70750, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetGroupAttribute", repeatCount: 20} +# {valueType: "string", order: 70750, indent: 1, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'grouperProvisioningEntityField'}", formElement: "dropdown", optionValues: ["id", "email", "loginid", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"], repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromGrouperProvisioningEntityFieldCreateOnly = # Translate from static values create only -# {valueType: "string", order: 70850, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 70850, indent: 1, required: true, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'staticValues'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateFromStaticValuesCreateOnly = # Translate expression create only -# {valueType: "string", order: 72000, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 72000, indent: 1, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionCreateOnly = # During the entity link, copy this attribute to the sync field -# {valueType: "string", order: 76000, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76000, indent: 1, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateToMemberSyncField = # After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 76200, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "string", order: 76200, indent: 1, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateGrouperToMemberSyncField = # Matching id attribute? -# {valueType: "boolean", order: 76300, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} +# {valueType: "boolean", order: 76300, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.matchingId = @@ -2881,85 +2881,85 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.groupAttributeValueCacheHas = # Target group link - has groupAttributeValueCache0? -# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78001} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78001} # provisioner.genericProvisioner.groupAttributeValueCache0has = # Target group link - groupAttributeValueCache0 source -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has}", order: 78002, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has}", order: 78002, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.groupAttributeValueCache0source = # Target group link - groupAttributeValueCache0 type -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has}", order: 78004, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has}", order: 78004, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} # provisioner.genericProvisioner.groupAttributeValueCache0type = # Target group link - groupAttributeValueCache0 groupAttribute -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has && groupAttributeValueCache0type == 'groupAttribute'}", order: 78006, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has && groupAttributeValueCache0type == 'groupAttribute'}", order: 78006, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupAttributeValueCache0groupAttribute = # Target group link - groupAttributeValueCache0 translationScript -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has && groupAttributeValueCache0type == 'translationScript'}", order: 78008} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache0has && groupAttributeValueCache0type == 'translationScript'}", order: 78008} # provisioner.genericProvisioner.groupAttributeValueCache0translationScript = # Target group link - has groupAttributeValueCache1? -# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78101} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78101} # provisioner.genericProvisioner.groupAttributeValueCache1has = # Target group link - groupAttributeValueCache1 source -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has}", order: 78102, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has}", order: 78102, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.groupAttributeValueCache1source = # Target group link - groupAttributeValueCache1 type -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has}", order: 78104, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has}", order: 78104, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} # provisioner.genericProvisioner.groupAttributeValueCache1type = # Target group link - groupAttributeValueCache1 groupAttribute -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has && groupAttributeValueCache1type == 'groupAttribute'}", order: 78106, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has && groupAttributeValueCache1type == 'groupAttribute'}", order: 78106, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupAttributeValueCache1groupAttribute = # Target group link - groupAttributeValueCache1 translationScript -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has && groupAttributeValueCache1type == 'translationScript'}", order: 78108} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache1has && groupAttributeValueCache1type == 'translationScript'}", order: 78108} # provisioner.genericProvisioner.groupAttributeValueCache1translationScript = # Target group link - has groupAttributeValueCache2? -# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78201} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78201} # provisioner.genericProvisioner.groupAttributeValueCache2has = # Target group link - groupAttributeValueCache2 source -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has}", order: 78202, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has}", order: 78202, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.groupAttributeValueCache2source = # Target group link - groupAttributeValueCache2 type -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has}", order: 78204, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has}", order: 78204, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} # provisioner.genericProvisioner.groupAttributeValueCache2type = # Target group link - groupAttributeValueCache2 groupAttribute -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has && groupAttributeValueCache2type == 'groupAttribute'}", order: 78206, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has && groupAttributeValueCache2type == 'groupAttribute'}", order: 78206, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupAttributeValueCache2groupAttribute = # Target group link - groupAttributeValueCache2 translationScript -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has && groupAttributeValueCache2type == 'translationScript'}", order: 78208} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache2has && groupAttributeValueCache2type == 'translationScript'}", order: 78208} # provisioner.genericProvisioner.groupAttributeValueCache2translationScript = # Target group link - has groupAttributeValueCache3? -# {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78301} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas}", order: 78301} # provisioner.genericProvisioner.groupAttributeValueCache3has = # Target group link - groupAttributeValueCache3 source -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has}", order: 78302, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has}", order: 78302, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.groupAttributeValueCache3source = # Target group link - groupAttributeValueCache3 type -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has}", order: 78304, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has}", order: 78304, formElement: "dropdown", optionValues: ["groupAttribute", "translationScript"]} # provisioner.genericProvisioner.groupAttributeValueCache3type = # Target group link - groupAttributeValueCache3 groupAttribute -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has && groupAttributeValueCache3type == 'groupAttribute'}", order: 78306, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has && groupAttributeValueCache3type == 'groupAttribute'}", order: 78306, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupAttributeValueCache3groupAttribute = # Target group link - groupAttributeValueCache3 translationScript -# {valueType: "string", required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has && groupAttributeValueCache3type == 'translationScript'}", order: 78308} +# {valueType: "string", indent: 2, required: true, subSection: "group2", showEl: "${operateOnGrouperGroups && groupAttributeValueCacheHas && groupAttributeValueCache3has && groupAttributeValueCache3type == 'translationScript'}", order: 78308} # provisioner.genericProvisioner.groupAttributeValueCache3translationScript = @@ -2980,85 +2980,85 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityAttributeValueCacheHas = # Target entity link - has entityAttributeValueCache0? -# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80301} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80301} # provisioner.genericProvisioner.entityAttributeValueCache0has = # Target entity link - entityAttributeValueCache0 source -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80302, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80302, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.entityAttributeValueCache0source = # Target entity link - entityAttributeValueCache0 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80304, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has}", order: 80304, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache0type = # Target entity link - entityAttributeValueCache0 entityAttribute -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && entityAttributeValueCache0type == 'entityAttribute'}", order: 80306, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && entityAttributeValueCache0type == 'entityAttribute'}", order: 80306, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.entityAttributeValueCache0entityAttribute = # Target entity link - entityAttributeValueCache0 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && (entityAttributeValueCache0type == 'translationScript' || entityAttributeValueCache0type == 'subjectTranslationScript')}", order: 80308} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache0has && (entityAttributeValueCache0type == 'translationScript' || entityAttributeValueCache0type == 'subjectTranslationScript')}", order: 80308} # provisioner.genericProvisioner.entityAttributeValueCache0translationScript = # Target entity link - has entityAttributeValueCache1? -# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80401} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80401} # provisioner.genericProvisioner.entityAttributeValueCache1has = # Target entity link - entityAttributeValueCache1 source -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80402, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80402, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.entityAttributeValueCache1source = # Target entity link - entityAttributeValueCache1 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80404, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has}", order: 80404, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache1type = # Target entity link - entityAttributeValueCache1 entityAttribute -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && entityAttributeValueCache1type == 'entityAttribute'}", order: 80406, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && entityAttributeValueCache1type == 'entityAttribute'}", order: 80406, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.entityAttributeValueCache1entityAttribute = # Target entity link - entityAttributeValueCache1 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && (entityAttributeValueCache1type == 'translationScript' || entityAttributeValueCache1type == 'subjectTranslationScript')}", order: 80408} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache1has && (entityAttributeValueCache1type == 'translationScript' || entityAttributeValueCache1type == 'subjectTranslationScript')}", order: 80408} # provisioner.genericProvisioner.entityAttributeValueCache1translationScript = # Target entity link - has entityAttributeValueCache2? -# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80501} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80501} # provisioner.genericProvisioner.entityAttributeValueCache2has = # Target entity link - entityAttributeValueCache2 source -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80502, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80502, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.entityAttributeValueCache2source = # Target entity link - entityAttributeValueCache2 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80504, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has}", order: 80504, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache2type = # Target entity link - entityAttributeValueCache2 entityAttribute -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && entityAttributeValueCache2type == 'entityAttribute'}", order: 80506, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && entityAttributeValueCache2type == 'entityAttribute'}", order: 80506, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.entityAttributeValueCache2entityAttribute = # Target entity link - entityAttributeValueCache2 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && (entityAttributeValueCache2type == 'translationScript' || entityAttributeValueCache2type == 'subjectTranslationScript')}", order: 80508} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache2has && (entityAttributeValueCache2type == 'translationScript' || entityAttributeValueCache2type == 'subjectTranslationScript')}", order: 80508} # provisioner.genericProvisioner.entityAttributeValueCache2translationScript = # Target entity link - has entityAttributeValueCache3? -# {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80601} +# {valueType: "boolean", indent: 1, defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas}", order: 80601} # provisioner.genericProvisioner.entityAttributeValueCache3has = # Target entity link - entityAttributeValueCache3 source -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80602, formElement: "dropdown", optionValues: ["grouper", "target"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80602, formElement: "dropdown", optionValues: ["grouper", "target"]} # provisioner.genericProvisioner.entityAttributeValueCache3source = # Target entity link - entityAttributeValueCache3 type -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80604, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has}", order: 80604, formElement: "dropdown", optionValues: ["entityAttribute", "subjectTranslationScript", "translationScript"]} # provisioner.genericProvisioner.entityAttributeValueCache3type = # Target entity link - entityAttributeValueCache3 entityAttribute -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && entityAttributeValueCache3type == 'entityAttribute'}", order: 80606, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && entityAttributeValueCache3type == 'entityAttribute'}", order: 80606, formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.entityAttributeValueCache3entityAttribute = # Target entity link - entityAttributeValueCache3 translationScript -# {valueType: "string", required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && (entityAttributeValueCache3type == 'translationScript' || entityAttributeValueCache3type == 'subjectTranslationScript')}", order: 80608} +# {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && (entityAttributeValueCache3type == 'translationScript' || entityAttributeValueCache3type == 'subjectTranslationScript')}", order: 80608} # provisioner.genericProvisioner.entityAttributeValueCache3translationScript = @@ -3274,7 +3274,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.logCommandsAlways = # keep a log of all commands, and if there is an error and if so then log to the log file -# {valueType: "boolean", subSection: "advanced", defaultValue: "false", order: 139160, showEl: "${showAdvanced && !logCommandsAlways}"} +# {valueType: "boolean", indent: 1, subSection: "advanced", defaultValue: "false", order: 139160, showEl: "${showAdvanced && !logCommandsAlways}"} # provisioner.genericProvisioner.logCommandsOnError = # if the target should be checked before sending actions. e.g. if an addMember is made to a provisionable diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/cfg/dbConfig/ConfigItemMetadata.java b/grouper/src/grouper/edu/internet2/middleware/grouper/cfg/dbConfig/ConfigItemMetadata.java index 3cc080b0a100..84e9eb8d3f3e 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/cfg/dbConfig/ConfigItemMetadata.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/cfg/dbConfig/ConfigItemMetadata.java @@ -329,6 +329,28 @@ public void setRequiredEl(String requiredEl) { this.requiredEl = requiredEl; } + /** + * number of levels to indent in hide/show + */ + private int indent = 0; + + + /** + * number of levels to indent in hide/show + * @return + */ + public int getIndent() { + return indent; + } + + /** + * number of levels to indent in hide/show + * @param indent + */ + public void setIndent(int indent) { + this.indent = indent; + } + /** * replace $i$ with repeat index * @param repeatIndex @@ -354,6 +376,7 @@ public ConfigItemMetadata clone(int repeatIndex) { copy.subSection = GrouperUtil.replace(this.subSection, "$i$", GrouperUtil.stringValue(repeatIndex)); copy.formElement = this.formElement; + copy.indent = this.indent; copy.multiple = this.multiple; copy.optionValues = this.optionValues; copy.order = this.order; @@ -375,6 +398,7 @@ public ConfigItemMetadata clone(int repeatIndex) { */ public void processMetadata() { + this.indent = 0; this.multiple = false; this.mustExtendClass = null; this.mustImplementInterface = null; @@ -422,6 +446,11 @@ public void processMetadata() { jsonNode.remove("order"); } + if (jsonNode.has("indent")) { + this.indent = GrouperUtil.jsonJacksonGetInteger(jsonNode, "indent"); + jsonNode.remove("indent"); + } + if (jsonNode.has("mustExtendClass")) { this.mustExtendClass = GrouperUtil.jsonJacksonGetString(jsonNode, "mustExtendClass"); jsonNode.remove("mustExtendClass"); From e5f48f3bb86a6f8f1ef342704aec4b6cc27a19a0 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Mon, 2 May 2022 11:24:41 -0400 Subject: [PATCH 036/125] GRP-4019: (commit 1) refactor matching and search attribute configuration --- grouper/conf/grouper-loader.base.properties | 43 ++++--------------- .../grouper.textNg.en.us.base.properties | 26 ----------- 2 files changed, 8 insertions(+), 61 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 62d85d341366..64566f4dab00 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2682,22 +2682,6 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", order: 32000, indent: 1, required: false, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && targetGroupAttribute.$i$.insert && targetGroupAttribute.$i$.update && targetGroupAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetGroupAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetGroupAttribute.$i$.translateExpressionCreateOnly = -# Search attribute? -# {valueType: "boolean", order: 36000, defaultValue: "false", showEl: "${operateOnGrouperGroups && selectGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && !targetGroupAttribute.$i$.multiValued && targetGroupAttribute.$i$.select}", repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.searchAttribute = - -# Matching id attribute? -# {valueType: "boolean", order: 36100, defaultValue: "false", showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.matchingId = - -# During 'group link' copy this value from the target into the sync field -# {valueType: "string", order: 36200, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute && hasTargetGroupLink}", formElement: "dropdown", optionValues: ["groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateToGroupSyncField = - -# After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 36300, showEl: "${operateOnGrouperGroups && numberOfGroupAttributes > $i$ && targetGroupAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3"], repeatGroup: "targetGroupAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetGroupAttribute.$i$.translateGrouperToGroupSyncField = - # Operate on grouper entities # {valueType: "boolean", order: 37000, defaultValue: "false", subSection: "entity"} # provisioner.genericProvisioner.operateOnGrouperEntities = @@ -2827,10 +2811,6 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", order: 69750, indent: 2, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.showAttributeValidation}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.validExpression = -# Search attribute? -# {valueType: "boolean", order: 70500, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperEntities && selectEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && !targetEntityAttribute.$i$.multiValued && targetEntityAttribute.$i$.select}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.searchAttribute = - # Translate expression create only type # {valueType: "string", order: 70650, indent: 1, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.update}", formElement: "dropdown", optionValues: ["grouperProvisioningEntityField", "staticValues", "translationScript"], repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionTypeCreateOnly = @@ -2847,19 +2827,6 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "string", order: 72000, indent: 1, required: false, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && targetEntityAttribute.$i$.insert && targetEntityAttribute.$i$.translateExpressionTypeCreateOnly == 'translationScript'}", repeatGroup: "targetEntityAttribute", repeatCount: 20} # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionCreateOnly = -# During the entity link, copy this attribute to the sync field -# {valueType: "string", order: 76000, indent: 1, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute && hasTargetEntityLink}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateToMemberSyncField = - -# After calculating the Grouper value store that in a sync field -# {valueType: "string", order: 76200, indent: 1, showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", formElement: "dropdown", optionValues: ["entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3"], repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.translateGrouperToMemberSyncField = - -# Matching id attribute? -# {valueType: "boolean", order: 76300, indent: 1, defaultValue: "false", showEl: "${operateOnGrouperEntities && numberOfEntityAttributes > $i$ && targetEntityAttribute.$i$.showAdvancedAttribute}", repeatGroup: "targetEntityAttribute", repeatCount: 20} -# provisioner.genericProvisioner.targetEntityAttribute.$i$.matchingId = - - # subject sources to provision # {valueType: "string", required: true, order: 77000, multiple: true, formElement: "checkbox", checkboxValuesFromClass: "edu.internet2.middleware.grouper.SubjectFinder", subSection: "general2", showEl: "${operateOnGrouperEntities || operateOnGrouperMemberships}"} # provisioner.genericProvisioner.subjectSourcesToProvision = @@ -2968,13 +2935,19 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.group2advanced = # membership attribute name for entities -# {valueType: "string", required: true, order: 80200, subSection: "entity2", showEl: "${operateOnGrouperEntities && provisioningType == 'entityAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", required: true, order: 80100, subSection: "entity2", showEl: "${operateOnGrouperEntities && provisioningType == 'entityAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.entityMembershipAttributeName = # membership attribute value for entities -# {valueType: "string", required: true, order: 80210, subSection: "entity2", showEl: "${operateOnGrouperEntities && provisioningType == 'entityAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", required: true, order: 80101, subSection: "entity2", showEl: "${operateOnGrouperEntities && provisioningType == 'entityAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.entityMembershipAttributeValue = +# generally the matching attribute(s) are the same as the search attributes, but they can be different +# {valueType: "boolean", defaultValue: "true", order: 80220, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities)}"} +# provisioner.genericProvisioner.entityMatchingAttributeSameAsSearchAttribute = + + + # Target entity link - has entityAttributeValueCache? # {valueType: "boolean", defaultValue: "false", subSection: "entity2", showEl: "${operateOnGrouperEntities}", order: 80301} # provisioner.genericProvisioner.entityAttributeValueCacheHas = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 4facd72cc7db..dc3210be2fec 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -14021,12 +14021,8 @@ config.GenericConfiguration.attribute.targetMembershipAttribute.i.update.label = config.GenericConfiguration.attribute.targetMembershipAttribute.i.update.description = Should this attribute be changed when the group is updated. config.GenericConfiguration.attribute.targetMembershipAttribute.i.ignoreIfMatchesValue.label = __i+1__ - ignore if matches value config.GenericConfiguration.attribute.targetMembershipAttribute.i.ignoreIfMatchesValue.description = If the group field or attribute value matches any of these values then ignore it (do not delete or update). Comma separated values, escaped comma is U+002C -config.GenericConfiguration.attribute.targetMembershipAttribute.i.matchingId.label = __i+1__ - matching id -config.GenericConfiguration.attribute.targetMembershipAttribute.i.matchingId.description = The "matching id" is the attribute that is used to match up target objects with Grouper objects. If the matching ID is something opaque like the idIndex or uuid then objects can be more reliably renamed. config.GenericConfiguration.attribute.targetMembershipAttribute.i.multiValued.label = __i+1__ - multi-valued attribute config.GenericConfiguration.attribute.targetMembershipAttribute.i.multiValued.description = If this attribute is multi-valued in the target. Generally attributes are single-valued. The membership attribute must be multi-valued if provisioning groupAttributes. -config.GenericConfiguration.attribute.targetMembershipAttribute.i.searchAttribute.label = __i+1__ - search attribute -config.GenericConfiguration.attribute.targetMembershipAttribute.i.searchAttribute.description = If this attribute is used to find groups in the target. The search in the target for this group might just need this attribute name and value or there might be a search filter, and this is the value of the bind variable. config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateExpressionCreateOnly.label = __i+1__ - translation expression insert only config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateExpressionCreateOnly.description = If you have a different translation from Grouper to Target for updates as opposed to inserts, put the insert translation here. Available variables:
    • $$provisioning.helper.variable.grouperProvisioningGroup$$
    • $$provisioning.helper.variable.gcGrouperSyncGroup$$
    • $$provisioning.helper.variable.provisioningGroupWrapper$$
    • $$provisioning.helper.variable.grouperTargetGroup$$
    • provisioning.helper.variable.grouperProvisioningEntity
    • provisioning.helper.variable.gcGrouperSyncMember
    • provisioning.helper.variable.provisioningEntityWrapper
    • provisioning.helper.variable.grouperTargetEntity
    @@ -14060,12 +14056,6 @@ config.GenericConfiguration.attribute.targetMembershipAttribute.i.maxlength.labe config.GenericConfiguration.attribute.targetMembershipAttribute.i.maxlength.description = If there is a maximum length requirement for this field in the target, assign the integer of maximum number of characters. If this field value size is greater than the max length, then the Group is invalid and will not be provisioned config.GenericConfiguration.attribute.targetMembershipAttribute.i.validExpression.label = __i+1__ - validation expression config.GenericConfiguration.attribute.targetMembershipAttribute.i.validExpression.description = If there is a complex validation by JEXL script enter that here. The available variables are "value" (each individual value), and "valueMultiple" (the set of multiple values if this attribute supports multiple values. Return true for valid or false for invalid. Example to see if numeric value is positive: ${value>0} -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromMemberSyncField.label = __i+1__ - membership sync from field -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromMemberSyncField.description = If this is a membership attribute for groupAttributes provisioning, then the values can be copied from the member sync object from this field. -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateToGroupSyncField.label = __i+1__ - target group link field -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateToGroupSyncField.description = If this is a group link field/attribute, then copy the target value to this group sync field, and retrieve from the group sync field as a cache during translation for incremental provisioning or during deletes. -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateGrouperToGroupSyncField.label = __i+1__ - Grouper group link field -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateGrouperToGroupSyncField.description = Copy the Grouper value to this group sync field, and retrieve from the group sync field during provisioning. config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromGrouperProvisioningEntityField.label = __i+1__ - translate from grouperProvisioningEntity field config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromGrouperProvisioningEntityField.description = Select the field from grouperProvisioningEntity to copy data from. id: is the UUID of the entity, email: email address of the user, loginid: netId to log in to systems, name: first and last name, subjectId: should be an opaque unchanging identifier, subjectSourceId: sourceId of the user, description: description that is configured in the subject source, subjectIdentifier0: the first identifier of the subject (might be a netId) @@ -14088,12 +14078,8 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.update.label = __i+ config.GenericConfiguration.attribute.targetGroupAttribute.i.update.description = Should this attribute be changed when the group is updated. This defaults to if the group object is selected. Note, if this is the memberships attribute in the provisioning type 'groupAttributes' then the CRUD controls on memberships will take effect instead of this attribute's CRUD. config.GenericConfiguration.attribute.targetGroupAttribute.i.ignoreIfMatchesValue.label = __i+1__ - ignore if matches value config.GenericConfiguration.attribute.targetGroupAttribute.i.ignoreIfMatchesValue.description = If the group field or attribute value matches any of these values then ignore it (do not delete or update). Comma separated values, escaped comma is U+002C -config.GenericConfiguration.attribute.targetGroupAttribute.i.matchingId.label = __i+1__ - matching id -config.GenericConfiguration.attribute.targetGroupAttribute.i.matchingId.description = The "matching id" is the attribute that is used to match up target objects with Grouper objects. If the matching ID is something opaque like the idIndex or uuid then objects can be more reliably renamed. config.GenericConfiguration.attribute.targetGroupAttribute.i.multiValued.label = __i+1__ - multi-valued attribute config.GenericConfiguration.attribute.targetGroupAttribute.i.multiValued.description = If this attribute is multi-valued in the target. Generally attributes are single-valued. The membership attribute must be multi-valued if provisioning groupAttributes. -config.GenericConfiguration.attribute.targetGroupAttribute.i.searchAttribute.label = __i+1__ - search attribute -config.GenericConfiguration.attribute.targetGroupAttribute.i.searchAttribute.description = If this attribute is used to find groups in the target. The search in the target for this group might just need this attribute name and value or there might be a search filter, and this is the value of the bind variable. config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionCreateOnly.label = __i+1__ - translation expression insert only config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionCreateOnly.description = If you have a different translation from Grouper to Target for updates as opposed to inserts, put the insert translation here. Available variables:
    • $$provisioning.helper.variable.grouperProvisioningGroup$$
    • $$provisioning.helper.variable.gcGrouperSyncGroup$$
    • $$provisioning.helper.variable.provisioningGroupWrapper$$
    • $$provisioning.helper.variable.grouperTargetGroup$$
    @@ -14129,10 +14115,6 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.validExpression.lab config.GenericConfiguration.attribute.targetGroupAttribute.i.validExpression.description = If there is a complex validation by JEXL script enter that here. The available variables are "value" (each individual value), and "valueMultiple" (the set of multiple values if this attribute supports multiple values. Return true for valid or false for invalid. Example to see if numeric value is positive: ${value>0} config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromMemberSyncField.label = __i+1__ - membership sync from field config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromMemberSyncField.description = If this is a membership attribute for groupAttributes provisioning, then the values can be copied from the member sync object from this field. -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateToGroupSyncField.label = __i+1__ - target group link field -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateToGroupSyncField.description = If this is a group link field/attribute, then copy the target value to this group sync field, and retrieve from the group sync field as a cache during translation for incremental provisioning or during deletes. -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateGrouperToGroupSyncField.label = __i+1__ - Grouper group link field -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateGrouperToGroupSyncField.description = Copy the Grouper value to this group sync field, and retrieve from the group sync field during provisioning. config.SqlProvisionerConfiguration.attribute.targetGroupAttribute.i.storageType.label = __i+1__ - Storage type config.SqlProvisionerConfiguration.attribute.targetGroupAttribute.i.storageType.description = Storage type @@ -14212,12 +14194,8 @@ config.GenericConfiguration.attribute.targetEntityAttribute.i.update.label = __i config.GenericConfiguration.attribute.targetEntityAttribute.i.update.description = Should this attribute be changed when the group is updated. This defaults to if the entity object is updated. Note, if this is the memberships attribute in the provisioning type 'entityAttributes' then the CRUD controls on memberships will take effect instead of this attribute's CRUD. config.GenericConfiguration.attribute.targetEntityAttribute.i.ignoreIfMatchesValue.label = __i+1__ - ignore if matches value config.GenericConfiguration.attribute.targetEntityAttribute.i.ignoreIfMatchesValue.description = If the entity field or attribute value matches any of these values then ignore it (do not delete or update). Comma separated values, escaped comma is U+002C -config.GenericConfiguration.attribute.targetEntityAttribute.i.matchingId.label = __i+1__ - matching id -config.GenericConfiguration.attribute.targetEntityAttribute.i.matchingId.description = The "matching id" is the attribute that is used to match up target objects with Grouper objects. If the matching ID is something opaque like the subjectId then objects can be more reliably renamed. config.GenericConfiguration.attribute.targetEntityAttribute.i.multiValued.label = __i+1__ - multi-valued attribute config.GenericConfiguration.attribute.targetEntityAttribute.i.multiValued.description = If this attribute is multi-valued in the target. Generally attributes are single-valued. The membership attribute must be multi-valued if provisioning entityAttributes. -config.GenericConfiguration.attribute.targetEntityAttribute.i.searchAttribute.label = __i+1__ - search attribute -config.GenericConfiguration.attribute.targetEntityAttribute.i.searchAttribute.description = If this attribute is used to find entities in the target. The search in the target for this entity might just need this attribute name and value or there might be a search filter, and this is the value of the bind variable. config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionCreateOnly.label = __i+1__ - translation expression during inserts config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionCreateOnly.description = If you have a different translation from Grouper to Target for updates as opposed to inserts, put the insert translation here. Available variables:
    • $$provisioning.helper.variable.grouperProvisioningEntity$$
    • $$provisioning.helper.variable.gcGrouperSyncEntity$$
    • $$provisioning.helper.variable.provisioningEntityWrapper$$
    • $$provisioning.helper.variable.grouperTargetEntity$$
    config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpression.label = __i+1__ - translation expression @@ -14253,10 +14231,6 @@ config.GenericConfiguration.attribute.targetEntityAttribute.i.validExpression.la config.GenericConfiguration.attribute.targetEntityAttribute.i.validExpression.description = If there is a complex validation by JEXL script enter that here. The available variables are "value" (each individual value), and "valueMultiple" (the set of multiple values if this attribute supports multiple values. Return true for valid or false for invalid. Example to see if numeric value is positive: ${value>0} config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGroupSyncField.label = __i+1__ - Group sync from field config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGroupSyncField.description = If this is a membership attribute for entityAttributes provisioning, then the values can be copied from the group sync object from this field. -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateToMemberSyncField.label = __i+1__ - Member sync to field -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateToMemberSyncField.description = If this is an entity link field/attribute, then copy the target value to this member sync field, and retrieve from the member sync field as a cache during translation for incremental provisioning or during deletes. -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateGrouperToMemberSyncField.label = __i+1__ - Grouper member link field -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateGrouperToMemberSyncField.description = Copy the grouper value to this member sync field, and retrieve from the member sync field during provisioning. config.GenericConfiguration.subSection.metadata.title = Metadata config.GenericConfiguration.subSection.metadata.description = Metadata is extra information attached to folders, groups, entities, or memberships used in provisioning configuration From 0ab0fb561f2c30a7d60ed326bd2da61ce6c80a5d Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Mon, 2 May 2022 23:36:25 -0700 Subject: [PATCH 037/125] Fix startWith issues --- .../UiV2ProvisionerConfiguration.java | 23 +++++++++++++++++++ .../grouper.textNg.en.us.base.properties | 2 ++ .../GrouperConfigurationModuleAttribute.java | 12 +++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java index 21f34d156c2d..9e14011f3559 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java @@ -879,6 +879,7 @@ public void addProvisionerConfiguration(final HttpServletRequest request, final if (startWithAttributes.containsKey(key)) { startWithAttributes.get(key).setValue(GrouperUtil.stringValue(valueToSet)); + startWithAttributes.get(key).setShow(true); } } } @@ -995,6 +996,28 @@ public void addProvisionerConfigurationSubmit(final HttpServletRequest request, provisionerConfiguration.setConfigId(provisionerConfigId); String provisionerStartWithClass = request.getParameter("provisionerStartWithClass"); + String previousProvisionerStartWithClass = request.getParameter("previousProvisionerStartWithClass"); + + List startWithConfigClasses = provisionerConfiguration.getStartWithConfigClasses(); + + if(startWithConfigClasses.size() > 0 && StringUtils.isBlank(previousProvisionerStartWithClass)) { + + GuiProvisionerConfiguration guiProvisioningConfiguration = GuiProvisionerConfiguration.convertFromProvisioningConfiguration(provisionerConfiguration); + provisionerConfigurationContainer.setGuiProvisionerConfiguration(guiProvisioningConfiguration); + + guiResponseJs.addAction(GuiScreenAction.newValidationMessage(GuiMessageType.error, + "#provisionerConfigStartWithId", + TextContainer.retrieveFromRequest().getText().get("provisionerConfigStartWithIdRequired"))); + + provisionerConfigurationContainer.setShowStartWithSection(true); + guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#grouperMainContentDivId", + "/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp")); + + + return; + + } + if (StringUtils.isNotBlank(provisionerStartWithClass) && !StringUtils.equals("empty", provisionerStartWithClass)) { Class startWithKlass = (Class) GrouperUtil.forName(provisionerStartWithClass); diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 4facd72cc7db..08d43899a845 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -11769,6 +11769,8 @@ provisionerConfigConfirmDeleteConfig = Are you sure you want to delete this prov # error that provisioner config id is required provisionerConfigCreateErrorConfigIdRequired = Error: Configuration id is required +provisionerConfigStartWithIdRequired = Error: Start with is required + # Add provisioner config breadcrumb on misc. page miscellaneousProvisionerConfigAddBreadcrumb = Add provisioner configuration miscellaneousProvisionerConfigEditBreadcrumb = Edit provisioner configuration diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleAttribute.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleAttribute.java index 00b580d5cac6..3bcbe48c7e52 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleAttribute.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleAttribute.java @@ -406,12 +406,22 @@ public Object getObjectValueAllowInvalid() { } + private boolean show; + + + public void setShow(boolean show) { + this.show = show; + } + /** * * @return if show */ public boolean isShow() { - + + if (this.show) { + return true; + } { Boolean showOverride = this.grouperConfigModule.showAttributeOverride(this.configSuffix); From 9aaf7e398885644600a9d7ec97cb8879933a3a85 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Thu, 5 May 2022 14:11:38 -0400 Subject: [PATCH 038/125] GRP-4026: ability for container to add ssl anchor cert for OS/java --- grouper/bin/gsh.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grouper/bin/gsh.sh b/grouper/bin/gsh.sh index e940f432ff53..a9028002e143 100755 --- a/grouper/bin/gsh.sh +++ b/grouper/bin/gsh.sh @@ -213,7 +213,7 @@ fi GSH=edu.internet2.middleware.grouper.app.gsh.GrouperShellWrapper -"${JAVA}" -Xms$MEM_START -Xmx$MEM_MAX -Dgrouper.home="$GROUPER_HOME/" -Dfile.encoding=utf-8 $GSH_JVMARGS -classpath "${GROUPER_CP}" $GSH "$@" +"${JAVA}" -Xms$MEM_START -Xmx$MEM_MAX -Dgrouper.home="$GROUPER_HOME/" -Dfile.encoding=utf-8 $GSH_JVMARGS $GROUPER_GSH_JVMARGS -classpath "${GROUPER_CP}" $GSH "$@" retVal=$? # handle return from either execution or bash source From 1a98f335f76f6099b6a14d88edbe9320fee2c172 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Wed, 11 May 2022 11:06:00 -0400 Subject: [PATCH 039/125] GRP-4033: support nvarchar in sql sync --- .../grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java index 9cbf103ad417..fe887ef106d8 100644 --- a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java +++ b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java @@ -352,6 +352,8 @@ public Object callback(ResultSet resultSet) throws Exception { case Types.CHAR: case Types.VARCHAR: case Types.LONGVARCHAR: + case Types.NCHAR: + case Types.NVARCHAR: gcTableSyncColumnMetadata.setColumnType(ColumnType.STRING); { From ad0290ad24a8e1e4a681e04c822ffb5c08031440 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Wed, 11 May 2022 11:11:09 -0400 Subject: [PATCH 040/125] GRP-4033: support nvarchar in sql sync --- .../grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java | 1 + 1 file changed, 1 insertion(+) diff --git a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java index fe887ef106d8..c0e7779ba681 100644 --- a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java +++ b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java @@ -354,6 +354,7 @@ public Object callback(ResultSet resultSet) throws Exception { case Types.LONGVARCHAR: case Types.NCHAR: case Types.NVARCHAR: + case Types.LONGNVARCHAR: gcTableSyncColumnMetadata.setColumnType(ColumnType.STRING); { From 8bc241e7d9d66db5ad50bb5651ed06073adf55a4 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Wed, 11 May 2022 11:20:15 -0400 Subject: [PATCH 041/125] GRP-4034: add bit and boolean to sql sync --- .../tableSync/GcTableSyncColumnMetadata.java | 24 +++++++++++++++++++ .../tableSync/GcTableSyncTableMetadata.java | 9 +++++++ 2 files changed, 33 insertions(+) diff --git a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncColumnMetadata.java b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncColumnMetadata.java index 6db0c4abe944..7fd4d531fc0e 100644 --- a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncColumnMetadata.java +++ b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncColumnMetadata.java @@ -101,6 +101,30 @@ public Object convertToType(Object input) { }, + /** + * + */ + BOOLEAN { + + @Override + public Object readDataFromResultSet(GcTableSyncColumnMetadata gcTableSyncColumnMetadata, ResultSet resultSet) throws SQLException { + return resultSet.getBoolean(gcTableSyncColumnMetadata.getColumnName()); + } + + /** + * convert to type + */ + @Override + public Object convertToType(Object input) { + + if (GrouperClientUtils.isBlank(input)) { + return null; + } + return GrouperClientUtils.booleanValue(input); + } + + }, + /** * */ diff --git a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java index c0e7779ba681..18e2fdca9676 100644 --- a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java +++ b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/tableSync/GcTableSyncTableMetadata.java @@ -349,6 +349,15 @@ public Object callback(ResultSet resultSet) throws Exception { } break; + case Types.BIT: + case Types.BOOLEAN: + + gcTableSyncColumnMetadata.setColumnType(ColumnType.BOOLEAN); + { + int columnDisplaySize = resultSetMetaData.getColumnDisplaySize(i+1); + gcTableSyncColumnMetadata.setColumnDisplaySize(columnDisplaySize); + } + break; case Types.CHAR: case Types.VARCHAR: case Types.LONGVARCHAR: From ba3a918822f2d6cd8cb4a1dd2a0e352cd1d5f96f Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Thu, 12 May 2022 01:45:47 -0400 Subject: [PATCH 042/125] GRP-4035: refactor entity search and matching attribute configuration --- .../grouperClient/jdbc/GcDbAccess.java | 4 +++ grouper/conf/grouper-loader.base.properties | 31 +++++++++++++++++++ .../grouper.textNg.en.us.base.properties | 31 +++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/GcDbAccess.java b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/GcDbAccess.java index 1cfbd64a1cbb..6a6e60db2cba 100644 --- a/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/GcDbAccess.java +++ b/grouper-misc/grouperClient/src/java/edu/internet2/middleware/grouperClient/jdbc/GcDbAccess.java @@ -2594,6 +2594,10 @@ private Object retrieveObjectFromResultSetByIndex(ResultSet resultSet, int colum // if we want to go down this path, need to check to see if has decimal and convert to long return bigDecimal; + case Types.BIT: + case Types.BOOLEAN: + return resultSet.getBoolean(columnNumberOneIndexed); + case Types.CHAR: case Types.VARCHAR: case Types.LONGVARCHAR: diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 64566f4dab00..79da3f2cf551 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2946,6 +2946,37 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "boolean", defaultValue: "true", order: 80220, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities)}"} # provisioner.genericProvisioner.entityMatchingAttributeSameAsSearchAttribute = +# how many entity matching attributes +# {valueType: "integer", required: true, order: 80222, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities)}", formElement: "dropdown", optionValues: ["1", "2", "3"] } +# provisioner.genericProvisioner.entityMatchingAttributeCount = + +# entity matching attribute 1 +# {valueType: "string", required: true, order: 80226, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && entityMatchingAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# provisioner.genericProvisioner.entityMatchingAttribute0name = + +# entity matching attribute 2 +# {valueType: "string", required: true, order: 80230, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && entityMatchingAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# provisioner.genericProvisioner.entityMatchingAttribute1name = + +# entity matching attribute 3 +# {valueType: "string", required: true, order: 80234, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && entityMatchingAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# provisioner.genericProvisioner.entityMatchingAttribute2name = + +# how many entity search attributes +# {valueType: "integer", required: true, order: 80250, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute}", formElement: "dropdown", optionValues: ["1", "2", "3"] } +# provisioner.genericProvisioner.entitySearchAttributeCount = + +# entity search attribute 1 +# {valueType: "string", required: true, order: 80254, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# provisioner.genericProvisioner.entitySearchAttribute0name = + +# entity search attribute 2 +# {valueType: "string", required: true, order: 80258, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# provisioner.genericProvisioner.entitySearchAttribute1name = + +# entity search attribute 3 +# {valueType: "string", required: true, order: 80262, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# provisioner.genericProvisioner.entitySearchAttribute2name = # Target entity link - has entityAttributeValueCache? diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index c4e16f32abaa..a24cc31bad79 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13282,6 +13282,37 @@ config.GenericConfiguration.subSection.entity2.title = Entity configuration sect config.GenericConfiguration.subSection.entity2.description = Entity configuration after attributes configured for memberships / groups / entities config.GenericConfiguration.subSection.entity2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those +config.GenericConfiguration.attribute..label = +config.GenericConfiguration.attribute..description = + +config.GenericConfiguration.attribute.entityMatchingAttributeSameAsSearchAttribute.label = Matching attribute(s) same as search attribute(s) +config.GenericConfiguration.attribute.entityMatchingAttributeSameAsSearchAttribute.description = Generally the attribute(s) used to match target entities with grouper entities are the same as search attribute(s). If you want to match on different attribute(s) than being searched for then set to false. + +config.GenericConfiguration.attribute.entityMatchingAttributeCount.label = Matching attribute count +config.GenericConfiguration.attribute.entityMatchingAttributeCount.description = Generally you will have one matching attribute though if you wanted a fallback if the primary attribute does not match you can configure multiple attributes. + +config.GenericConfiguration.attribute.entityMatchingAttribute0name.label = Matching attribute 1 +config.GenericConfiguration.attribute.entityMatchingAttribute0name.description = The first matching attribute used to match target entities with Grouper entities + +config.GenericConfiguration.attribute.entityMatchingAttribute1name.label = Matching attribute 2 +config.GenericConfiguration.attribute.entityMatchingAttribute1name.description = The second matching attribute used to match target entities with Grouper entities + +config.GenericConfiguration.attribute.entityMatchingAttribute2name.label = Matching attribute 3 +config.GenericConfiguration.attribute.entityMatchingAttribute2name.description = The third matching attribute used to match target entities with Grouper entities + +config.GenericConfiguration.attribute.entitySearchAttributeCount.label = Search attribute count +config.GenericConfiguration.attribute.entitySearchAttributeCount.description = Generally you will have one search attribute though if you wanted a fallback if the primary attribute does not find the entity in the target you can configure multiple attributes. + +config.GenericConfiguration.attribute.entitySearchAttribute0name.label = Search attribute 1 +config.GenericConfiguration.attribute.entitySearchAttribute0name.description = The first search attribute used to find target entities based on data in Grouper. + +config.GenericConfiguration.attribute.entitySearchAttribute1name.label = Search attribute 2 +config.GenericConfiguration.attribute.entitySearchAttribute1name.description = The second search attribute used to find target entities based on data in Grouper. If the entity is not found with the first attribute, this one will be used + +config.GenericConfiguration.attribute.entitySearchAttribute2name.label = Search attribute 3 +config.GenericConfiguration.attribute.entitySearchAttribute2name.description = The third search attribute used to find target entities based on data in Grouper. If the entity is not found with the first or second attribute, this one will be used + + config.GenericConfiguration.subSection.targetGroupAttribute.i.title = Target __i+1__ config.GenericConfiguration.subSection.targetGroupAttribute.i.description = Configuration for the group attribute From 840c2d2f2cd29b1a403c4d53ead10d6208f42ba7 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Thu, 12 May 2022 08:29:52 -0400 Subject: [PATCH 043/125] GRP-4036: refactor group search and matching attribute configuration --- grouper/conf/grouper-loader.base.properties | 47 +++++++++++++++++-- .../grouper.textNg.en.us.base.properties | 32 +++++++++++-- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 79da3f2cf551..add06bbd27c6 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2828,21 +2828,60 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.targetEntityAttribute.$i$.translateExpressionCreateOnly = # subject sources to provision -# {valueType: "string", required: true, order: 77000, multiple: true, formElement: "checkbox", checkboxValuesFromClass: "edu.internet2.middleware.grouper.SubjectFinder", subSection: "general2", showEl: "${operateOnGrouperEntities || operateOnGrouperMemberships}"} +# {valueType: "string", required: true, order: 76000, multiple: true, formElement: "checkbox", checkboxValuesFromClass: "edu.internet2.middleware.grouper.SubjectFinder", subSection: "general2", showEl: "${operateOnGrouperEntities || operateOnGrouperMemberships}"} # provisioner.genericProvisioner.subjectSourcesToProvision = # Advanced options, note, there might not be any -# {valueType: "boolean", order: 77500, defaultValue: "false", subSection: "membership2", showEl: "${operateOnGrouperMemberships}"} +# {valueType: "boolean", order: 76500, defaultValue: "false", subSection: "membership2", showEl: "${operateOnGrouperMemberships}"} # provisioner.genericProvisioner.membership2AdvancedOptions = # membership attribute name for groups -# {valueType: "string", required: true, order: 77900, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", required: true, order: 77000, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupMembershipAttributeName = # membership attribute value for groups -# {valueType: "string", required: true, order: 77910, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", required: true, order: 77010, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.genericProvisioner.groupMembershipAttributeValue = + +# generally the matching attribute(s) are the same as the search attributes, but they can be different +# {valueType: "boolean", defaultValue: "true", order: 77220, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups)}"} +# provisioner.genericProvisioner.groupMatchingAttributeSameAsSearchAttribute = + +# how many group matching attributes +# {valueType: "integer", required: true, order: 77222, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups)}", formElement: "dropdown", optionValues: ["1", "2", "3"] } +# provisioner.genericProvisioner.groupMatchingAttributeCount = + +# group matching attribute 1 +# {valueType: "string", required: true, order: 77226, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups) && groupMatchingAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions" } +# provisioner.genericProvisioner.groupMatchingAttribute0name = + +# group matching attribute 2 +# {valueType: "string", required: true, order: 77230, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups) && groupMatchingAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions" } +# provisioner.genericProvisioner.groupMatchingAttribute1name = + +# group matching attribute 3 +# {valueType: "string", required: true, order: 77234, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups) && groupMatchingAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions" } +# provisioner.genericProvisioner.groupMatchingAttribute2name = + +# how many group search attributes +# {valueType: "integer", required: true, order: 77250, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups) && !groupMatchingAttributeSameAsSearchAttribute}", formElement: "dropdown", optionValues: ["1", "2", "3"] } +# provisioner.genericProvisioner.groupSearchAttributeCount = + +# group search attribute 1 +# {valueType: "string", required: true, order: 77254, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups) && !groupMatchingAttributeSameAsSearchAttribute && groupSearchAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions" } +# provisioner.genericProvisioner.groupSearchAttribute0name = + +# group search attribute 2 +# {valueType: "string", required: true, order: 77258, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups) && !groupMatchingAttributeSameAsSearchAttribute && groupSearchAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions" } +# provisioner.genericProvisioner.groupSearchAttribute1name = + +# group search attribute 3 +# {valueType: "string", required: true, order: 77262, subSection: "group2", showEl: "${operateOnGrouperGroups && (!customizeGroupCrud || selectGroups || insertGroups || updateGroups || deleteGroups) && !groupMatchingAttributeSameAsSearchAttribute && groupSearchAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions" } +# provisioner.genericProvisioner.groupSearchAttribute2name = + + + # Target group link - has groupAttributeValueCache? # {valueType: "boolean", defaultValue: "false", subSection: "group2", showEl: "${operateOnGrouperGroups}", order: 78001} # provisioner.genericProvisioner.groupAttributeValueCacheHas = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index a24cc31bad79..7e68d7d41350 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13271,6 +13271,35 @@ config.GenericConfiguration.subSection.group2.title = Group configuration sectio config.GenericConfiguration.subSection.group2.description = Group configuration after attributes configured for memberships / groups / entities config.GenericConfiguration.subSection.group2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those + +config.GenericConfiguration.attribute.groupMatchingAttributeSameAsSearchAttribute.label = Matching attribute(s) same as search attribute(s) +config.GenericConfiguration.attribute.groupMatchingAttributeSameAsSearchAttribute.description = Generally the attribute(s) used to match target groups with grouper groups are the same as search attribute(s). If you want to match on different attribute(s) than being searched for then set to false. + +config.GenericConfiguration.attribute.groupMatchingAttributeCount.label = Matching attribute count +config.GenericConfiguration.attribute.groupMatchingAttributeCount.description = Generally you will have one matching attribute though if you wanted a fallback if the primary attribute does not match you can configure multiple attributes. + +config.GenericConfiguration.attribute.groupMatchingAttribute0name.label = Matching attribute 1 +config.GenericConfiguration.attribute.groupMatchingAttribute0name.description = The first matching attribute used to match target groups with Grouper groups + +config.GenericConfiguration.attribute.groupMatchingAttribute1name.label = Matching attribute 2 +config.GenericConfiguration.attribute.groupMatchingAttribute1name.description = The second matching attribute used to match target groups with Grouper groups + +config.GenericConfiguration.attribute.groupMatchingAttribute2name.label = Matching attribute 3 +config.GenericConfiguration.attribute.groupMatchingAttribute2name.description = The third matching attribute used to match target groups with Grouper groups + +config.GenericConfiguration.attribute.groupSearchAttributeCount.label = Search attribute count +config.GenericConfiguration.attribute.groupSearchAttributeCount.description = Generally you will have one search attribute though if you wanted a fallback if the primary attribute does not find the group in the target you can configure multiple attributes. + +config.GenericConfiguration.attribute.groupSearchAttribute0name.label = Search attribute 1 +config.GenericConfiguration.attribute.groupSearchAttribute0name.description = The first search attribute used to find target groups based on data in Grouper. + +config.GenericConfiguration.attribute.groupSearchAttribute1name.label = Search attribute 2 +config.GenericConfiguration.attribute.groupSearchAttribute1name.description = The second search attribute used to find target groups based on data in Grouper. If the group is not found with the first attribute, this one will be used + +config.GenericConfiguration.attribute.groupSearchAttribute2name.label = Search attribute 3 +config.GenericConfiguration.attribute.groupSearchAttribute2name.description = The third search attribute used to find target groups based on data in Grouper. If the group is not found with the first or second attribute, this one will be used + + config.GenericConfiguration.attribute.group2advanced.label = Advanced options config.GenericConfiguration.attribute.group2advanced.description = Advanced options for group section 2 @@ -13282,9 +13311,6 @@ config.GenericConfiguration.subSection.entity2.title = Entity configuration sect config.GenericConfiguration.subSection.entity2.description = Entity configuration after attributes configured for memberships / groups / entities config.GenericConfiguration.subSection.entity2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those -config.GenericConfiguration.attribute..label = -config.GenericConfiguration.attribute..description = - config.GenericConfiguration.attribute.entityMatchingAttributeSameAsSearchAttribute.label = Matching attribute(s) same as search attribute(s) config.GenericConfiguration.attribute.entityMatchingAttributeSameAsSearchAttribute.description = Generally the attribute(s) used to match target entities with grouper entities are the same as search attribute(s). If you want to match on different attribute(s) than being searched for then set to false. From c45bf86282adb6fe48e2268853843d3a3d00dafc Mon Sep 17 00:00:00 2001 From: Shilen Patel Date: Fri, 13 May 2022 08:32:39 -0400 Subject: [PATCH 044/125] GRP-4037: Recent memberships UI issue with include current members option --- .../grouper/grouperUi/serviceLogic/UiV2GrouperLoader.java | 6 +++++- .../WEB-INF/grouperUi2/group/grouperLoaderGroupTab.jsp | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2GrouperLoader.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2GrouperLoader.java index 69abc0d85c66..ad7de428892d 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2GrouperLoader.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2GrouperLoader.java @@ -1757,7 +1757,11 @@ public void editGrouperLoader(HttpServletRequest request, HttpServletResponse re grouperLoaderContainer.setEditLoaderRecentGroupUuidFrom(grouperLoaderContainer.getRecentGroupUuidFrom()); grouperLoaderContainer.setEditLoaderRecentDays(grouperLoaderContainer.getRecentDays()); - grouperLoaderContainer.setEditLoaderRecentIncludeCurrent(grouperLoaderContainer.getEditLoaderRecentIncludeCurrent()); + if (GrouperUtil.booleanValue(grouperLoaderContainer.getRecentIncludeCurrent(), true)) { + grouperLoaderContainer.setEditLoaderRecentIncludeCurrent("true"); + } else { + grouperLoaderContainer.setEditLoaderRecentIncludeCurrent("false"); + } } else if (StringUtils.equals("JEXL_SCRIPT", grouperLoaderContainer.getEditLoaderType())) { diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/group/grouperLoaderGroupTab.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/group/grouperLoaderGroupTab.jsp index 613e84b1fb81..232ea27248f3 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/group/grouperLoaderGroupTab.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/group/grouperLoaderGroupTab.jsp @@ -386,14 +386,14 @@
    From ed33b96600a6aa74599383ebe466a51f854ff032 Mon Sep 17 00:00:00 2001 From: Chad Redman Date: Sat, 14 May 2022 17:53:04 -0400 Subject: [PATCH 045/125] GRP-4024: Application and policy templates through the API gives error --- .../grouperUi/beans/ui/GrouperTemplatePolicyGroupLogic.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GrouperTemplatePolicyGroupLogic.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GrouperTemplatePolicyGroupLogic.java index eee62b79dc19..a64ff3755c33 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GrouperTemplatePolicyGroupLogic.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GrouperTemplatePolicyGroupLogic.java @@ -262,9 +262,9 @@ public List getServiceActions() { String baseGroupFriendlyName = templateContainer.getTemplateFriendlyName(); // GRP-3559: Refactor UI templates to not depend on the UI - // Mystery how this works. Adding an EL variable stemTemplateContainer makes ${grouperRequestContainer.stemTemplateContainer} - // evaluate to stemTemplateContainer, even when grouperRequestContainer is null - GrouperTextContainer.assignThreadLocalVariable("stemTemplateContainer", templateContainer); + // Mystery how this works. Adding an EL variable groupStemTemplateContainer makes ${grouperRequestContainer.groupStemTemplateContainer} + // evaluate to groupStemTemplateContainer, even when grouperRequestContainer is null + GrouperTextContainer.assignThreadLocalVariable("groupStemTemplateContainer", templateContainer); if (StringUtils.isBlank(baseGroupFriendlyName)) { baseGroupFriendlyName = baseGroup; From e901c31e6d36d90f2e391aa2d98514eb5dbc4d4e Mon Sep 17 00:00:00 2001 From: Chad Redman Date: Sat, 14 May 2022 20:48:36 -0400 Subject: [PATCH 046/125] GRP-3694: GroupFinder/StemFinder with assignScope also finds alternate names, needs option to exclude --- .../middleware/grouper/GroupFinder.java | 17 ++- .../middleware/grouper/StemFinder.java | 21 ++- .../grouper/internal/dao/GroupDAO.java | 43 +++++- .../grouper/internal/dao/StemDAO.java | 39 ++++- .../internal/dao/hib3/Hib3GroupDAO.java | 96 +++++++++---- .../internal/dao/hib3/Hib3StemDAO.java | 134 ++++++++++++------ .../middleware/grouper/TestStemFinder.java | 28 +++- .../grouper/group/TestGroupFinder.java | 28 +++- 8 files changed, 324 insertions(+), 82 deletions(-) diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/GroupFinder.java b/grouper/src/grouper/edu/internet2/middleware/grouper/GroupFinder.java index 2a1c94fb2f7a..205af528edee 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/GroupFinder.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/GroupFinder.java @@ -1303,7 +1303,7 @@ public Set findGroups() { this.subjectNotInGroup, this.groupIds, this.groupNames, this.compositeOwner, this.attributeDefNameId, this.attributeValue, this.attributeValuesOnAssignment, this.attributeCheckReadOnAttributeDef, this.attributeDefNameId2, this.attributeValue2, - this.attributeValuesOnAssignment2, this.attributeNotAssigned); + this.attributeValuesOnAssignment2, this.attributeNotAssigned, this.excludeAlternateNames); } @@ -1427,6 +1427,11 @@ public GroupFinder assignStemScope(Scope theStemScope) { */ private Set attributeValuesOnAssignment2; + /** + * whether to exclude alternate names from name/scope search + */ + private boolean excludeAlternateNames = false; + /** * if we are looking up a group, only look by uuid or name * @param theFindByUuidOrName @@ -1509,5 +1514,15 @@ public GroupFinder assignAttributeValuesOnAssignment2(Set theValues) { return this; } + /** + * whether to exclude alternate names from name/scope search + * @param excludeAlternateNames + * @return + */ + public GroupFinder assignExcludeAlternateNames(boolean excludeAlternateNames) { + this.excludeAlternateNames = excludeAlternateNames; + return this; + } + } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/StemFinder.java b/grouper/src/grouper/edu/internet2/middleware/grouper/StemFinder.java index e2eec41bcfe9..a4ab2767bc8b 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/StemFinder.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/StemFinder.java @@ -747,12 +747,17 @@ public StemFinder assignFindByUuidOrName(boolean theFindByUuidOrName) { * find groups with this value */ private Object attributeValue2; - + /** * find stems that don't have a certain type assigned */ private boolean attributeNotAssigned = false; - + + /** + * whether to exclude alternate names from name/scope search + */ + private boolean excludeAlternateNames = false; + /** * find stems that don't have a certain type assigned * @param attributeNotAssigned @@ -763,6 +768,16 @@ public StemFinder assignAttributeNotAssigned(boolean attributeNotAssigned) { return this; } + /** + * whether to exclude alternate names from name/scope search + * @param excludeAlternateNames + * @return + */ + public StemFinder assignExcludeAlternateNames(boolean excludeAlternateNames) { + this.excludeAlternateNames = excludeAlternateNames; + return this; + } + /** * config key for caching */ @@ -903,7 +918,7 @@ public Set findStems() { this.attributeDefNameId, this.attributeValue, this.attributeCheckReadOnAttributeDef, this.attributeValuesOnAssignment, this.attributeDefNameId2, this.attributeValue2, this.attributeValuesOnAssignment2, - this.attributeNotAssigned); + this.attributeNotAssigned, this.excludeAlternateNames); for (Stem stem : GrouperUtil.nonNull(stems)) { stemFlashCacheAddIfSupposedTo(stem); diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/GroupDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/GroupDAO.java index deeed590422a..fbe66e2331e9 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/GroupDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/GroupDAO.java @@ -1055,8 +1055,47 @@ public Set getAllGroupsSecure(String scope, GrouperSession grouperSession Collection groupNames, Boolean compositeOwner, String idOfAttributeDefName, Object attributeValue, Set attributeValuesOnAssignment, Boolean attributeCheckReadOnAttributeDef , String idOfAttributeDefName2, Object attributeValue2, Set attributeValuesOnAssignment2, - boolean attributeNotAssigned); - + boolean attributeNotAssigned); + + /** + * + * @param scope + * @param grouperSession + * @param subject + * @param privileges + * @param queryOptions + * @param typeOfGroup or null for all + * @param splitScope + * @param membershipSubject + * @param field + * @param parentStemId + * @param stemScope + * @param findByUuidOrName + * @param subjectNotInGroup is a subject which does not have a membership in the group + * @param groupIds are the group ids to search for + * @param groupNames are the group names to search for + * @param compositeOwner if we are filtering for groups which are or are not composite owners + * @param idOfAttributeDefName if looking for groups that have this attribute def name + * @param attributeValue if looking for groups that have this attribute value on the attribute def name + * @param attributeValuesOnAssignment if looking for an attribute value on an assignment, could be multiple values + * @param attributeCheckReadOnAttributeDef use security around attribute def? default is true + * @param idOfAttributeDefName2 if looking for groups that have this attribute def name2 + * @param attributeValue2 if looking for groups that have this attribute value2 on the attribute def name2 + * @param attributeValuesOnAssignment2 if looking for an attribute value on an assignment2, could be multiple values + * @param attributeNotAssigned + * @param excludeAlternateNames whether to exclude alternate names from name/scope search + * @return + */ + public Set getAllGroupsSecure(String scope, GrouperSession grouperSession, + Subject subject, Set privileges, QueryOptions queryOptions, + Set typeOfGroup, boolean splitScope, + Subject membershipSubject, Field field, String parentStemId, Scope stemScope, + boolean findByUuidOrName, Subject subjectNotInGroup, Collection groupIds, + Collection groupNames, Boolean compositeOwner, String idOfAttributeDefName, Object attributeValue, + Set attributeValuesOnAssignment, Boolean attributeCheckReadOnAttributeDef + , String idOfAttributeDefName2, Object attributeValue2, Set attributeValuesOnAssignment2, + boolean attributeNotAssigned, boolean excludeAlternateNames); + /** * find by uuid secure * @param uuids diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/StemDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/StemDAO.java index 27b9bff584a2..13a754fa2faf 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/StemDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/StemDAO.java @@ -642,7 +642,44 @@ Set getAllStemsSecure(String scope, GrouperSession grouperSession, Set attributeValuesOnAssignment, String idOfAttributeDefName2, Object attributeValue2, Set attributeValuesOnAssignment2, boolean attributeNotAssigned) throws GrouperDAOException; - + + /** + * + * @param scope is blank for no scope + * @param grouperSession + * @param subject + * @param queryOptions + * @param inPrivSet means that each row must have a matching priv in this set to user or GrouperAll. + * There are some constants in NamingPrivilege of pre-canned sets + * @param splitScope true to split scopes by whitespace + * @param parentStemId true if filtering by parent of ancestor + * @param stemScope ONE or SUB + * @param findByUuidOrName if we are looking up a stem, only look by uuid or name + * @param userHasInGroupFields find stems where the user has these fields in a group + * @param userHasInAttributeFields find stems where the user has these fields in an attribute + * @param stemIds + * @param idOfAttributeDefName if looking for groups that have this attribute def name + * @param attributeValue if looking for groups that have this attribute value on the attribute def name + * @param attributeCheckReadOnAttributeDef if check read on attribute for attribute on stem + * @param attributeValuesOnAssignment if looking for an attribute value on an assignment, could be multiple values + * @param idOfAttributeDefName2 if looking for groups that have this attribute def name2 + * @param attributeValue2 if looking for groups that have this attribute value2 on the attribute def name2 + * @param attributeValuesOnAssignment2 if looking for an attribute value on an assignment2, could be multiple values + * @param attributeNotAssigned find stems that don't have the given type assigned + * @param excludeAlternateNames whether to exclude alternate names from name or scope search + * @return the stems + * @throws GrouperDAOException + * @since v2.4.0 + */ + Set getAllStemsSecure(String scope, GrouperSession grouperSession, + Subject subject, Set inPrivSet, QueryOptions queryOptions, + boolean splitScope, String parentStemId, Scope stemScope, boolean findByUuidOrName, + Collection userHasInGroupFields, Collection userHasInAttributeFields, + Collection stemIds, String idOfAttributeDefName, Object attributeValue, + Boolean attributeCheckReadOnAttributeDef, + Set attributeValuesOnAssignment, String idOfAttributeDefName2, Object attributeValue2, + Set attributeValuesOnAssignment2, boolean attributeNotAssigned, boolean excludeAlternateNames) + throws GrouperDAOException; diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GroupDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GroupDAO.java index 851b0e7b63f3..2c25e1e70a35 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GroupDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3GroupDAO.java @@ -2978,7 +2978,7 @@ public Set getAllGroupsSplitScopeSecure(String scope, Set typeOfGroups = typeOfGroup == null ? null : GrouperUtil.toSet(typeOfGroup); return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, true, typeOfGroups, null, null, null, null, false, null, null, null, null, null, null, - null, null, null, null, null, false); + null, null, null, null, null, false, false); } /** @@ -2990,7 +2990,7 @@ public Set getAllGroupsSplitScopeSecure(String scope, QueryOptions queryOptions, Set typeOfGroups) { return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, true, typeOfGroups, null, null, null, null, false, null, null, null, null, null, null, null, - null, null, null, null, false); + null, null, null, null, false, false); } /** @@ -3018,6 +3018,7 @@ public Set getAllGroupsSplitScopeSecure(String scope, * @param attributeValue2 * @param attributeValuesOnAssignment2 * @param attributeNotAssigned + * @param excludeAlternateNames * @return groups * */ @@ -3028,7 +3029,7 @@ private Set findAllGroupsSecureHelper(String scope, Collection totalGroupIds, Collection totalGroupNames, Boolean compositeOwner, final String idOfAttributeDefName, Object attributeValue, Set attributeValuesOnAssignment, Boolean attributeCheckReadOnAttributeDef, final String idOfAttributeDefName2, Object attributeValue2, - Set attributeValuesOnAssignment2, boolean attributeNotAssigned) { + Set attributeValuesOnAssignment2, boolean attributeNotAssigned, boolean excludeAlternateNames) { if ((attributeValue != null || GrouperUtil.length(attributeValuesOnAssignment) > 0) && StringUtils.isBlank(idOfAttributeDefName)) { throw new RuntimeException("If you are searching by attributeValue then you must specify an attribute definition name"); @@ -3313,10 +3314,14 @@ private Set findAllGroupsSecureHelper(String scope, whereClause.append(" ( theGroup.nameDb in ( "); whereClause.append(HibUtils.convertToInClause(groupNames, byHqlStatic)); - whereClause.append(") or theGroup.alternateNameDb in ( "); - whereClause.append(HibUtils.convertToInClause(groupNames, byHqlStatic)); + + if (!excludeAlternateNames){ + whereClause.append(") or theGroup.alternateNameDb in ( "); + whereClause.append(HibUtils.convertToInClause(groupNames, byHqlStatic)); + } + whereClause.append(" ) "); - + //if entities, then also allow entity identifier if (typeOfGroups != null && typeOfGroups.contains(TypeOfGroup.entity)) { @@ -3397,7 +3402,7 @@ private Set findAllGroupsSecureHelper(String scope, //see if there is a scope if (!StringUtils.isBlank(scope)) { - scope = assignFilterToQuery(scope, splitScope, whereClause, byHqlStatic, findByUuidOrName, "theGroup", false); + scope = assignFilterToQuery(scope, splitScope, whereClause, byHqlStatic, findByUuidOrName, "theGroup", false, excludeAlternateNames); //if entities, then also allow entity identifier if (typeOfGroups != null && typeOfGroups.contains(TypeOfGroup.entity)) { @@ -3509,9 +3514,11 @@ private Set findAllGroupsSecureHelper(String scope, } //get the one with alternate name - for (Group group : overallResults) { - if (StringUtils.equals(scope, group.getAlternateName())) { - return GrouperUtil.toSet(group); + if (!excludeAlternateNames) { + for (Group group : overallResults) { + if (StringUtils.equals(scope, group.getAlternateName())) { + return GrouperUtil.toSet(group); + } } } @@ -3523,17 +3530,22 @@ private Set findAllGroupsSecureHelper(String scope, } - /** - * @param byHqlStatic - * @param filter - * @param splitScope default true - * @param whereClause - * @param findByUuidOrName generally this is false - * @param alias e.g. theGroup whatever alias in hql query - * @param addFinalParen - * @return scope lowercased - */ public static String assignFilterToQuery(String filter, Boolean splitScope, StringBuilder whereClause, ByHqlStatic byHqlStatic, boolean findByUuidOrName, String alias, boolean addFinalParen) { + return assignFilterToQuery(filter, splitScope, whereClause, byHqlStatic, findByUuidOrName, alias, addFinalParen, false); + } + + /** + * @param byHqlStatic + * @param filter + * @param splitScope default true + * @param whereClause + * @param findByUuidOrName generally this is false + * @param alias e.g. theGroup whatever alias in hql query + * @param addFinalParen + * @return scope lowercased + */ + public static String assignFilterToQuery(String filter, Boolean splitScope, StringBuilder whereClause, + ByHqlStatic byHqlStatic, boolean findByUuidOrName, String alias, boolean addFinalParen, boolean excludeAlternateNames) { // default scplitScope to true splitScope = GrouperUtil.booleanValue(splitScope, true); @@ -3562,13 +3574,18 @@ public static String assignFilterToQuery(String filter, Boolean splitScope, Stri } if (findByUuidOrName) { - whereClause.append(" " + alias + ".nameDb = :scope" + index + " or " + alias + ".alternateNameDb = :scope" + index - + " or " + alias + ".displayNameDb = :scope" + index + " "); + whereClause.append(" " + alias + ".nameDb = :scope" + index); + if (!excludeAlternateNames) { + whereClause.append(" or " + alias + ".alternateNameDb = :scope" + index); + } + whereClause.append(" or " + alias + ".displayNameDb = :scope" + index + " "); byHqlStatic.setString("scope" + index, theScope); } else { - whereClause.append(" ( lower(" + alias + ".nameDb) like :scope" + index - + " or lower(" + alias + ".alternateNameDb) like :scope" + index - + " or lower(" + alias + ".displayNameDb) like :scope" + index + whereClause.append(" ( lower(" + alias + ".nameDb) like :scope" + index); + if (!excludeAlternateNames) { + whereClause.append(" or lower(" + alias + ".alternateNameDb) like :scope" + index); + } + whereClause.append(" or lower(" + alias + ".displayNameDb) like :scope" + index + " or lower(" + alias + ".descriptionDb) like :scope" + index + " ) "); if (splitScope) { theScope = "%" + theScope + "%"; @@ -3950,7 +3967,7 @@ public Set getAllGroupsSecure(String scope, GrouperSession grouperSession Set typeOfGroups, boolean splitScope, Subject membershipSubject, Field field) { return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, splitScope, typeOfGroups, membershipSubject, field, null, null, false, null, null, null, null, null, null, - null, null, null, null, null, false); + null, null, null, null, null, false, false); } /** @@ -3966,7 +3983,7 @@ public Set getAllGroupsSecure(String scope, GrouperSession grouperSession return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, splitScope, typeOfGroups, membershipSubject, field, parentStemId, stemScope, findByUuidOrName, subjectNotInGroup, groupIds, groupNames, compositeOwner, null, null, null, null, - null, null, null, false); + null, null, null, false, false); } /** @@ -3982,7 +3999,7 @@ public Set getAllGroupsSecure(String scope, GrouperSession grouperSession return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, splitScope, typeOfGroups, membershipSubject, field, parentStemId, stemScope, findByUuidOrName, subjectNotInGroup, groupIds, groupNames, compositeOwner, idOfAttributeDefName, - attributeValue, null, null, null, null, null, false); + attributeValue, null, null, null, null, null, false, false); } /** @@ -3999,7 +4016,7 @@ public Set getAllGroupsSecure(String scope, GrouperSession grouperSession return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, splitScope, typeOfGroup, membershipSubject, field, parentStemId, stemScope, findByUuidOrName, subjectNotInGroup, groupIds, groupNames, compositeOwner, idOfAttributeDefName, - attributeValue, attributeValuesOnAssignment, attributeCheckReadOnAttributeDef, null, null, null, false); + attributeValue, attributeValuesOnAssignment, attributeCheckReadOnAttributeDef, null, null, null, false, false); } /** @@ -4099,6 +4116,22 @@ public Set findGroupsInStemWithPrivilege(GrouperSession grouperSession, } + public Set getAllGroupsSecure(String scope, GrouperSession grouperSession, + Subject subject, Set privileges, QueryOptions queryOptions, + Set typeOfGroup, boolean splitScope, + Subject membershipSubject, Field field, String parentStemId, Scope stemScope, + boolean findByUuidOrName, Subject subjectNotInGroup, Collection groupIds, + Collection groupNames, Boolean compositeOwner, String idOfAttributeDefName, Object attributeValue, + Set attributeValuesOnAssignment, Boolean attributeCheckReadOnAttributeDef + , String idOfAttributeDefName2, Object attributeValue2, Set attributeValuesOnAssignment2, + boolean attributeNotAssigned) { + return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, + splitScope, typeOfGroup, membershipSubject, field, parentStemId, stemScope, + findByUuidOrName, subjectNotInGroup, groupIds, groupNames, compositeOwner, idOfAttributeDefName, + attributeValue, attributeValuesOnAssignment, attributeCheckReadOnAttributeDef, + idOfAttributeDefName2,attributeValue2, attributeValuesOnAssignment2, attributeNotAssigned, + false); + } /** * @see GroupDAO#getAllGroupsSecure(String, GrouperSession, Subject, Set, QueryOptions, Set, boolean, Subject, Field, String, Scope, boolean, Subject, Collection, Collection, Boolean, String, Object, Set, Boolean, String, Object) */ @@ -4111,12 +4144,13 @@ public Set getAllGroupsSecure(String scope, GrouperSession grouperSession Collection groupNames, Boolean compositeOwner, String idOfAttributeDefName, Object attributeValue, Set attributeValuesOnAssignment, Boolean attributeCheckReadOnAttributeDef, String idOfAttributeDefName2, - Object attributeValue2, Set attributeValuesOnAssignment2, boolean attributeNotAssigned) { + Object attributeValue2, Set attributeValuesOnAssignment2, boolean attributeNotAssigned, boolean excludeAlternateNames) { return findAllGroupsSecureHelper(scope, grouperSession, subject, privileges, queryOptions, splitScope, typeOfGroup, membershipSubject, field, parentStemId, stemScope, findByUuidOrName, subjectNotInGroup, groupIds, groupNames, compositeOwner, idOfAttributeDefName, attributeValue, attributeValuesOnAssignment, attributeCheckReadOnAttributeDef, - idOfAttributeDefName2,attributeValue2, attributeValuesOnAssignment2, attributeNotAssigned); + idOfAttributeDefName2,attributeValue2, attributeValuesOnAssignment2, attributeNotAssigned, + excludeAlternateNames); } /** diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3StemDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3StemDAO.java index 44160d2d04f2..2238c23a4c7e 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3StemDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3StemDAO.java @@ -1415,33 +1415,47 @@ public Set getAllStemsSecure(String scope, GrouperSession grouperSession, Subject subject, Set inPrivSet, QueryOptions queryOptions) throws GrouperDAOException { return getAllStemsSecureHelper(scope, grouperSession, subject, inPrivSet, - queryOptions, false, null, null, false, null, null, null, null, null, null, null, null, null, null, false); + queryOptions, false, null, null, false, null, null, null, null, null, null, null, null, null, null, false, false); } - /** - * @param scope - * @param grouperSession - * @param subject - * @param inPrivSet - * @param queryOptions - * @param splitScope - * @param parentStemId - * @param stemScope - * @param findByUuidOrName if we are looking by uuid or name - * @param userHasInGroupFields find stems where the user has these fields in a group - * @param userHasInAttributeFields find stems where the user has these fields in an attribute - * @param totalStemIds - * @param idOfAttributeDefName - * @param attributeValue - * @param attributeCheckReadOnAttributeDef - * @param attributeValuesOnAssignment - * @param idOfAttributeDefName2 - * @param attributeValue2 - * @param attributeValuesOnAssignment2 - * @param attributeNotAssigned - * @return the matching stems - * @throws GrouperDAOException - */ + private Set getAllStemsSecureHelper(String scope, + GrouperSession grouperSession, Subject subject, Set inPrivSet, + QueryOptions queryOptions, boolean splitScope, + String parentStemId, Scope stemScope, boolean findByUuidOrName, + Collection userHasInGroupFields, Collection userHasInAttributeFields, + Collection totalStemIds, String idOfAttributeDefName, Object attributeValue, + Boolean attributeCheckReadOnAttributeDef, Set attributeValuesOnAssignment, String idOfAttributeDefName2, Object attributeValue2, + Set attributeValuesOnAssignment2, boolean attributeNotAssigned) throws GrouperDAOException { + return getAllStemsSecureHelper(scope, grouperSession, subject, inPrivSet, + queryOptions, splitScope, parentStemId, stemScope, findByUuidOrName, userHasInGroupFields, userHasInAttributeFields, + totalStemIds, idOfAttributeDefName, attributeValue, attributeCheckReadOnAttributeDef, attributeValuesOnAssignment, idOfAttributeDefName2, attributeValue2, attributeValuesOnAssignment2, attributeNotAssigned, false); + } + + /** + * @param scope + * @param grouperSession + * @param subject + * @param inPrivSet + * @param queryOptions + * @param splitScope + * @param parentStemId + * @param stemScope + * @param findByUuidOrName if we are looking by uuid or name + * @param userHasInGroupFields find stems where the user has these fields in a group + * @param userHasInAttributeFields find stems where the user has these fields in an attribute + * @param totalStemIds + * @param idOfAttributeDefName + * @param attributeValue + * @param attributeCheckReadOnAttributeDef + * @param attributeValuesOnAssignment + * @param idOfAttributeDefName2 + * @param attributeValue2 + * @param attributeValuesOnAssignment2 + * @param attributeNotAssigned + * @param excludeAlternateNames + * @return the matching stems + * @throws GrouperDAOException + */ private Set getAllStemsSecureHelper(String scope, GrouperSession grouperSession, Subject subject, Set inPrivSet, QueryOptions queryOptions, boolean splitScope, @@ -1449,7 +1463,7 @@ private Set getAllStemsSecureHelper(String scope, Collection userHasInGroupFields, Collection userHasInAttributeFields, Collection totalStemIds, String idOfAttributeDefName, Object attributeValue, Boolean attributeCheckReadOnAttributeDef, Set attributeValuesOnAssignment, String idOfAttributeDefName2, Object attributeValue2, - Set attributeValuesOnAssignment2, boolean attributeNotAssigned) + Set attributeValuesOnAssignment2, boolean attributeNotAssigned, boolean excludeAlternateNames) throws GrouperDAOException { long startMillis = System.currentTimeMillis(); @@ -1559,9 +1573,8 @@ private Set getAllStemsSecureHelper(String scope, whereClause.append(" where "); } - scope = assignFilterToQuery(scope, splitScope, whereClause, byHqlStatic, findByUuidOrName, "ns"); - - + scope = assignFilterToQuery(scope, splitScope, whereClause, byHqlStatic, findByUuidOrName, excludeAlternateNames, "ns"); + sql.append(whereClause); changedQuery = true; } @@ -1878,9 +1891,11 @@ private Set getAllStemsSecureHelper(String scope, } //get the one with alternate name - for (Stem stem : overallResults) { - if (StringUtils.equals(scope, stem.getAlternateName())) { - return GrouperUtil.toSet(stem); + if (!excludeAlternateNames) { + for (Stem stem : overallResults) { + if (StringUtils.equals(scope, stem.getAlternateName())) { + return GrouperUtil.toSet(stem); + } } } @@ -1913,6 +1928,20 @@ private Set getAllStemsSecureHelper(String scope, * @return scope lowercased */ public static String assignFilterToQuery(String scope, Boolean splitScope, StringBuilder whereClause, ByHqlStatic byHqlStatic, boolean findByUuidOrName, String alias) { + return assignFilterToQuery(scope, splitScope, whereClause, byHqlStatic, findByUuidOrName, false, alias); + } + + /** + * @param byHqlStatic + * @param scope + * @param splitScope default true + * @param whereClause + * @param findByUuidOrName generally this is false + * @param excludeAlternateNames whether to exclude alternate names when using scope or splitScope + * @param alias e.g. theGroup whatever alias in hql query + * @return scope lowercased + */ + public static String assignFilterToQuery(String scope, Boolean splitScope, StringBuilder whereClause, ByHqlStatic byHqlStatic, boolean findByUuidOrName, boolean excludeAlternateNames, String alias) { // default scplitScope to true splitScope = GrouperUtil.booleanValue(splitScope, true); @@ -1938,13 +1967,18 @@ public static String assignFilterToQuery(String scope, Boolean splitScope, Strin } if (findByUuidOrName) { - whereClause.append(" " + alias + ".nameDb = :scope" + index + " or " + alias + ".alternateNameDb = :scope" + index - + " or " + alias + ".displayNameDb = :scope" + index + " "); + whereClause.append(" " + alias + ".nameDb = :scope" + index); + if (!excludeAlternateNames) { + whereClause.append(" or " + alias + ".alternateNameDb = :scope" + index); + } + whereClause.append(" or " + alias + ".displayNameDb = :scope" + index + " "); byHqlStatic.setString("scope" + index, theScope); } else { - whereClause.append(" ( lower(" + alias + ".nameDb) like :scope" + index - + " or lower(" + alias + ".alternateNameDb) like :scope" + index - + " or lower(" + alias + ".displayNameDb) like :scope" + index + whereClause.append(" ( lower(" + alias + ".nameDb) like :scope" + index); + if (!excludeAlternateNames) { + whereClause.append(" or lower(" + alias + ".alternateNameDb) like :scope" + index); + } + whereClause.append(" or lower(" + alias + ".displayNameDb) like :scope" + index + " or lower(" + alias + ".descriptionDb) like :scope" + index + " ) "); if (splitScope) { theScope = "%" + theScope + "%"; @@ -2516,7 +2550,7 @@ public Set getAllStemsSplitScopeSecure(String scope, GrouperSession grouperSession, Subject subject, Set privileges, QueryOptions queryOptions) { return this.getAllStemsSecureHelper(scope, grouperSession, subject, privileges, - queryOptions, true, null, null, false, null, null, null, null, null, null, null, null, null, null, false); + queryOptions, true, null, null, false, null, null, null, null, null, null, null, null, null, null, false, false); } /** @@ -2600,7 +2634,7 @@ public Set getAllStemsSecure(String scope, GrouperSession grouperSession, throws GrouperDAOException { return getAllStemsSecureHelper(scope, grouperSession, subject, inPrivSet, queryOptions, splitScope, parentStemId, stemScope, findByUuidOrName, userHasInGroupFields, userHasInAttributeFields, - totalStemIds, null, null, null, null, null, null, null, false); + totalStemIds, null, null, null, null, null, null, null, false, false); } /** @@ -2615,7 +2649,7 @@ public Set getAllStemsSecure(String scope, GrouperSession grouperSession, throws GrouperDAOException { return getAllStemsSecureHelper(scope, grouperSession, subject, inPrivSet, queryOptions, splitScope, parentStemId, stemScope, findByUuidOrName, userHasInGroupFields, userHasInAttributeFields, - totalStemIds, idOfAttributeDefName, attributeValue, attributeCheckReadOnAttributeDef, null, null, null, null, false); + totalStemIds, idOfAttributeDefName, attributeValue, attributeCheckReadOnAttributeDef, null, null, null, null, false, false); } @Override @@ -2627,7 +2661,7 @@ public Set getAllStemsSecure(String scope, GrouperSession grouperSession, Boolean attributeCheckReadOnAttributeDef, Set attributeValuesOnAssignment) throws GrouperDAOException { return getAllStemsSecureHelper(scope, grouperSession, subject, inPrivSet, queryOptions, splitScope, parentStemId, stemScope, findByUuidOrName, userHasInGroupFields, userHasInAttributeFields, - stemIds, idOfAttributeDefName, attributeValue, attributeCheckReadOnAttributeDef, attributeValuesOnAssignment, null, null, null, false); + stemIds, idOfAttributeDefName, attributeValue, attributeCheckReadOnAttributeDef, attributeValuesOnAssignment, null, null, null, false, false); } @@ -2646,7 +2680,23 @@ public Set getAllStemsSecure(String scope, GrouperSession grouperSession, splitScope, parentStemId, stemScope, findByUuidOrName, userHasInGroupFields, userHasInAttributeFields, stemIds, idOfAttributeDefName, attributeValue, attributeCheckReadOnAttributeDef, attributeValuesOnAssignment, idOfAttributeDefName2, attributeValue2, - attributeValuesOnAssignment2, attributeNotAssigned); + attributeValuesOnAssignment2, attributeNotAssigned, false); + } + + public Set getAllStemsSecure(String scope, GrouperSession grouperSession, + Subject subject, Set inPrivSet, QueryOptions queryOptions, + boolean splitScope, String parentStemId, Scope stemScope, boolean findByUuidOrName, + Collection userHasInGroupFields, Collection userHasInAttributeFields, + Collection stemIds, String idOfAttributeDefName, Object attributeValue, + Boolean attributeCheckReadOnAttributeDef, Set attributeValuesOnAssignment, + String idOfAttributeDefName2, Object attributeValue2, + Set attributeValuesOnAssignment2, boolean attributeNotAssigned, + boolean excludeAlternateName) throws GrouperDAOException { + return getAllStemsSecureHelper(scope, grouperSession, subject, inPrivSet, queryOptions, + splitScope, parentStemId, stemScope, findByUuidOrName, userHasInGroupFields, userHasInAttributeFields, + stemIds, idOfAttributeDefName, attributeValue, attributeCheckReadOnAttributeDef, attributeValuesOnAssignment, + idOfAttributeDefName2, attributeValue2, + attributeValuesOnAssignment2, attributeNotAssigned, excludeAlternateName); } /** diff --git a/grouper/src/test/edu/internet2/middleware/grouper/TestStemFinder.java b/grouper/src/test/edu/internet2/middleware/grouper/TestStemFinder.java index aa8711450d4a..ac3b24b46ea7 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/TestStemFinder.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/TestStemFinder.java @@ -74,7 +74,7 @@ public class TestStemFinder extends GrouperTest { * @param args */ public static void main(String[] args) { - TestRunner.run(new TestStemFinder("testFindByNameSecure")); + TestRunner.run(new TestStemFinder("testChainingStemFinderExcludingAlternateNames")); } // Private Class Constants @@ -844,5 +844,31 @@ public void testFindAllByApproximateName_whenUpperCaseInRegistry() { } } // public void testFindAllByApproximateName_whenUpperCaseInRegistry + public void testChainingStemFinderExcludingAlternateNames() { + GrouperSession grouperSession = GrouperSession.startRootSession(); + Stem stem = new StemSave(grouperSession).assignName("stem-name").assignCreateParentStemsIfNotExist(true).save(); + stem.addAlternateName("stem-alternate"); + stem.store(); + + Set foundStems = new StemFinder().assignScope("stem-n%").findStems(); + assertEquals("find 1 stem by name with scope", foundStems.size(), 1); + assertContainsStem(foundStems, stem, "Found correct stem by name with scope"); + + foundStems = new StemFinder().assignScope("stem-a%").findStems(); + assertEquals("find 1 stem by alternate name with scope", foundStems.size(), 1); + assertContainsStem(foundStems, stem, "Found correct stem by name with scope"); + + foundStems = new StemFinder().assignScope("bogus%").findStems(); + assertEquals("find 0 stems with non-existent name with scope", foundStems.size(), 0); + + /* When excluding alternate name in finder, should find by name but not alternate name */ + foundStems = new StemFinder().assignScope("stem-n%").assignExcludeAlternateNames(true).findStems(); + assertEquals("find 1 stem by name with scope excluding alternate name", foundStems.size(), 1); + assertContainsStem(foundStems, stem, "Found correct stem by name with scope excluding alternate name"); + + foundStems = new StemFinder().assignScope("stem-a%").assignExcludeAlternateNames(true).findStems(); + assertEquals("find 0 stems by alternate name with scope excluding alternate name", foundStems.size(), 0); + } + } diff --git a/grouper/src/test/edu/internet2/middleware/grouper/group/TestGroupFinder.java b/grouper/src/test/edu/internet2/middleware/grouper/group/TestGroupFinder.java index aaaa673544b2..bff03562bb53 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/group/TestGroupFinder.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/group/TestGroupFinder.java @@ -278,6 +278,32 @@ public void testChainingGroupsManage() { } + public void testChainingGroupFinderExcludingAlternateNames() { + GrouperSession grouperSession = GrouperSession.startRootSession(); + Group group = new GroupSave(grouperSession).assignName("test-a:group-a").assignCreateParentStemsIfNotExist(true).save(); + group.addAlternateName("test-b:group-b"); + group.store(); + + Set foundGroups = new GroupFinder().assignScope("test-a:group%").findGroups(); + assertEquals("find 1 group by name with scope", foundGroups.size(), 1); + assertContainsGroup(foundGroups, group, "Found correct group by name with scope"); + + foundGroups = new GroupFinder().assignScope("test-b:group%").findGroups(); + assertEquals("find 1 group by alternate name with scope", foundGroups.size(), 1); + assertContainsGroup(foundGroups, group, "Found correct group by name with scope"); + + foundGroups = new GroupFinder().assignScope("bogus:%").findGroups(); + assertEquals("find 0 groups with non-existent name with scope", foundGroups.size(), 0); + + /* When excluding alternate name in finder, should find by name but not alternate name */ + foundGroups = new GroupFinder().assignScope("test-a:group%").assignExcludeAlternateNames(true).findGroups(); + assertEquals("find 1 group by name with scope excluding alternate name", foundGroups.size(), 1); + assertContainsGroup(foundGroups, group, "Found correct group by name with scope excluding alternate name"); + + foundGroups = new GroupFinder().assignScope("test-b:group%").assignExcludeAlternateNames(true).findGroups(); + assertEquals("find 0 groups by alternate name with scope excluding alternate name", foundGroups.size(), 0); + } + public void testFailToFindGroupByAttributeNullSession() { LOG.info("testFailToFindGroupByAttributeNullSession"); try { @@ -805,7 +831,7 @@ protected void setupConfigs() { */ public static void main(String[] args) { //TestRunner.run(TestGroupFinder.class); - TestRunner.run(new TestGroupFinder("testFindByAttributeDefName")); + TestRunner.run(new TestGroupFinder("testChainingGroupFinderExcludingAlternateNames")); } /** From 585462f93d3f971937a3ae643810213c54fa1eeb Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Wed, 18 May 2022 10:18:28 -0400 Subject: [PATCH 047/125] GRP-4043: create buttons not showing up in new menu --- .../stem/stemMoreActionsButtonContents2.jsp | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemMoreActionsButtonContents2.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemMoreActionsButtonContents2.jsp index ce04c373c15e..08bf5c04e13e 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemMoreActionsButtonContents2.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/stem/stemMoreActionsButtonContents2.jsp @@ -41,12 +41,14 @@ - + -
  • ${textContainer.text['stemViewCopyStemButton'] }
  • + +
  • ${textContainer.text['stemViewCopyStemButton'] }
  • +
  • -
  • ${textContainer.text['stemViewEditStemButton'] }
  • - -
  • ${textContainer.text['stemViewMoveStemButton'] }
  • + +
  • ${textContainer.text['stemViewEditStemButton'] }
  • + +
  • ${textContainer.text['stemViewMoveStemButton'] }
  • +
    - + From c839a6c304f0c93adef2cb1ef7c0df334c6f5874 Mon Sep 17 00:00:00 2001 From: Shilen Patel Date: Fri, 20 May 2022 14:09:42 -0400 Subject: [PATCH 048/125] GRP-4049: Trace memberships audit data (commit 1) --- .../grouperUi/beans/api/GuiPITGroup.java | 61 ++ .../beans/api/GuiPITMembershipView.java | 17 +- .../grouperUi/beans/ui/GuiAuditEntry.java | 25 + .../beans/ui/MembershipGuiContainer.java | 118 +++ .../grouperUi/serviceLogic/UiV2Group.java | 1 + .../serviceLogic/UiV2Membership.java | 700 +++++++++++++++--- .../grouperUi/serviceLogic/UiV2Stem.java | 1 + .../grouperUi2/group/groupContents.jsp | 17 +- .../grouperUi2/membership/traceMembership.jsp | 33 +- grouper/conf/grouper-ui-ng.base.properties | 13 + .../grouper.textNg.en.us.base.properties | 28 +- .../grouper/internal/dao/PITGroupSetDAO.java | 8 + .../internal/dao/PITMembershipDAO.java | 9 + .../internal/dao/PITMembershipViewDAO.java | 20 + .../internal/dao/hib3/Hib3PITGroupSetDAO.java | 20 + .../dao/hib3/Hib3PITMembershipDAO.java | 21 + .../dao/hib3/Hib3PITMembershipViewDAO.java | 58 ++ 17 files changed, 1042 insertions(+), 108 deletions(-) create mode 100644 grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITGroup.java diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITGroup.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITGroup.java new file mode 100644 index 000000000000..ab8243fe738d --- /dev/null +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITGroup.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright 2019 Internet2 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +package edu.internet2.middleware.grouper.grouperUi.beans.api; + +import edu.internet2.middleware.grouper.Group; +import edu.internet2.middleware.grouper.GroupFinder; +import edu.internet2.middleware.grouper.pit.PITGroup; + + +/** + * gui wrapper around pit group + */ +public class GuiPITGroup { + + + /** + * @param thePITGroup + */ + public GuiPITGroup(PITGroup thePITGroup) { + this.pitGroup = thePITGroup; + } + + /** + * pit group + */ + private PITGroup pitGroup; + + /** + * pit group + * @return pit group + */ + public PITGroup getPITGroup() { + return this.pitGroup; + } + + /** + * @return link if available otherwise name + */ + public String getLinkOrName() { + Group group = GroupFinder.findByUuid(this.pitGroup.getSourceId(), false); + if (group == null) { + // just return the name, there's no link for the pit group + return this.pitGroup.getName(); + } + + return new GuiGroup(group).getLink(); + } +} \ No newline at end of file diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITMembershipView.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITMembershipView.java index ba9834e4d580..d444a8b4bd66 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITMembershipView.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/api/GuiPITMembershipView.java @@ -26,7 +26,6 @@ import edu.internet2.middleware.grouper.misc.GrouperDAOFactory; import edu.internet2.middleware.grouper.pit.PITGroup; import edu.internet2.middleware.grouper.pit.PITMembershipView; -import edu.internet2.middleware.grouper.pit.finder.PITGroupFinder; /** @@ -86,6 +85,8 @@ public GuiPITMembershipView(PITMembershipView theMembership) { private PITMembershipView membership; private GuiSubject guiSubject; + + private String memberId; /** * membership @@ -136,4 +137,18 @@ public GuiSubject getGuiSubject() { public void setGuiSubject(GuiSubject guiSubject) { this.guiSubject = guiSubject; } + + /** + * @return memberId + */ + public String getMemberId() { + return memberId; + } + + /** + * @param memberId + */ + public void setMemberId(String memberId) { + this.memberId = memberId; + } } \ No newline at end of file diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GuiAuditEntry.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GuiAuditEntry.java index 2114676b0016..61964125112a 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GuiAuditEntry.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/GuiAuditEntry.java @@ -359,6 +359,17 @@ public String getGuiDate() { return guiDateFormat.format(this.auditEntry.getCreatedOn()); } + /** + * audit date string, format based on ui property uiV2.audit.dateFormatWithSeconds + * @return formatted audit entry date + */ + public String getGuiDateWithSeconds() { + String dateFormat = GrouperUiConfig.retrieveConfig().propertyValueString("uiV2.audit.dateFormatWithSeconds", "yyyy/MM/dd h:mm:ss aa"); + SimpleDateFormat guiDateFormat = new SimpleDateFormat(dateFormat); + + return guiDateFormat.format(this.auditEntry.getCreatedOn()); + } + /** * underlying audit entry */ @@ -1261,6 +1272,20 @@ private void setupMember() { this.setGuiMember(guiMember); } + /** + * + */ + public void internal_setupMember() { + setupMember(); + } + + /** + * + */ + public void internal_setupGroup() { + setupGroup(); + } + /** * setup privilege */ diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java index 0d467437e3c3..986ad998fc18 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java @@ -15,6 +15,8 @@ ******************************************************************************/ package edu.internet2.middleware.grouper.grouperUi.beans.ui; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; import java.util.Set; import edu.internet2.middleware.grouper.Field; @@ -23,6 +25,7 @@ import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiGroup; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiMembership; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiMembershipSubjectContainer; +import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiPITGroup; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiStem; @@ -406,6 +409,48 @@ public String getTraceMembershipsString() { public void setTraceMembershipsString(String traceMembershipsString1) { this.traceMembershipsString = traceMembershipsString1; } + + /** + * string of membership timeline + */ + private String traceMembershipTimelineString; + + + /** + * @return string of membership timeline + */ + public String getTraceMembershipTimelineString() { + return traceMembershipTimelineString; + } + + /** + * string of membership timeline + * @param traceMembershipTimelineString + */ + public void setTraceMembershipTimelineString(String traceMembershipTimelineString) { + this.traceMembershipTimelineString = traceMembershipTimelineString; + } + + /** + * string of trace pit membership + */ + private String tracePITMembershipString; + + /** + * string of trace pit membership + * @return trace pit membership + */ + public String getTracePITMembershipString() { + return this.tracePITMembershipString; + } + + /** + * string of trace pit membership + * @param tracePITMembershipString1 + */ + public void setTracePITMembershipString(String tracePITMembershipString1) { + this.tracePITMembershipString = tracePITMembershipString1; + } /** @@ -471,4 +516,77 @@ public void setGuiAttributeAssigns(Set guiAttributeAssigns) this.guiAttributeAssigns = guiAttributeAssigns; } + /** + * current gui pit group e.g. when tracing memberships + */ + private GuiPITGroup guiPITGroupCurrent; + + + /** + * current gui pit group e.g. when tracing memberships + * @return gui pit group + */ + public GuiPITGroup getGuiPITGroupCurrent() { + return this.guiPITGroupCurrent; + } + + /** + * current gui pit group e.g. when tracing memberships + * @param guiPITGroupCurrent1 + */ + public void setGuiPITGroupCurrent(GuiPITGroup guiPITGroupCurrent1) { + this.guiPITGroupCurrent = guiPITGroupCurrent1; + } + + /** + * current gui audit date + */ + private Timestamp guiAuditDateCurrent; + + /** + * current gui audit date + * @return timestamp + */ + public Timestamp getGuiAuditDateCurrent() { + return guiAuditDateCurrent; + } + + /** + * current gui audit date + * @param guiAuditDateCurrent + */ + public void setGuiAuditDateCurrent(Timestamp guiAuditDateCurrent) { + this.guiAuditDateCurrent = guiAuditDateCurrent; + } + + /** + * audit label string yyyy/MM/dd h:mm a + * @return the audit label string yyyy/MM/dd h:mm:ss a + */ + public String getGuiAuditDateLabelCurrent() { + + if (this.guiAuditDateCurrent == null) { + return null; + } + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd h:mm:ss a"); + + return simpleDateFormat.format(guiAuditDateCurrent); + } + + private GuiAuditEntry guiAuditEntryCurrent; + + /** + * @return current gui audit entry + */ + public GuiAuditEntry getGuiAuditEntryCurrent() { + return guiAuditEntryCurrent; + } + + /** + * @param guiAuditEntryCurrent + */ + public void setGuiAuditEntryCurrent(GuiAuditEntry guiAuditEntryCurrent) { + this.guiAuditEntryCurrent = guiAuditEntryCurrent; + } } diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java index da5138739ecb..65e42d576f22 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java @@ -637,6 +637,7 @@ private void filterHelper(HttpServletRequest request, HttpServletResponse respon String memberId = pitMembershipView.getPITMember().getSourceId(); Subject subject = memberIdToSubject.get(memberId); guiPITMembershipView.setGuiSubject(new GuiSubject(subject)); + guiPITMembershipView.setMemberId(memberId); guiPITMembershipViews.add(guiPITMembershipView); } diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java index f0fca7477d75..641377de06e2 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java @@ -15,19 +15,29 @@ ******************************************************************************/ package edu.internet2.middleware.grouper.grouperUi.serviceLogic; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.Restrictions; import edu.internet2.middleware.grouper.Field; import edu.internet2.middleware.grouper.FieldFinder; import edu.internet2.middleware.grouper.FieldType; import edu.internet2.middleware.grouper.Group; +import edu.internet2.middleware.grouper.GroupFinder; import edu.internet2.middleware.grouper.GrouperSession; import edu.internet2.middleware.grouper.Member; import edu.internet2.middleware.grouper.MemberFinder; @@ -36,17 +46,26 @@ import edu.internet2.middleware.grouper.Stem; import edu.internet2.middleware.grouper.SubjectFinder; import edu.internet2.middleware.grouper.attr.AttributeDef; +import edu.internet2.middleware.grouper.audit.AuditEntry; +import edu.internet2.middleware.grouper.audit.AuditType; +import edu.internet2.middleware.grouper.audit.AuditTypeFinder; +import edu.internet2.middleware.grouper.audit.UserAuditQuery; +import edu.internet2.middleware.grouper.exception.GrouperSessionException; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiAttributeDef; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiGroup; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiMembership; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiMembershipSubjectContainer; +import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiPITGroup; import edu.internet2.middleware.grouper.grouperUi.beans.api.GuiStem; import edu.internet2.middleware.grouper.grouperUi.beans.json.GuiResponseJs; import edu.internet2.middleware.grouper.grouperUi.beans.json.GuiScreenAction; import edu.internet2.middleware.grouper.grouperUi.beans.json.GuiScreenAction.GuiMessageType; import edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperRequestContainer; +import edu.internet2.middleware.grouper.grouperUi.beans.ui.GuiAuditEntry; import edu.internet2.middleware.grouper.grouperUi.beans.ui.MembershipGuiContainer; import edu.internet2.middleware.grouper.grouperUi.beans.ui.TextContainer; +import edu.internet2.middleware.grouper.hibernate.HibUtils; +import edu.internet2.middleware.grouper.internal.dao.QueryOptions; import edu.internet2.middleware.grouper.membership.MembershipContainer; import edu.internet2.middleware.grouper.membership.MembershipPath; import edu.internet2.middleware.grouper.membership.MembershipPathGroup; @@ -54,10 +73,20 @@ import edu.internet2.middleware.grouper.membership.MembershipResult; import edu.internet2.middleware.grouper.membership.MembershipSubjectContainer; import edu.internet2.middleware.grouper.membership.MembershipType; +import edu.internet2.middleware.grouper.misc.GrouperDAOFactory; +import edu.internet2.middleware.grouper.misc.GrouperSessionHandler; +import edu.internet2.middleware.grouper.pit.PITField; +import edu.internet2.middleware.grouper.pit.PITGroup; +import edu.internet2.middleware.grouper.pit.PITGroupSet; +import edu.internet2.middleware.grouper.pit.PITMember; +import edu.internet2.middleware.grouper.pit.PITMembership; +import edu.internet2.middleware.grouper.pit.PITMembershipView; import edu.internet2.middleware.grouper.privs.AccessPrivilege; import edu.internet2.middleware.grouper.privs.AttributeDefPrivilege; +import edu.internet2.middleware.grouper.privs.PrivilegeHelper; import edu.internet2.middleware.grouper.subj.SubjectHelper; import edu.internet2.middleware.grouper.ui.GrouperUiFilter; +import edu.internet2.middleware.grouper.ui.util.GrouperUiConfig; import edu.internet2.middleware.grouper.ui.util.GrouperUiUserData; import edu.internet2.middleware.grouper.userData.GrouperUserDataApi; import edu.internet2.middleware.grouper.util.GrouperUtil; @@ -147,10 +176,6 @@ public void traceMembership(HttpServletRequest request, HttpServletResponse resp final Subject loggedInSubject = GrouperUiFilter.retrieveSubjectLoggedIn(); GrouperSession grouperSession = null; - - Group group = null; - Subject subject = null; - Field field = null; GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); @@ -160,13 +185,13 @@ public void traceMembership(HttpServletRequest request, HttpServletResponse resp GuiResponseJs guiResponseJs = GuiResponseJs.retrieveGuiResponseJs(); - group = UiV2Group.retrieveGroupHelper(request, AccessPrivilege.READ).getGroup(); + Group group = UiV2Group.retrieveGroupHelper(request, AccessPrivilege.READ).getGroup(); if (group == null) { return; } - subject = UiV2Subject.retrieveSubjectHelper(request, true); + Subject subject = UiV2Subject.retrieveSubjectHelper(request, true); if (subject == null) { return; @@ -182,7 +207,7 @@ public void traceMembership(HttpServletRequest request, HttpServletResponse resp return; } - field = UiV2Membership.retrieveFieldHelper(request, true); + Field field = UiV2Membership.retrieveFieldHelper(request, true); if (field == null) { return; @@ -202,128 +227,619 @@ public void traceMembership(HttpServletRequest request, HttpServletResponse resp grouperRequestContainer.getGroupContainer().getGuiGroup().setShowBreadcrumbLink(true); grouperRequestContainer.getSubjectContainer().getGuiSubject().setShowBreadcrumbLink(true); - MembershipPathGroup membershipPathGroup = MembershipPathGroup.analyze(group, member, field); + // point in time objects + PITGroup pitGroup = GrouperDAOFactory.getFactory().getPITGroup().findBySourceIdActive(group.getId(), false); + PITMember pitMember = GrouperDAOFactory.getFactory().getPITMember().findBySourceIdActive(member.getId(), false); + PITField pitField = GrouperDAOFactory.getFactory().getPITField().findBySourceIdActive(field.getId(), true); - StringBuilder result = new StringBuilder(); + Set pitGroupsForTimelineStates = new LinkedHashSet(); + Set memberIdsForTimelineAuditQuery = new LinkedHashSet(); + memberIdsForTimelineAuditQuery.add(pitMember.getSourceId()); - //massage the paths to only consider the ones that are allowed - int membershipUnallowedCount = 0; - List membershipPathsAllowed = new ArrayList(); - for (MembershipPath membershipPath : GrouperUtil.nonNull(membershipPathGroup.getMembershipPaths())) { - if (membershipPath.isPathAllowed()) { - membershipPathsAllowed.add(membershipPath); - } else { - membershipUnallowedCount++; + MembershipPathGroup membershipPathGroup = MembershipPathGroup.analyze(group, member, field); + traceMembershipHelperCurrent(membershipPathGroup, subject, memberIdsForTimelineAuditQuery, pitGroupsForTimelineStates); + + // this should always be the members field, but check just in case + if (field.getId().equals(Group.getDefaultList().getUuid())) { + + if (GrouperUtil.nonNull(membershipPathGroup.getMembershipPaths()).size() == 0) { + traceMembershipsHelperFormer(pitGroup, pitMember, pitField, memberIdsForTimelineAuditQuery, pitGroupsForTimelineStates); } + + traceMembershipsHelperTimeline(pitMember, pitField, memberIdsForTimelineAuditQuery, pitGroupsForTimelineStates); } + + guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#grouperMainContentDivId", + "/WEB-INF/grouperUi2/membership/traceMembership.jsp")); - if (membershipUnallowedCount > 0) { - membershipGuiContainer.setPathCountNotAllowed(membershipUnallowedCount); - guiResponseJs.addAction(GuiScreenAction.newMessage(GuiMessageType.info, - TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupPathsNotAllowed"))); - } + } finally { + GrouperSession.stopQuietly(grouperSession); + } + + } + + private void traceMembershipsHelperFormer(PITGroup pitGroup, PITMember pitMember, PITField pitField, Set memberIdsForTimelineAuditQuery, Set pitGroupsForTimelineStates) { + + if (pitGroup == null || pitMember == null) { + // not in pit (yet?) + return; + } + + GrouperSession loggedInGrouperSession = GrouperSession.staticGrouperSession(); - if (GrouperUtil.length(membershipPathsAllowed) == 0) { + List endTimes = new ArrayList(); + List memberPITGroups = new ArrayList(); + + boolean proceed = (Boolean)GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { - if (membershipUnallowedCount > 0) { - guiResponseJs.addAction(GuiScreenAction.newMessage(GuiMessageType.error, - TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupNoPathsAllowed"))); - - } else { - guiResponseJs.addAction(GuiScreenAction.newMessage(GuiMessageType.error, - TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupNoPaths"))); - + @Override + public Object callback(GrouperSession theGrouperSession) throws GrouperSessionException { + + Set pitMemberships = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITOwnerAndPITMemberAndPITField(pitGroup.getId(), pitMember.getId(), pitField.getId(), null, null, null); + PITMembershipView latestPITMembership = null; + + for (PITMembershipView pitMembership : pitMemberships) { + if (pitMembership.getEndTime() != null) { + if (latestPITMembership == null || latestPITMembership.getEndTime().getTime() < pitMembership.getEndTime().getTime()) { + latestPITMembership = pitMembership; + } + } } - } - - //

    Danielle Knotts is an indirect member of

    - //

    Root : Departments : Information Technology : Staff

    - //

    which is a direct member of

    - //

    Root : Applications : Wiki : Editors

    Back to previous page - //
    - boolean firstPath = true; - // loop through each membership path - for (MembershipPath membershipPath : membershipPathsAllowed) { - if (!firstPath) { - result.append("
    \n"); + if (latestPITMembership == null) { + // nothing to show + return false; } - int pathLineNumber = 0; - membershipGuiContainer.setLineNumber(pathLineNumber); - result.append(TextContainer.retrieveFromRequest().getText().get("membershipTracePathFirstLine")).append("\n"); - pathLineNumber++; - membershipGuiContainer.setLineNumber(pathLineNumber); + boolean isWheelOrRoot = PrivilegeHelper.isWheelOrRoot(loggedInGrouperSession.getSubject()); - boolean firstNode = true; + String pitGroupSetId = latestPITMembership.getGroupSetId(); + PITGroup previousMemberPITGroup = null; - Subject currentSubject = subject; + boolean firstNode = true; - //loop through each node in the path - for (MembershipPathNode membershipPathNode : membershipPath.getMembershipPathNodes()) { - - Group ownerGroup = membershipPathNode.getOwnerGroup(); + while (true) { + PITGroupSet pitGroupSet = GrouperDAOFactory.getFactory().getPITGroupSet().findById(pitGroupSetId, true); + PITGroup memberPITGroup = pitGroupSet.getMemberPITGroup(); + + // check access + if (!isWheelOrRoot) { + Group memberGroup = GroupFinder.findByUuid(memberPITGroup.getSourceId(), false); + if (memberGroup == null || !memberGroup.canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { + // no access so return + return false; + } + } + + if (firstNode) { + Set immediatePITMemberships = GrouperDAOFactory.getFactory().getPITMembership().findAllByPITOwnerAndPITMemberAndPITField(memberPITGroup.getId(), pitMember.getId(), pitField.getId()); + PITMembership mostRecentImmediatePITMembership = null; + for (PITMembership immediatePITMembership : immediatePITMemberships) { + if (mostRecentImmediatePITMembership == null || + immediatePITMembership.getEndTime() == null || + (mostRecentImmediatePITMembership.getEndTime() != null && immediatePITMembership.getEndTime().getTime() > mostRecentImmediatePITMembership.getEndTime().getTime())) { + mostRecentImmediatePITMembership = immediatePITMembership; + } + } + + endTimes.add(mostRecentImmediatePITMembership.getEndTime()); + } else { + Set immediatePITGroupSets = GrouperDAOFactory.getFactory().getPITGroupSet().findAllImmediateByPITOwnerAndPITMemberAndPITField(memberPITGroup.getId(), previousMemberPITGroup.getId(), pitField.getId()); + PITGroupSet mostRecentImmediatePITGroupSet = null; + for (PITGroupSet immediatePITGroupSet : immediatePITGroupSets) { + if (mostRecentImmediatePITGroupSet == null || + immediatePITGroupSet.getEndTime() == null || + (mostRecentImmediatePITGroupSet.getEndTime() != null && immediatePITGroupSet.getEndTime().getTime() > mostRecentImmediatePITGroupSet.getEndTime().getTime())) { + mostRecentImmediatePITGroupSet = immediatePITGroupSet; + } + } + + endTimes.add(mostRecentImmediatePITGroupSet.getEndTime()); + } - if (!firstNode) { + memberPITGroups.add(memberPITGroup); + + firstNode = false; + + if (pitGroupSet.getDepth() < 1) { + break; + } + + pitGroupSetId = pitGroupSet.getParentId(); + previousMemberPITGroup = memberPITGroup; + } - if (membershipPathNode.isComposite()) { - - //dont know what branch of the composite we are on... so - Group factor = membershipPathNode.getOtherFactor(); - membershipGuiContainer.setGuiGroupFactor(new GuiGroup(factor)); - switch(membershipPathNode.getCompositeType()) { - case UNION: + return true; + } + }); + + if (!proceed) { + return; + } + + // text should be rendered as the logged in user to ensure subject privacy + GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); + MembershipGuiContainer membershipGuiContainer = grouperRequestContainer.getMembershipGuiContainer(); + + StringBuilder result = new StringBuilder(); + + int pathLineNumber = 0; + membershipGuiContainer.setLineNumber(pathLineNumber); + + for (int i = 0; i < memberPITGroups.size(); i++) { + PITGroup memberPITGroup = memberPITGroups.get(i); + Timestamp endTime = endTimes.get(i); + + pitGroupsForTimelineStates.add(memberPITGroup); + + for (PITMember currPITMember : GrouperDAOFactory.getFactory().getPITMember().findPITMembersBySubjectIdSourceAndType(memberPITGroup.getSourceId(), "g:gsa", "group")) { + memberIdsForTimelineAuditQuery.add(currPITMember.getSourceId()); + } - result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupCompositeOfUnion")).append("\n"); - break; - case INTERSECTION: + if (i == 0) { + if (endTime == null) { + result.append(TextContainer.retrieveFromRequest().getText().get("pitMembershipTracePathFirstLineCurrentMembership")).append("\n"); + } else { + membershipGuiContainer.setGuiAuditDateCurrent(endTime); + result.append(TextContainer.retrieveFromRequest().getText().get("pitMembershipTracePathFirstLinePreviousMembership")).append("\n"); + } + } else { + if (endTime == null) { + result.append(TextContainer.retrieveFromRequest().getText().get("pitMembershipTraceGroupMemberOfCurrentMembership")).append("\n"); + } else { + membershipGuiContainer.setGuiAuditDateCurrent(endTime); + result.append(TextContainer.retrieveFromRequest().getText().get("pitMembershipTraceGroupMemberOfPreviousMembership")).append("\n"); + } + } + + pathLineNumber++; + membershipGuiContainer.setLineNumber(pathLineNumber); - result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupCompositeOfIntersection")).append("\n"); - break; - case COMPLEMENT: - - result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupCompositeOfMinus")).append("\n"); - break; - default: - throw new RuntimeException("Not expecting composite type: " + membershipPathNode.getCompositeType()); + membershipGuiContainer.setGuiPITGroupCurrent(new GuiPITGroup(memberPITGroup)); + + result.append(TextContainer.retrieveFromRequest().getText().get("pitMembershipTraceGroupLine")).append("\n"); + + pathLineNumber++; + membershipGuiContainer.setLineNumber(pathLineNumber); + } + + if (result.length() > 0) { + grouperRequestContainer.getMembershipGuiContainer().setTracePITMembershipString(result.toString()); + } + } + + private void traceMembershipsHelperTimeline(PITMember pitMember, PITField pitField, Set memberIdsForTimelineAuditQuery, Set pitGroupsForTimelineStates) { + + GrouperSession loggedInGrouperSession = GrouperSession.staticGrouperSession(); + + AuditType addGroupMembershipAuditType = AuditTypeFinder.find("membership", "addGroupMembership", true); + AuditType updateGroupMembershipAuditType = AuditTypeFinder.find("membership", "updateGroupMembership", true); + AuditType deleteGroupMembershipAuditType = AuditTypeFinder.find("membership", "deleteGroupMembership", true); + + // refactor these into separate classes + List momentsOfInterest = new ArrayList(); + Map> eventsUserAudits = new LinkedHashMap>(); + Map> eventsPITAddMembershipGroup = new LinkedHashMap>(); + Map> eventsPITAddMembership = new LinkedHashMap>(); + Map> eventsPITDeleteMembershipGroup = new LinkedHashMap>(); + Map> eventsPITDeleteMembership = new LinkedHashMap>(); + Map> states = new LinkedHashMap>(); + + GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { + + @Override + public Object callback(GrouperSession theGrouperSession) throws GrouperSessionException { + + + boolean isWheelOrRoot = PrivilegeHelper.isWheelOrRoot(loggedInGrouperSession.getSubject()); + + TreeSet preliminaryMomentsOfInterest = new TreeSet(); + + // moments of interest in the timeline are whenever the user was added or removed from any of these groups in the membership path + for (PITGroup pitGroup : pitGroupsForTimelineStates) { + Set currentPITMemberships = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITOwnerAndPITMemberAndPITField(pitGroup.getId(), pitMember.getId(), pitField.getId(), null, null, null); + for (PITMembershipView currentPITMembership : currentPITMemberships) { + if (currentPITMembership.getEndTime() != null) { + if (currentPITMembership.getStartTime().getTime() > currentPITMembership.getEndTime().getTime()) { + // no overlap in membership and group set so ignoring as not useful + continue; } - } else { - result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupMemberOf")).append("\n"); - + long roundedEndTimeToSecond = ((currentPITMembership.getEndTime().getTime() + 500) / 1000) * 1000; + preliminaryMomentsOfInterest.add(roundedEndTimeToSecond); } + + { + long roundedStartTimeToSecond = ((currentPITMembership.getStartTime().getTime() + 500) / 1000) * 1000; + preliminaryMomentsOfInterest.add(roundedStartTimeToSecond); + } + } + } + + if (preliminaryMomentsOfInterest.size() == 0) { + return null; + } + + int traceEventsTimeRangeInSeconds = GrouperUiConfig.retrieveConfig().propertyValueInt("uiV2.membership.traceEventsTimeRangeInSeconds", 90); + List preliminaryMomentsOfInterestDescList = new ArrayList(preliminaryMomentsOfInterest.descendingSet()); - pathLineNumber++; - membershipGuiContainer.setLineNumber(pathLineNumber); + int count = 0; + for (int i = 0; i < preliminaryMomentsOfInterestDescList.size(); i++) { + if (count > 50) { + break; + } + + count++; + + long momentOfInterest = preliminaryMomentsOfInterestDescList.get(i); + long fromLong = momentOfInterest - (traceEventsTimeRangeInSeconds * 1000L); + long toLong = momentOfInterest + (traceEventsTimeRangeInSeconds * 1000L); + + while (true) { + if ((i+1) >= preliminaryMomentsOfInterestDescList.size()) { + break; + } + + long nextMomentOfInterest = preliminaryMomentsOfInterestDescList.get(i + 1); + long nextToLong = nextMomentOfInterest + (traceEventsTimeRangeInSeconds * 1000L); + if (nextToLong >= fromLong) { + // if there's overlap, then combine + fromLong = nextMomentOfInterest - (traceEventsTimeRangeInSeconds * 1000L); + i++; + } else { + break; + } } - membershipGuiContainer.setGuiGroupCurrent(new GuiGroup(ownerGroup)); + Timestamp momentOfInterestTimestamp = new Timestamp(momentOfInterest); + momentsOfInterest.add(momentOfInterestTimestamp); + eventsUserAudits.put(momentOfInterestTimestamp, new ArrayList()); + eventsPITAddMembership.put(momentOfInterestTimestamp, new ArrayList()); + eventsPITAddMembershipGroup.put(momentOfInterestTimestamp, new ArrayList()); + eventsPITDeleteMembership.put(momentOfInterestTimestamp, new ArrayList()); + eventsPITDeleteMembershipGroup.put(momentOfInterestTimestamp, new ArrayList()); + states.put(momentOfInterestTimestamp, new LinkedHashMap()); + + Timestamp fromDate = new Timestamp(fromLong); + Timestamp toDate = new Timestamp(toLong); + + UserAuditQuery userAuditQuery = new UserAuditQuery(); + userAuditQuery.setQueryOptions(new QueryOptions().sortAsc("lastUpdatedDb")); + userAuditQuery.setFromDate(fromDate); + userAuditQuery.setToDate(toDate); + + List memberIdCriterions = new ArrayList(); - Membership membership = MembershipFinder.findImmediateMembership(GrouperSession.staticGrouperSession(), ownerGroup, currentSubject, false); - membershipGuiContainer.setGuiMembershipCurrent(new GuiMembership(membership)); + for (AuditType auditType : GrouperUtil.toList(addGroupMembershipAuditType, updateGroupMembershipAuditType, deleteGroupMembershipAuditType)) { + Criterion auditTypeCriterion = Restrictions.eq(AuditEntry.FIELD_AUDIT_TYPE_ID, auditType.getId()); + String auditEntryField = auditType.retrieveAuditEntryFieldForLabel("memberId"); + Criterion auditEntryFieldCriterion = Restrictions.in(auditEntryField, memberIdsForTimelineAuditQuery); + Criterion andCriterion = HibUtils.listCrit(auditTypeCriterion, auditEntryFieldCriterion); + memberIdCriterions.add(andCriterion); + } - result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupLine")).append("\n"); + userAuditQuery.setExtraCriterion(HibUtils.listCritOr(memberIdCriterions)); + + List userAuditEntries = userAuditQuery.execute(); + for (AuditEntry userAudit : userAuditEntries) { + + GuiAuditEntry guiUserAudit = new GuiAuditEntry(userAudit); + guiUserAudit.internal_setupMember(); + guiUserAudit.internal_setupGroup(); + + if (guiUserAudit.getGuiGroup().getGroup() == null) { + continue; + } + + if (!isWheelOrRoot && !guiUserAudit.getGuiGroup().getGroup().canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { + // no access so return + continue; + } + + eventsUserAudits.get(momentOfInterestTimestamp).add(guiUserAudit); + } - firstNode = false; - pathLineNumber++; - membershipGuiContainer.setLineNumber(pathLineNumber); + Set pitMembershipsStarted = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITMemberAndPITFieldAndStartTimeRange(pitMember.getId(), pitField.getId(), fromDate, toDate); + for (PITMembershipView pitMembershipStarted : pitMembershipsStarted) { + + PITGroup currentPITGroup = GrouperDAOFactory.getFactory().getPITGroup().findById(pitMembershipStarted.getOwnerGroupId(), true); + + if (!isWheelOrRoot) { + Group currentGroup = GrouperDAOFactory.getFactory().getGroup().findByUuid(currentPITGroup.getSourceId(), false); + + if (currentGroup == null || !currentGroup.canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { + // no access so return + continue; + } + } + + eventsPITAddMembership.get(momentOfInterestTimestamp).add(pitMembershipStarted); + eventsPITAddMembershipGroup.get(momentOfInterestTimestamp).add(currentPITGroup); + } + + Set pitMembershipsEnded = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITMemberAndPITFieldAndEndTimeRange(pitMember.getId(), pitField.getId(), fromDate, toDate); + for (PITMembershipView pitMembershipEnded : pitMembershipsEnded) { + + PITGroup currentPITGroup = GrouperDAOFactory.getFactory().getPITGroup().findById(pitMembershipEnded.getOwnerGroupId(), true); + + if (!isWheelOrRoot) { + Group currentGroup = GrouperDAOFactory.getFactory().getGroup().findByUuid(currentPITGroup.getSourceId(), false); + + if (currentGroup == null || !currentGroup.canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { + // no access so return + continue; + } + } + + eventsPITDeleteMembership.get(momentOfInterestTimestamp).add(pitMembershipEnded); + eventsPITDeleteMembershipGroup.get(momentOfInterestTimestamp).add(currentPITGroup); + } - currentSubject = ownerGroup.toSubject(); + for (PITGroup pitGroupForState : pitGroupsForTimelineStates) { + + Set pitMembershipsForState = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITOwnerAndPITMemberAndPITField(pitGroupForState.getId(), pitMember.getId(), pitField.getId(), toDate, toDate, null); + if (pitMembershipsForState.size() > 0) { + states.get(momentOfInterestTimestamp).put(pitGroupForState, true); + } else { + states.get(momentOfInterestTimestamp).put(pitGroupForState, false); + } + } } - firstPath = false; + return null; } + }); + + if (momentsOfInterest.size() == 0) { + return; + } + + GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); + MembershipGuiContainer membershipGuiContainer = grouperRequestContainer.getMembershipGuiContainer(); + + StringBuilder result = new StringBuilder(); + result.append("
      \n"); + + for (int i = 0; i < momentsOfInterest.size(); i++) { - grouperRequestContainer.getMembershipGuiContainer().setTraceMembershipsString(result.toString()); + Timestamp momentOfInterestTimestamp = momentsOfInterest.get(i); + List currEventsUserAudits = eventsUserAudits.get(momentOfInterestTimestamp); + List currEventsPITAddMembership = eventsPITAddMembership.get(momentOfInterestTimestamp); + List currEventsPITAddMembershipGroup = eventsPITAddMembershipGroup.get(momentOfInterestTimestamp); + List currEventsPITDeleteMembership = eventsPITDeleteMembership.get(momentOfInterestTimestamp); + List currEventsPITDeleteMembershipGroup = eventsPITDeleteMembershipGroup.get(momentOfInterestTimestamp); + Map currStates = states.get(momentOfInterestTimestamp); - guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#grouperMainContentDivId", - "/WEB-INF/grouperUi2/membership/traceMembership.jsp")); + membershipGuiContainer.setGuiAuditDateCurrent(momentOfInterestTimestamp); + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineMomentOfInterest")).append("\n"); + + result.append("
      • " + TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineMomentOfInterestEventsLabel") + "
      • "); + result.append("
          "); + + Map> sortedEvents = new TreeMap>(); + + for (GuiAuditEntry guiUserAudit : currEventsUserAudits) { + boolean isAddMembership = false; + boolean isUpdateMembership = false; + boolean isDeleteMembership = false; + if (guiUserAudit.getAuditEntry().getAuditType().equals(addGroupMembershipAuditType)) { + isAddMembership = true; + } else if (guiUserAudit.getAuditEntry().getAuditType().equals(deleteGroupMembershipAuditType)) { + isDeleteMembership = true; + } else if (guiUserAudit.getAuditEntry().getAuditType().equals(updateGroupMembershipAuditType)) { + isUpdateMembership = true; + } else { + continue; + } + + membershipGuiContainer.setGuiAuditEntryCurrent(guiUserAudit); + long timestamp = guiUserAudit.getAuditEntry().getCreatedOn().getTime(); + + if (sortedEvents.get(timestamp) == null) { + sortedEvents.put(timestamp, new TreeSet()); + } + + if (isAddMembership) { + sortedEvents.get(timestamp).add(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineUserAuditAddMembership")); + } else if (isUpdateMembership) { + sortedEvents.get(timestamp).add(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineUserAuditUpdateMembership")); + } else if (isDeleteMembership) { + sortedEvents.get(timestamp).add(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineUserAuditDeleteMembership")); + } + } + + for (int j = 0; j < currEventsPITAddMembership.size(); j++) { + PITMembershipView pitMembershipStarted = currEventsPITAddMembership.get(j); + PITGroup currentPITGroup = currEventsPITAddMembershipGroup.get(j); + + membershipGuiContainer.setGuiPITGroupCurrent(new GuiPITGroup(currentPITGroup)); + membershipGuiContainer.setGuiAuditDateCurrent(pitMembershipStarted.getStartTime()); + + long timestamp = pitMembershipStarted.getStartTime().getTime(); + + if (sortedEvents.get(timestamp) == null) { + sortedEvents.put(timestamp, new TreeSet()); + } + + sortedEvents.get(timestamp).add(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelinePITAuditAddMembership")); + } + + for (int j = 0; j < currEventsPITDeleteMembership.size(); j++) { + PITMembershipView pitMembershipEnded = currEventsPITDeleteMembership.get(j); + PITGroup currentPITGroup = currEventsPITDeleteMembershipGroup.get(j); + + membershipGuiContainer.setGuiPITGroupCurrent(new GuiPITGroup(currentPITGroup)); + membershipGuiContainer.setGuiAuditDateCurrent(pitMembershipEnded.getEndTime()); + + long timestamp = pitMembershipEnded.getEndTime().getTime(); + + if (sortedEvents.get(timestamp) == null) { + sortedEvents.put(timestamp, new TreeSet()); + } + + sortedEvents.get(timestamp).add(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelinePITAuditDeleteMembership")); + } + + for (long timestamp : sortedEvents.keySet()) { + for (String event : sortedEvents.get(timestamp)) { + result.append(event + "\n"); + } + } + + result.append("
        "); + result.append("
      • " + TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineMomentOfInterestStateLabel") + "
      • "); + result.append("
          "); + + for (PITGroup currState : currStates.keySet()) { + membershipGuiContainer.setGuiPITGroupCurrent(new GuiPITGroup(currState)); + + if (currStates.get(currState)) { + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineStateMembershipYes")).append("\n"); + } else { + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceTimelineStateMembershipNo")).append("\n"); + } + } + + result.append("
        "); + + result.append("
      "); + } + + result.append("
    \n"); - } finally { - GrouperSession.stopQuietly(grouperSession); + grouperRequestContainer.getMembershipGuiContainer().setTraceMembershipTimelineString(result.toString()); + } + + private void traceMembershipHelperCurrent(MembershipPathGroup membershipPathGroup, Subject subject, Set memberIdsForTimelineAuditQuery, Set pitGroupsForTimelineStates) { + GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); + MembershipGuiContainer membershipGuiContainer = grouperRequestContainer.getMembershipGuiContainer(); + + Set membershipPaths = GrouperUtil.nonNull(membershipPathGroup.getMembershipPaths()); + + StringBuilder result = new StringBuilder(); + + //massage the paths to only consider the ones that are allowed + int membershipUnallowedCount = 0; + List membershipPathsAllowed = new ArrayList(); + + for (MembershipPath membershipPath : membershipPaths) { + if (membershipPath.isPathAllowed()) { + membershipPathsAllowed.add(membershipPath); + } else { + membershipUnallowedCount++; + } } + + if (GrouperUtil.length(membershipPathsAllowed) == 0) { + + if (membershipUnallowedCount > 0) { + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupNoPathsAllowed")).append("

    \n"); + + } else { + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupNoPaths")).append("

    \n"); + } + } else if (membershipUnallowedCount > 0) { + membershipGuiContainer.setPathCountNotAllowed(membershipUnallowedCount); + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupPathsNotAllowed")).append("

    \n"); + } + + Set groupIdsForTimeline = new LinkedHashSet(); + //

    Danielle Knotts is an indirect member of

    + //

    Root : Departments : Information Technology : Staff

    + //

    which is a direct member of

    + //

    Root : Applications : Wiki : Editors

    Back to previous page + //
    + boolean firstPath = true; + // loop through each membership path + for (MembershipPath membershipPath : membershipPathsAllowed) { + + if (!firstPath) { + result.append("
    \n"); + } + + int pathLineNumber = 0; + membershipGuiContainer.setLineNumber(pathLineNumber); + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTracePathFirstLine")).append("\n"); + pathLineNumber++; + membershipGuiContainer.setLineNumber(pathLineNumber); + + boolean firstNode = true; + + Subject currentSubject = subject; + + //loop through each node in the path + for (MembershipPathNode membershipPathNode : membershipPath.getMembershipPathNodes()) { + + Group ownerGroup = membershipPathNode.getOwnerGroup(); + groupIdsForTimeline.add(ownerGroup.getId()); + + if (!firstNode) { + + if (membershipPathNode.isComposite()) { + + //dont know what branch of the composite we are on... so + Group factor = membershipPathNode.getOtherFactor(); + membershipGuiContainer.setGuiGroupFactor(new GuiGroup(factor)); + + if (factor != null) { + groupIdsForTimeline.add(factor.getId()); + } + + switch(membershipPathNode.getCompositeType()) { + case UNION: + + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupCompositeOfUnion")).append("\n"); + break; + case INTERSECTION: + + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupCompositeOfIntersection")).append("\n"); + break; + case COMPLEMENT: + + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupCompositeOfMinus")).append("\n"); + break; + default: + throw new RuntimeException("Not expecting composite type: " + membershipPathNode.getCompositeType()); + } + + } else { + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupMemberOf")).append("\n"); + + } + + pathLineNumber++; + membershipGuiContainer.setLineNumber(pathLineNumber); + + } + + membershipGuiContainer.setGuiGroupCurrent(new GuiGroup(ownerGroup)); + + Membership membership = MembershipFinder.findImmediateMembership(GrouperSession.staticGrouperSession(), ownerGroup, currentSubject, false); + membershipGuiContainer.setGuiMembershipCurrent(new GuiMembership(membership)); + + result.append(TextContainer.retrieveFromRequest().getText().get("membershipTraceGroupLine")).append("\n"); + + firstNode = false; + pathLineNumber++; + membershipGuiContainer.setLineNumber(pathLineNumber); + + currentSubject = ownerGroup.toSubject(); + } + + firstPath = false; + } + + if (result.length() > 0) { + grouperRequestContainer.getMembershipGuiContainer().setTraceMembershipsString(result.toString()); + } + + pitGroupsForTimelineStates.addAll(GrouperDAOFactory.getFactory().getPITGroup().findBySourceIdsActive(groupIdsForTimeline)); + + for (Member member : GrouperDAOFactory.getFactory().getMember().findBySubjectIds(groupIdsForTimeline, "g:gsa")) { + memberIdsForTimelineAuditQuery.add(member.getId()); + } } /** diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Stem.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Stem.java index 61545597a86a..560dfcf9de2c 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Stem.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Stem.java @@ -1433,6 +1433,7 @@ private void groupMembershipsInFolderFilterHelper(HttpServletRequest request, Ht String memberId = pitMembershipView.getPITMember().getSourceId(); Subject subject = memberIdToSubject.get(memberId); guiPITMembershipView.setGuiSubject(new GuiSubject(subject)); + guiPITMembershipView.setMemberId(memberId); guiPITMembershipViews.add(guiPITMembershipView); } diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp index 0b2c08e4c5dd..db78173630e5 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/group/groupContents.jsp @@ -4,7 +4,12 @@
    - - + @@ -46,6 +51,14 @@ + diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp index 79ef69db969c..b6b099e88b8b 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp @@ -23,17 +23,30 @@
    -

    ${textContainer.text['membershipTracePageLead'] }

    + +

    ${textContainer.text['membershipTracePageLead'] }

    - <%-- -

    Danielle Knotts is an indirect member of

    -

    Root : Departments : Information Technology : Staff

    -

    which is a direct member of

    -

    Root : Applications : Wiki : Editors

    Back to previous page -
    - --%> - <%-- note, this is generated in Java in UiV2Membership.traceMembership --%> - ${grouperRequestContainer.membershipGuiContainer.traceMembershipsString } + <%-- +

    Danielle Knotts is an indirect member of

    +

    Root : Departments : Information Technology : Staff

    +

    which is a direct member of

    +

    Root : Applications : Wiki : Editors

    Back to previous page +
    + --%> + <%-- note, this is generated in Java in UiV2Membership.traceMembership --%> + ${grouperRequestContainer.membershipGuiContainer.traceMembershipsString } +
    + +

    ${textContainer.text['pitMembershipTracePageLead'] }

    + + ${grouperRequestContainer.membershipGuiContainer.tracePITMembershipString } +
    + +

    ${textContainer.text['membershipTraceTimelinePageLead'] }

    +

    ${textContainer.text['membershipTraceTimelineDescription'] }

    + + ${grouperRequestContainer.membershipGuiContainer.traceMembershipTimelineString} +
    diff --git a/grouper/conf/grouper-ui-ng.base.properties b/grouper/conf/grouper-ui-ng.base.properties index 41ad093145b2..f4903f8829d5 100644 --- a/grouper/conf/grouper-ui-ng.base.properties +++ b/grouper/conf/grouper-ui-ng.base.properties @@ -476,6 +476,10 @@ audit.query.default-since=7 # {valueType: "string", required: false} uiV2.audit.dateFormat = yyyy/MM/dd h:mm aa +# Format string for audit dates with seconds used in membership timeline +# {valueType: "string", required: false} +uiV2.audit.dateFormatWithSeconds = yyyy/MM/dd h:mm:ss aa + ##################################################### ## Misc @@ -1224,6 +1228,15 @@ uiV2.attributeDefNamesComboboxResultSize = 200 # {valueType: "integer", required: true} uiV2.permissionActionsComboboxResultSize = 200 +################################### +## V2 UI membership settings +################################### + +# On the trace membership page, for each moment of interest, events are shown that are plus or minus the number of seconds configured here +# {valueType: "integer", required: true} +uiV2.membership.traceEventsTimeRangeInSeconds = 90 + + ################################### ## V2 UI privilege inheritance settings ################################### diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 7e68d7d41350..ac6dca298ad7 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -3943,6 +3943,28 @@ membershipTraceBreadcrumb = Trace membership # lead at the top of the page that explains trace membership membershipTracePageLead = ${grouperRequestContainer.subjectContainer.guiSubject.ScreenLabelShort2noLink} is a member of the ${grouperUtil.xmlEscape(grouperRequestContainer.groupContainer.guiGroup.group.displayExtension)} group by the following paths: +# pit membership trace +pitMembershipTracePageLead = ${grouperRequestContainer.subjectContainer.guiSubject.ScreenLabelShort2noLink} was a member of the ${grouperUtil.xmlEscape(grouperRequestContainer.groupContainer.guiGroup.group.displayExtension)} group by the following path: +pitMembershipTracePathFirstLineCurrentMembership =

    ${grouperRequestContainer.subjectContainer.guiSubject.shortLink} is a direct member of

    +pitMembershipTracePathFirstLinePreviousMembership =

    ${grouperRequestContainer.subjectContainer.guiSubject.shortLink} is NOT a direct member of (ended ${grouperRequestContainer.membershipGuiContainer.getGuiAuditDateLabelCurrent()})

    +pitMembershipTraceGroupLine =

    ${grouperRequestContainer.membershipGuiContainer.guiPITGroupCurrent.linkOrName}

    +pitMembershipTraceGroupMemberOfCurrentMembership =

    which is a direct member of

    +pitMembershipTraceGroupMemberOfPreviousMembership =

    which is NOT a direct member of (ended ${grouperRequestContainer.membershipGuiContainer.getGuiAuditDateLabelCurrent()})

    + +# membership trace timeline +membershipTraceTimelinePageLead = Membership timeline: +membershipTraceTimelineDescription = The following are times when the subject was added or removed from any of the groups in the membership path above. The events include all membership adds and removes for the subject around the time. And the state includes whether the subject was a member of each of the groups in the membership path at that time. +membershipTraceTimelineMomentOfInterestEventsLabel = Event(s) +membershipTraceTimelineMomentOfInterestStateLabel = State +membershipTraceTimelineMomentOfInterest =
  • ${grouperRequestContainer.membershipGuiContainer.getGuiAuditDateLabelCurrent()}
  • +membershipTraceTimelineUserAuditAddMembership =
  •  ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiDateWithSeconds()} - [user audit] ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiSubjectPerformedAction().shortLink} added ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiMember().shortLink} to ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiGroup().link} group using ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGrouperEngineLabel()}
  • +membershipTraceTimelineUserAuditUpdateMembership =
  •  ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiDateWithSeconds()} - [user audit] ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiSubjectPerformedAction().shortLink} updated ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiMember().shortLink} in ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiGroup().link} group using ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGrouperEngineLabel()}
  • +membershipTraceTimelineUserAuditDeleteMembership =
  •  ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiDateWithSeconds()} - [user audit] ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiSubjectPerformedAction().shortLink} removed ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiMember().shortLink} from ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGuiGroup().link} group using ${grouperRequestContainer.membershipGuiContainer.getGuiAuditEntryCurrent().getGrouperEngineLabel()}
  • +membershipTraceTimelinePITAuditAddMembership =
  •  ${grouperRequestContainer.membershipGuiContainer.getGuiAuditDateLabelCurrent()} - [point in time audit] added ${grouperRequestContainer.subjectContainer.guiSubject.shortLink} to ${grouperRequestContainer.membershipGuiContainer.guiPITGroupCurrent.linkOrName} group
  • +membershipTraceTimelinePITAuditDeleteMembership =
  •  ${grouperRequestContainer.membershipGuiContainer.getGuiAuditDateLabelCurrent()} - [point in time audit] removed ${grouperRequestContainer.subjectContainer.guiSubject.shortLink} from ${grouperRequestContainer.membershipGuiContainer.guiPITGroupCurrent.linkOrName} group
  • +membershipTraceTimelineStateMembershipYes =
  •  ${grouperRequestContainer.membershipGuiContainer.guiPITGroupCurrent.linkOrName}
  • +membershipTraceTimelineStateMembershipNo =
  •  ${grouperRequestContainer.membershipGuiContainer.guiPITGroupCurrent.linkOrName}
  • + # no memberships found on trace memberships screen membershipTraceNoMembershipFound = No memberships found @@ -3982,13 +4004,13 @@ membershipTraceBackToMembershipButton = Back to membership membershipTraceBackToAttributeDefButton = Back to attribute # if there are no paths -membershipTraceGroupNoPaths = There are no indirect paths for this entity and group +membershipTraceGroupNoPaths = There are no current indirect paths for this entity and group. # if there are no paths allowed by user -membershipTraceGroupNoPathsAllowed = There are no indirect paths for this entity and group that you are allowed to read +membershipTraceGroupNoPathsAllowed = There are no current indirect paths for this entity and group that you are allowed to read. # if there are some paths cannot see -membershipTraceGroupPathsNotAllowed = Note: there are ${grouperRequestContainer.membershipGuiContainer.pathCountNotAllowed} paths for this entity and group that you are not allowed to see since you cannot READ a group in the path +membershipTraceGroupPathsNotAllowed = Note: there are ${grouperRequestContainer.membershipGuiContainer.pathCountNotAllowed} current paths for this entity and group that you are not allowed to see since you cannot READ a group in the path. ######################################## ## Edit memberships diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITGroupSetDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITGroupSetDAO.java index 3b678d78ee94..44a55b4c1802 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITGroupSetDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITGroupSetDAO.java @@ -130,6 +130,14 @@ public interface PITGroupSetDAO extends GrouperDAO { */ public PITGroupSet findActiveImmediateByPITOwnerAndPITMemberAndPITField(String ownerId, String memberId, String fieldId); + /** + * @param ownerId + * @param memberId + * @param fieldId + * @return pit group sets + */ + public Set findAllImmediateByPITOwnerAndPITMemberAndPITField(String ownerId, String memberId, String fieldId); + /** * @param groupId * @param field diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipDAO.java index 0e01337cfa5e..9c27935c487a 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipDAO.java @@ -117,6 +117,15 @@ public interface PITMembershipDAO extends GrouperDAO { */ public Set findAllByPITMember(String memberId); + /** + * Get memberships by owner, member, field + * @param ownerId + * @param memberId + * @param fieldId + * @return set of pit memberships + */ + public Set findAllByPITOwnerAndPITMemberAndPITField(String ownerId, String memberId, String fieldId); + /** * @return active memberships that are missing in point in time */ diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipViewDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipViewDAO.java index f75f3980587b..bd343bb08dd8 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipViewDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/PITMembershipViewDAO.java @@ -120,4 +120,24 @@ public Set findAllByGroupOwnerOptions(Collection totalGroupIds Set sources, Stem stem, Scope stemScope, Boolean checkSecurity, FieldType fieldType, QueryOptions queryOptionsForMember, String filterForMember, boolean splitScopeForMember, boolean hasFieldForMember, Timestamp pointInTimeFrom, Timestamp pointInTimeTo); + + /** + * @param memberId + * @param fieldId + * @param endTimeFrom + * @param endTimeTo + * @return set of PITMembershipView + */ + public Set findAllByPITMemberAndPITFieldAndEndTimeRange(String memberId, String fieldId, + Timestamp endTimeFrom, Timestamp endTimeTo); + + /** + * @param memberId + * @param fieldId + * @param startTimeFrom + * @param startTimeTo + * @returnset of PITMembershipView + */ + public Set findAllByPITMemberAndPITFieldAndStartTimeRange(String memberId, String fieldId, + Timestamp startTimeFrom, Timestamp startTimeTo); } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITGroupSetDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITGroupSetDAO.java index d07f55c1a510..62453f875ff6 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITGroupSetDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITGroupSetDAO.java @@ -319,6 +319,26 @@ public PITGroupSet findActiveImmediateByPITOwnerAndPITMemberAndPITField(String o return pitGroupSet; } + /** + * @see edu.internet2.middleware.grouper.internal.dao.PITGroupSetDAO#findAllImmediateByPITOwnerAndPITMemberAndPITField(java.lang.String, java.lang.String, java.lang.String) + */ + public Set findAllImmediateByPITOwnerAndPITMemberAndPITField(String ownerId, String memberId, String fieldId) { + Set pitGroupSets = HibernateSession + .byHqlStatic() + .createQuery("select pitGroupSet from PITGroupSet as pitGroupSet " + + "where ownerId = :ownerId " + + "and memberId = :memberId " + + "and fieldId = :fieldId " + + "and depth = '1'") + .setCacheable(false).setCacheRegion(KLASS + ".FindAllImmediateByPITOwnerAndPITMemberAndPITField") + .setString("ownerId", ownerId) + .setString("memberId", memberId) + .setString("fieldId", fieldId) + .listSet(PITGroupSet.class); + + return pitGroupSets; + } + /** * @see edu.internet2.middleware.grouper.internal.dao.PITGroupSetDAO#findAllActiveByPITGroupOwnerAndPITField(java.lang.String, edu.internet2.middleware.grouper.pit.PITField) */ diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipDAO.java index 0867eebbe6ef..538b245b3d57 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipDAO.java @@ -285,6 +285,27 @@ public Set findAllByPITMember(String memberId) { .setString("memberId", memberId) .listSet(PITMembership.class); } + + /** + * + */ + public Set findAllByPITOwnerAndPITMemberAndPITField(String ownerId, String memberId, String fieldId) { + + StringBuilder sql = new StringBuilder("select ms " + + "from PITMembership ms where " + + "ms.ownerId = :ownerId " + + "and ms.memberId = :memberId " + + "and ms.fieldId = :fieldId"); + + return HibernateSession.byHqlStatic() + .createQuery(sql.toString()) + .setCacheable(false) + .setCacheRegion(KLASS + ".FindAllByPITOwnerAndPITMemberAndPITField") + .setString("ownerId", ownerId) + .setString("memberId", memberId) + .setString("fieldId", fieldId) + .listSet(PITMembership.class); + } /** * @see edu.internet2.middleware.grouper.internal.dao.PITMembershipDAO#findMissingActivePITMemberships() diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipViewDAO.java b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipViewDAO.java index 083c16d709a6..ae8d2a521b17 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipViewDAO.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/internal/dao/hib3/Hib3PITMembershipViewDAO.java @@ -273,6 +273,64 @@ public Set findAllByPITOwnerAndPITMemberAndPITField(String ow .setString("fieldId", fieldId) .listSet(PITMembershipView.class); } + + public Set findAllByPITMemberAndPITFieldAndStartTimeRange(String memberId, String fieldId, + Timestamp startTimeFrom, Timestamp startTimeTo) { + + Long startTimeFromLong = startTimeFrom.getTime() * 1000; + Long startTimeToLong = startTimeTo.getTime() * 1000; + + StringBuilder sql = new StringBuilder("select pitms " + + "from PITMembershipView pitms where " + + "pitms.memberId = :memberId " + + "and pitms.fieldId = :fieldId"); + + sql.append(" and ((pitms.membershipStartTimeDb > '" + startTimeFromLong + "' and pitms.membershipStartTimeDb < '" + startTimeToLong + "' and pitms.groupSetStartTimeDb < '" + startTimeToLong + "')"); + sql.append(" or (pitms.groupSetStartTimeDb > '" + startTimeFromLong + "' and pitms.groupSetStartTimeDb < '" + startTimeToLong + "' and pitms.membershipStartTimeDb < '" + startTimeToLong + "'))"); + + // make sure membership object didn't end before group set object started + sql.append(" and (pitms.membershipEndTimeDb is null or pitms.membershipEndTimeDb > pitms.groupSetStartTimeDb) "); + + // make sure group set object didn't end before membership object started + sql.append(" and (pitms.groupSetEndTimeDb is null or pitms.groupSetEndTimeDb > pitms.membershipStartTimeDb) "); + + return HibernateSession.byHqlStatic() + .createQuery(sql.toString()) + .setCacheable(false) + .setCacheRegion(KLASS + ".FindAllByPITMemberAndPITFieldAndStartTimeRange") + .setString("memberId", memberId) + .setString("fieldId", fieldId) + .listSet(PITMembershipView.class); + } + + public Set findAllByPITMemberAndPITFieldAndEndTimeRange(String memberId, String fieldId, + Timestamp endTimeFrom, Timestamp endTimeTo) { + + Long endTimeFromLong = endTimeFrom.getTime() * 1000; + Long endTimeToLong = endTimeTo.getTime() * 1000; + + StringBuilder sql = new StringBuilder("select pitms " + + "from PITMembershipView pitms where " + + "pitms.memberId = :memberId " + + "and pitms.fieldId = :fieldId"); + + sql.append(" and ((pitms.membershipEndTimeDb > '" + endTimeFromLong + "' and pitms.membershipEndTimeDb < '" + endTimeToLong + "' and (pitms.groupSetEndTimeDb is null or pitms.groupSetEndTimeDb > '" + endTimeFromLong + "'))"); + sql.append(" or (pitms.groupSetEndTimeDb > '" + endTimeFromLong + "' and pitms.groupSetEndTimeDb < '" + endTimeToLong + "' and (pitms.membershipEndTimeDb is null or pitms.membershipEndTimeDb > '" + endTimeFromLong + "')))"); + + // make sure membership object didn't end before group set object started + sql.append(" and (pitms.membershipEndTimeDb is null or pitms.membershipEndTimeDb > pitms.groupSetStartTimeDb) "); + + // make sure group set object didn't end before membership object started + sql.append(" and (pitms.groupSetEndTimeDb is null or pitms.groupSetEndTimeDb > pitms.membershipStartTimeDb) "); + + return HibernateSession.byHqlStatic() + .createQuery(sql.toString()) + .setCacheable(false) + .setCacheRegion(KLASS + ".FindAllByPITMemberAndPITFieldAndEndTimeRange") + .setString("memberId", memberId) + .setString("fieldId", fieldId) + .listSet(PITMembershipView.class); + } /** * @see edu.internet2.middleware.grouper.internal.dao.PITMembershipViewDAO#findAllByGroupOwnerOptions(java.util.Collection, java.util.Collection, java.util.Collection, java.util.Set, java.lang.Boolean, edu.internet2.middleware.grouper.FieldType, edu.internet2.middleware.grouper.internal.dao.QueryOptions, java.lang.String, boolean, boolean, java.sql.Timestamp, java.sql.Timestamp) From 0b11278d8458350edcb4a61897b454d8ca3a4536 Mon Sep 17 00:00:00 2001 From: Shilen Patel Date: Fri, 20 May 2022 15:23:56 -0400 Subject: [PATCH 049/125] GRP-4049: Trace memberships audit data (commit 2) --- .../grouper/grouperUi/serviceLogic/UiV2Membership.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java index 641377de06e2..6bfa5d3a71e3 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java @@ -784,7 +784,9 @@ private void traceMembershipHelperCurrent(MembershipPathGroup membershipPathGrou membershipGuiContainer.setGuiGroupFactor(new GuiGroup(factor)); if (factor != null) { - groupIdsForTimeline.add(factor.getId()); + if (factor.canHavePrivilege(GrouperSession.staticGrouperSession().getSubject(), "read", false)) { + groupIdsForTimeline.add(factor.getId()); + } } switch(membershipPathNode.getCompositeType()) { From da7dedf6b74763b28a518571b858870c7fb07004 Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Sun, 22 May 2022 16:07:15 -0700 Subject: [PATCH 050/125] Populate sql provisioner config from start with --- .../UiV2ProvisionerConfiguration.java | 18 +- grouper/conf/grouper-loader.base.properties | 61 +-- .../grouper.textNg.en.us.base.properties | 40 +- .../GrouperConfigurationModuleBase.java | 2 +- .../ProvisioningConfiguration.java | 204 +++++++++++ .../SqlProvisioningStartWith.java | 346 ++++++++++++++++++ 6 files changed, 622 insertions(+), 49 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java index 9e14011f3559..411bb800d8d7 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java @@ -29,6 +29,8 @@ import edu.internet2.middleware.grouper.app.provisioning.ProvisioningConfiguration; import edu.internet2.middleware.grouper.audit.AuditEntry; import edu.internet2.middleware.grouper.audit.AuditTypeBuiltin; +import edu.internet2.middleware.grouper.cfg.dbConfig.ConfigItemFormElement; +import edu.internet2.middleware.grouper.cfg.dbConfig.OptionValueDriver; import edu.internet2.middleware.grouper.changeLog.esb.consumer.ProvisioningMessage; import edu.internet2.middleware.grouper.grouperUi.beans.json.GuiPaging; import edu.internet2.middleware.grouper.grouperUi.beans.json.GuiResponseJs; @@ -1063,7 +1065,6 @@ public void addProvisionerConfigurationSubmit(final HttpServletRequest request, } } - provisionerStartWith.populateProvisionerConfigurationValuesFromStartWith(configSuffixToValues, provisionerSuffixToValue); for (String key: provisionerSuffixToValue.keySet()) { @@ -1071,6 +1072,21 @@ public void addProvisionerConfigurationSubmit(final HttpServletRequest request, if (attributes.containsKey(key)) { attributes.get(key).setValue(GrouperUtil.stringValue(valueToSet)); + + } + } + + for (String key: provisionerSuffixToValue.keySet()) { + + if (attributes.containsKey(key)) { + + if (attributes.get(key).getFormElement() == ConfigItemFormElement.DROPDOWN) { + + attributes.get(key).getGrouperConfigModule() + .populateValuesLabelsFromOptionValueClass(attributes, attributes.get(key)); + + } + } } diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 64566f4dab00..10a3519bfddd 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -3297,6 +3297,13 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # {valueType: "boolean", subSection: "advanced", defaultValue: "false", order: 153000, showEl: "${showAdvanced}"} # provisioner.genericProvisioner.allowBlankMatchingIds = +# Add disabled full sync daemon? +# {valueType: "boolean", subSection: "advanced", defaultValue: "false", order: 154000, showEl: "${showAdvanced}"} +# provisioner.genericProvisioner.addDisabledFullSyncDaemon = + +# Add disabled incremental sync daemon? +# {valueType: "boolean", subSection: "advanced", defaultValue: "false", order: 155000, showEl: "${showAdvanced}"} +# provisioner.genericProvisioner.addDisabledIncrementalSyncDaemon = ######################################## ## box provisioner @@ -3450,7 +3457,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.groupTableName = # groups table primary key column of group table -# {valueType: "string", subSection: "group2", order: 79400, showEl: "${operateOnGrouperGroups }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", subSection: "group", order: 79400, showEl: "${operateOnGrouperGroups }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.someSqlProvisioner.groupTableIdColumn = # Use separate table for group attributes @@ -3462,27 +3469,27 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.groupAttributesTableName = # column from group table which is the foreign key in the group attribute table. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79441, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group", order: 79441, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesGroupForeignKeyColumn = # name of the column in group attribute table that will store attribute names. Include schema name if necessary. -# {valueType: "string", subSection: "group2", defaultValue: "attribute_name", order: 79442, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group", defaultValue: "attribute_name", order: 79442, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeNameColumn = # name of the column in group attribute table that will store attribute values. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79443, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group", order: 79443, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeValueColumn = # if this is more complicated than just a simple select, put the query here optional, select * from groups where ... -# {valueType: "string", subSection: "group2", order: 79912, showEl: "${operateOnGrouperGroups && group2advanced }"} +# {valueType: "string", subSection: "group", order: 79912, showEl: "${operateOnGrouperGroups && group2advanced }"} # provisioner.someSqlProvisioner.groupSearchQuery = # name of the column in group attribute table that will store last modified timestamp. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79913, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}"} +# {valueType: "string", subSection: "group", order: 79913, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}"} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumn = # type of the last modified column. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79914, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} +# {valueType: "string", subSection: "group", order: 79914, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumnType = # Storage type @@ -4207,7 +4214,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisionerStartWith.sqlCommon.groupTableIdColumn = # group table primary key value -# {valueType: "string", order: 650, required: true, formElement: "dropdown", showEl: "${hasGroupTable}", optionValues: ["groupExtension", "groupIdIndex", "groupName", "groupPrimaryKey", "groupUuid", "other", "script"]} +# {valueType: "string", order: 650, required: true, formElement: "dropdown", showEl: "${hasGroupTable}", optionValues: ["groupExtension", "groupIdIndex", "groupName", "groupUuid", "other", "script"]} # provisionerStartWith.sqlCommon.groupTablePrimaryKeyValue = # group table column names @@ -4216,7 +4223,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # need group link? # {valueType: "boolean", order: 800, showEl: "${hasGroupTable}"} -# provisionerStartWith.sqlCommon.needGroupLink = +# provisionerStartWith.sqlCommon.hasTargetGroupLink = # has group attribute table? # {valueType: "boolean", order: 900, defaultValue: "false", showEl: "${hasGroupTable}"} @@ -4224,19 +4231,19 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # group attribute table name # {valueType: "string", order: 1000, required: true, showEl: "${hasGroupAttributeTable}"} -# provisionerStartWith.sqlCommon.groupAttributeTableName = +# provisionerStartWith.sqlCommon.groupAttributesTableName = # column name which is foreign key to group table # {valueType: "string", order: 1100, required: true, showEl: "${hasGroupAttributeTable}"} -# provisionerStartWith.sqlCommon.columnNameForeignKeyToGroupTable = +# provisionerStartWith.sqlCommon.groupAttributesGroupForeignKeyColumn = # column name which is the attribute name # {valueType: "string", order: 1200, required: true, showEl: "${hasGroupAttributeTable}"} -# provisionerStartWith.sqlCommon.groupAttributeNameColumnName = +# provisionerStartWith.sqlCommon.groupAttributesAttributeNameColumn = # column name which is the attribute value # {valueType: "string", order: 1300, required: true, showEl: "${hasGroupAttributeTable}"} -# provisionerStartWith.sqlCommon.groupAttributeValueColumnName = +# provisionerStartWith.sqlCommon.groupAttributesAttributeValueColumn = # membership attribute name # {valueType: "string", order: 1400, required: true, showEl: "${hasGroupAttributeTable && membershipStructure == 'groupAttributes'}"} @@ -4263,7 +4270,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisionerStartWith.sqlCommon.entityTableIdColumn = # entity table primary key value -# {valueType: "string", order: 2000, required: true, formElement: "dropdown", showEl: "${hasEntityTable}", optionValues: ["email", "entity_uuid", "entity_description", "entity_name", "other", "script", "subject_id", "subject_identifier0", "subject_identifier1", "subject_identifier2"]} +# {valueType: "string", order: 2000, required: true, formElement: "dropdown", showEl: "${hasEntityTable}", optionValues: ["email", "entityUuid", "entityDescription", "entityName", "other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} # provisionerStartWith.sqlCommon.entityTablePrimaryKeyValue = # other entity table column names @@ -4272,7 +4279,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # need entity link? # {valueType: "boolean", order: 2200, showEl: "${hasEntityTable}"} -# provisionerStartWith.sqlCommon.needEntityLink = +# provisionerStartWith.sqlCommon.hasTargetEntityLink = # has entity attribute table? # {valueType: "boolean", order: 2300, defaultValue: "false", showEl: "${hasEntityTable}"} @@ -4280,19 +4287,19 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # entity attribute table name # {valueType: "string", order: 2400, required: true, showEl: "${hasEntityAttributeTable}"} -# provisionerStartWith.sqlCommon.entityAttributeTableName = +# provisionerStartWith.sqlCommon.entityAttributesTableName = # column name which is foreign key to entity table # {valueType: "string", order: 2500, required: true, showEl: "${hasEntityAttributeTable}"} -# provisionerStartWith.sqlCommon.columnNameForeignKeyToEntityTable = +# provisionerStartWith.sqlCommon.entityAttributesEntityForeignKeyColumn = # column name which is the attribute name # {valueType: "string", order: 2600, required: true, showEl: "${hasEntityAttributeTable}"} -# provisionerStartWith.sqlCommon.entityAttributeNameColumnName = +# provisionerStartWith.sqlCommon.entityAttributesAttributeNameColumn = # column name which is the attribute value # {valueType: "string", order: 2700, required: true, showEl: "${hasEntityAttributeTable}"} -# provisionerStartWith.sqlCommon.entityAttributeValueColumnName = +# provisionerStartWith.sqlCommon.entityAttributesAttributeValueColumn = # membership attribute name # {valueType: "string", order: 2800, required: true, showEl: "${hasEntityAttributeTable && membershipStructure == 'entityAttributes'}"} @@ -4306,28 +4313,24 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # {valueType: "string", order: 3000, showEl: "${hasEntityAttributeTable}"} # provisionerStartWith.sqlCommon.entityOtherAttributeNames = -# has membership table? -# {valueType: "boolean", order: 3100, defaultValue: "false", showEl: "${userAttributesType != null}"} -# provisionerStartWith.sqlCommon.hasMembershipTable = - # membership table name -# {valueType: "string", order: 3150, required: true, showEl: "${hasMembershipTable}"} +# {valueType: "string", order: 3150, required: true, showEl: "${membershipStructure == 'membershipObjects'}"} # provisionerStartWith.sqlCommon.membershipTableName = # group column -# {valueType: "string", order: 3200, required: true, showEl: "${hasMembershipTable}"} +# {valueType: "string", order: 3200, required: true, showEl: "${membershipStructure == 'membershipObjects'}"} # provisionerStartWith.sqlCommon.membershipTableGroupColumn = # group value -# {valueType: "string", order: 3300, required: true, formElement: "dropdown", showEl: "${hasMembershipTable}", optionValues: ["groupExtension", "groupIdIndex", "groupName", "groupPrimaryKey", "groupUuid", "other", "script"]} +# {valueType: "string", order: 3300, required: true, formElement: "dropdown", showEl: "${membershipStructure == 'membershipObjects'}", optionValues: ["groupExtension", "groupIdIndex", "groupName", "groupPrimaryKey", "groupUuid", "other", "script"]} # provisionerStartWith.sqlCommon.membershipTableGroupValue = # entity column -# {valueType: "string", order: 3400, required: true, showEl: "${hasMembershipTable}"} +# {valueType: "string", order: 3400, required: true, showEl: "${membershipStructure == 'membershipObjects'}"} # provisionerStartWith.sqlCommon.membershipTableEntityColumn = # entity value -# {valueType: "string", order: 3500, required: true, formElement: "dropdown", showEl: "${hasMembershipTable}", optionValues: ["entityPrimaryKey", "other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} +# {valueType: "string", order: 3500, required: true, formElement: "dropdown", showEl: "${membershipStructure == 'membershipObjects'}", optionValues: ["entityPrimaryKey", "other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} # provisionerStartWith.sqlCommon.membershipTableEntityValue = # add disabled full sync daemon? @@ -4616,7 +4619,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisionerStartWith.duoCommon.manageEntities = # Entity user name -# {valueType: "string", order: 600, formElement: "dropdown", showEl: "${manageEntities == true}", optionValues: ["other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} +# {valueType: "string", order: 600, required: true, formElement: "dropdown", showEl: "${manageEntities == true}", optionValues: ["other", "script", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"]} # provisionerStartWith.duoCommon.entityUserName = # Entity name subject attribute diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index c4e16f32abaa..17c0a634e346 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -12694,6 +12694,10 @@ grouperStartWithEntityTableConfigurationValidationUserIdColumnNotFound = Error: grouperStartWithGroupTableConfigurationValidationGroupColumnsNotFound = Error: '$$groupTableColumns$$' columns not found grouperStartWithEntityTableConfigurationValidationEntityColumnsNotFound = Error: '$$userTableColumns$$' columns not found +grouperStartWithInvalidMembershipStructureHasMembershipTable = If membership structure is not notApplicable then has membership table must be true + +subjectSourceEntityResolverAttributesMoreThanThreeAttributes = There cannot be more than three attributes + grouperStartWithLdapConfigurationValidationExternalSystemNotActiveDirectory = Error: External system with id '$$externalSystemId$$' is not of type active directory. grouperStartWithLdapConfigurationValidationSubjectAttributesNotValid = Error: '$$subjectAttributes$$' not valid @@ -13579,23 +13583,23 @@ config.SqlProvisioningStartWith.attribute.groupTablePrimaryKeyValue.description config.SqlProvisioningStartWith.attribute.groupTableColumnNames.label = Group table column names config.SqlProvisioningStartWith.attribute.groupTableColumnNames.description = Group table column names -config.SqlProvisioningStartWith.attribute.needGroupLink.label = Need group link? -config.SqlProvisioningStartWith.attribute.needGroupLink.description = Need group link? +config.SqlProvisioningStartWith.attribute.hasTargetGroupLink.label = Need group link? +config.SqlProvisioningStartWith.attribute.hasTargetGroupLink.description = Need group link? config.SqlProvisioningStartWith.attribute.hasGroupAttributeTable.label = Has group attribute table? config.SqlProvisioningStartWith.attribute.hasGroupAttributeTable.description = Has group attribute table? -config.SqlProvisioningStartWith.attribute.groupAttributeTableName.label = Group attribute table name -config.SqlProvisioningStartWith.attribute.groupAttributeTableName.description = Group attribute table name +config.SqlProvisioningStartWith.attribute.groupAttributesTableName.label = Group attribute table name +config.SqlProvisioningStartWith.attribute.groupAttributesTableName.description = Group attribute table name -config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToGroupTable.label = Column foreign key to group -config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToGroupTable.description = Column name which is foreign key to group table, e.g. group_uuid +config.SqlProvisioningStartWith.attribute.groupAttributesGroupForeignKeyColumn.label = Column foreign key to group +config.SqlProvisioningStartWith.attribute.groupAttributesGroupForeignKeyColumn.description = Column name which is foreign key to group table, e.g. group_uuid -config.SqlProvisioningStartWith.attribute.groupAttributeNameColumnName.label = Attribute name column -config.SqlProvisioningStartWith.attribute.groupAttributeNameColumnName.description = Column name which is the attribute name, e.g. attribute_name +config.SqlProvisioningStartWith.attribute.groupAttributesAttributeNameColumn.label = Attribute name column +config.SqlProvisioningStartWith.attribute.groupAttributesAttributeNameColumn.description = Column name which is the attribute name, e.g. attribute_name -config.SqlProvisioningStartWith.attribute.groupAttributeValueColumnName.label = Attribute value column -config.SqlProvisioningStartWith.attribute.groupAttributeValueColumnName.description = Column name which is the attribute value, e.g. attribute_value +config.SqlProvisioningStartWith.attribute.groupAttributesAttributeValueColumn.label = Attribute value column +config.SqlProvisioningStartWith.attribute.groupAttributesAttributeValueColumn.description = Column name which is the attribute value, e.g. attribute_value config.SqlProvisioningStartWith.attribute.groupMembershipAttributeName.label = Group membership attribute name config.SqlProvisioningStartWith.attribute.groupMembershipAttributeName.description = Group membership attribute name @@ -13621,8 +13625,8 @@ config.SqlProvisioningStartWith.attribute.entityTablePrimaryKeyValue.description config.SqlProvisioningStartWith.attribute.entityTableColumnNames.label = Entity table column names config.SqlProvisioningStartWith.attribute.entityTableColumnNames.description = Entity table column names -config.SqlProvisioningStartWith.attribute.needEntityLink.label = Need entity link? -config.SqlProvisioningStartWith.attribute.needEntityLink.description = Need entity link? +config.SqlProvisioningStartWith.attribute.hasTargetEntityLink.label = Need entity link? +config.SqlProvisioningStartWith.attribute.hasTargetEntityLink.description = Need entity link? config.SqlProvisioningStartWith.attribute.hasEntityAttributeTable.label = Has entity attribute table? config.SqlProvisioningStartWith.attribute.hasEntityAttributeTable.description = Has entity attribute table? @@ -13630,14 +13634,14 @@ config.SqlProvisioningStartWith.attribute.hasEntityAttributeTable.description = config.SqlProvisioningStartWith.attribute.entityAttributeTableName.label = Entity attribute table name config.SqlProvisioningStartWith.attribute.entityAttributeTableName.description = Entity attribute table name -config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToEntityTable.label = Column foreign key to entity -config.SqlProvisioningStartWith.attribute.columnNameForeignKeyToEntityTable.description = Column name which is foreign key to entity table, e.g. entity_uuid +config.SqlProvisioningStartWith.attribute.entityAttributesEntityForeignKeyColumn.label = Column foreign key to entity +config.SqlProvisioningStartWith.attribute.entityAttributesEntityForeignKeyColumn.description = Column name which is foreign key to entity table, e.g. entity_uuid -config.SqlProvisioningStartWith.attribute.entityAttributeNameColumnName.label = Attribute name column -config.SqlProvisioningStartWith.attribute.entityAttributeNameColumnName.description = Column name which is the attribute name, e.g. attribute_name +config.SqlProvisioningStartWith.attribute.entityAttributesAttributeNameColumn.label = Attribute name column +config.SqlProvisioningStartWith.attribute.entityAttributesAttributeNameColumn.description = Column name which is the attribute name, e.g. attribute_name -config.SqlProvisioningStartWith.attribute.entityAttributeValueColumnName.label = Attribute value column -config.SqlProvisioningStartWith.attribute.entityAttributeValueColumnName.description = Column name which is the attribute value, e.g. attribute_value +config.SqlProvisioningStartWith.attribute.entityAttributesAttributeValueColumn.label = Attribute value column +config.SqlProvisioningStartWith.attribute.entityAttributesAttributeValueColumn.description = Column name which is the attribute value, e.g. attribute_value config.SqlProvisioningStartWith.attribute.entityMembershipAttributeName.label = Entity membership attribute name config.SqlProvisioningStartWith.attribute.entityMembershipAttributeName.description = Entity membership attribute name diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java index 3b1ee1e82862..dea36c3c722c 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/config/GrouperConfigurationModuleBase.java @@ -1170,7 +1170,7 @@ private GrouperConfigurationModuleAttribute buildConfigurationModuleAttribute( return grouperConfigModuleAttribute; } - protected void populateValuesLabelsFromOptionValueClass( + public void populateValuesLabelsFromOptionValueClass( Map attributesSoFar, GrouperConfigurationModuleAttribute grouperConfigModuleAttribute) { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java index 128ec1149db6..cb13d77f55d7 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java @@ -5,21 +5,31 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import edu.internet2.middleware.grouper.GrouperSession; import edu.internet2.middleware.grouper.app.azure.AzureProvisionerConfiguration; import edu.internet2.middleware.grouper.app.config.GrouperConfigurationModuleAttribute; import edu.internet2.middleware.grouper.app.config.GrouperConfigurationModuleBase; +import edu.internet2.middleware.grouper.app.daemon.GrouperDaemonOtherJobProvisioningFullSyncConfiguration; +import edu.internet2.middleware.grouper.app.daemon.GrouperDaemonProvisioningIncrementalSyncConfiguration; import edu.internet2.middleware.grouper.app.duo.DuoProvisionerConfiguration; import edu.internet2.middleware.grouper.app.duo.role.DuoRoleProvisionerConfiguration; import edu.internet2.middleware.grouper.app.google.GoogleProvisionerConfiguration; import edu.internet2.middleware.grouper.app.ldapProvisioning.LdapProvisionerConfiguration; +import edu.internet2.middleware.grouper.app.loader.GrouperLoader; import edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig; import edu.internet2.middleware.grouper.app.messagingProvisioning.MessagingProvisionerConfiguration; import edu.internet2.middleware.grouper.app.scim2Provisioning.GrouperScim2Configuration; import edu.internet2.middleware.grouper.app.sqlProvisioning.SqlProvisionerConfiguration; import edu.internet2.middleware.grouper.cfg.dbConfig.ConfigItemFormElement; +import edu.internet2.middleware.grouper.exception.GrouperSessionException; +import edu.internet2.middleware.grouper.misc.GrouperSessionHandler; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSync; import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncDao; @@ -119,6 +129,69 @@ public void deleteConfig(boolean fromUi) { } grouperSync.getGcGrouperSyncDao().delete(); + + // delete full sync and incremental sync daemon + boolean foundConfig = false; + + Pattern pattern = Pattern.compile("^otherJob\\.(.*)\\.provisionerConfigId$"); + Set configIds = GrouperLoaderConfig.retrieveConfig().propertyConfigIds(pattern); + + for (String configId: configIds) { + String className = "otherJob."+configId+".class"; + String provisionerConfigId = "otherJob."+configId+".provisionerConfigId"; + if (StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(className), GrouperProvisioningFullSyncJob.class.getName()) && + StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(provisionerConfigId), getConfigId() )) { + foundConfig = true; + } + } + + if (foundConfig) { + + GrouperDaemonOtherJobProvisioningFullSyncConfiguration fullSyncConfig = new GrouperDaemonOtherJobProvisioningFullSyncConfiguration(); + fullSyncConfig.setConfigId("provisioner_full_"+getConfigId()); + + fullSyncConfig.deleteConfig(true); + + try { + Scheduler scheduler = GrouperLoader.schedulerFactory().getScheduler(); + + JobKey jobKey = new JobKey(fullSyncConfig.getDaemonJobPrefix()+fullSyncConfig.getConfigId()); + scheduler.deleteJob(jobKey); + } catch (Exception e) { + throw new RuntimeException("Could not delete full sync daemon with job key "+fullSyncConfig.getDaemonJobPrefix()+fullSyncConfig.getConfigId()); + } + + } + + pattern = Pattern.compile("^changeLog\\.consumer\\.(.*)\\.provisionerConfigId$"); + configIds = GrouperLoaderConfig.retrieveConfig().propertyConfigIds(pattern); + foundConfig = false; + + for (String configId: configIds) { + String className = "changeLog.consumer."+configId+".publisher.class"; + String provisionerConfigId = "changeLog.consumer."+configId+".provisionerConfigId"; + if (StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(className), ProvisioningConsumer.class.getName()) && + StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(provisionerConfigId), getConfigId() )) { + foundConfig = true; + } + } + + if (foundConfig) { + GrouperDaemonProvisioningIncrementalSyncConfiguration incrementalSyncConfig = new GrouperDaemonProvisioningIncrementalSyncConfiguration(); + incrementalSyncConfig.setConfigId("provisioner_incremental_"+getConfigId()); + incrementalSyncConfig.deleteConfig(true); + + try { + Scheduler scheduler = GrouperLoader.schedulerFactory().getScheduler(); + + JobKey jobKey = new JobKey(incrementalSyncConfig.getDaemonJobPrefix()+incrementalSyncConfig.getConfigId()); + scheduler.deleteJob(jobKey); + } catch (Exception e) { + throw new RuntimeException("Could not delete incremental sync daemon with job key "+incrementalSyncConfig.getDaemonJobPrefix()+incrementalSyncConfig.getConfigId()); + } + } + + } /** @@ -299,6 +372,137 @@ public void correctFormFieldsForExpressionLanguageValues() { } } + + @Override + public void insertConfig(boolean fromUi, StringBuilder message, + List errorsToDisplay, Map validationErrorsToDisplay, + List actionsPerformed) { + + super.insertConfig(fromUi, message, errorsToDisplay, validationErrorsToDisplay, + actionsPerformed); + + if (errorsToDisplay.size() == 0 && validationErrorsToDisplay.size() == 0) { + + GrouperConfigurationModuleAttribute disabledFullSyncAttribute = this.retrieveAttributes().get("addDisabledFullSyncDaemon"); + + if (disabledFullSyncAttribute != null && GrouperUtil.booleanValue(disabledFullSyncAttribute.getValueOrExpressionEvaluation(), false)) { + + boolean foundConfig = false; + + Pattern pattern = Pattern.compile("^otherJob\\.(.*)\\.provisionerConfigId$"); + Set configIds = GrouperLoaderConfig.retrieveConfig().propertyConfigIds(pattern); + + for (String configId: configIds) { + String className = "otherJob."+configId+".class"; + String provisionerConfigId = "otherJob."+configId+".provisionerConfigId"; + if (StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(className), GrouperProvisioningFullSyncJob.class.getName()) && + StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(provisionerConfigId), getConfigId() )) { + foundConfig = true; + } + } + + + if (!foundConfig) { + + GrouperDaemonOtherJobProvisioningFullSyncConfiguration fullSyncConfig = new GrouperDaemonOtherJobProvisioningFullSyncConfiguration(); + fullSyncConfig.setConfigId("provisioner_full_"+getConfigId()); + + Map attributes = fullSyncConfig.retrieveAttributes(); + + attributes.get("class").setValue("edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningFullSyncJob"); + attributes.get("provisionerConfigId").setValue(this.getConfigId()); + + //TODO what should be the cron expression + attributes.get("quartzCron").setValue("0 0 4 * * ?"); + + fullSyncConfig.insertConfig(true, message, errorsToDisplay, validationErrorsToDisplay, new ArrayList()); + + if (errorsToDisplay.size() > 0 || validationErrorsToDisplay.size() > 0) { + return; + } + + try { + GrouperLoader.scheduleJobs(); + Scheduler scheduler = GrouperLoader.schedulerFactory().getScheduler(); + JobKey jobKey = new JobKey(fullSyncConfig.getDaemonJobPrefix()+fullSyncConfig.getConfigId()); + scheduler.pauseJob(jobKey); + } catch (SchedulerException e) { + throw new RuntimeException("Could not pause the job successfully"); + } + + } + + } + + GrouperConfigurationModuleAttribute disabledIncrementalSyncAttribute = this.retrieveAttributes().get("addDisabledIncrementalSyncDaemon"); + + if (disabledIncrementalSyncAttribute != null && GrouperUtil.booleanValue(disabledIncrementalSyncAttribute.getValueOrExpressionEvaluation(), false)) { + + + boolean foundConfig = false; + + Pattern pattern = Pattern.compile("^changeLog\\.consumer\\.(.*)\\.provisionerConfigId$"); + Set configIds = GrouperLoaderConfig.retrieveConfig().propertyConfigIds(pattern); + + for (String configId: configIds) { + String className = "changeLog.consumer."+configId+".publisher.class"; + String provisionerConfigId = "changeLog.consumer."+configId+".provisionerConfigId"; + if (StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(className), ProvisioningConsumer.class.getName()) && + StringUtils.equals(GrouperLoaderConfig.retrieveConfig().propertyValueString(provisionerConfigId), getConfigId() )) { + foundConfig = true; + } + } + + + if (!foundConfig) { + + GrouperDaemonProvisioningIncrementalSyncConfiguration incrementalSyncConfig = new GrouperDaemonProvisioningIncrementalSyncConfiguration(); + incrementalSyncConfig.setConfigId("provisioner_incremental_"+getConfigId()); + + Map attributes = incrementalSyncConfig.retrieveAttributes(); + + attributes.get("class").setValue("edu.internet2.middleware.grouper.changeLog.esb.consumer.EsbConsumer"); + attributes.get("provisionerConfigId").setValue(this.getConfigId()); + + attributes.get("quartzCron").setValue("0 * * * * ?"); + attributes.get("publisher.class").setValue("edu.internet2.middleware.grouper.app.provisioning.ProvisioningConsumer"); + + GrouperSession.internal_callbackRootGrouperSession(new GrouperSessionHandler() { + + @Override + public Object callback(GrouperSession grouperSession) throws GrouperSessionException { + incrementalSyncConfig.insertConfig(true, message, errorsToDisplay, validationErrorsToDisplay, new ArrayList()); + return null; + } + }); + + if (errorsToDisplay.size() > 0 || validationErrorsToDisplay.size() > 0) { + return; + } + + try { + GrouperLoader.scheduleJobs(); + Scheduler scheduler = GrouperLoader.schedulerFactory().getScheduler(); + JobKey jobKey = new JobKey(incrementalSyncConfig.getDaemonJobPrefix()+incrementalSyncConfig.getConfigId()); + scheduler.pauseJob(jobKey); + } catch (SchedulerException e) { + throw new RuntimeException("Could not pause the job successfully"); + } + + } + + + } + + + } + + + } + + + + } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java index d7e96acfd63e..e271cc321e21 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java @@ -1,6 +1,7 @@ package edu.internet2.middleware.grouper.app.sqlProvisioning; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -38,6 +39,11 @@ public Map screenRedraw(Map suffixToValue, Set screenRedraw(Map suffixToValue, Set screenRedraw(Map suffixToValue, Set screenRedraw(Map suffixToValue, Set screenRedraw(Map suffixToValue, Set screenRedraw(Map suffixToValue, Set errorsToDisplay, Map< } } + GrouperConfigurationModuleAttribute membershipStructureAttribute = this.retrieveAttributes().get("membershipStructure"); + GrouperConfigurationModuleAttribute hasMembershipTableAttribute = this.retrieveAttributes().get("hasMembershipTable"); + + if (membershipStructureAttribute != null && StringUtils.equals(membershipStructureAttribute.getValue(), "notApplicable") && + hasMembershipTableAttribute != null && GrouperUtil.booleanValue(hasMembershipTableAttribute.getValue(), false)) { + GrouperTextContainer.textOrNull("grouperStartWithInvalidMembershipStructureHasMembershipTable"); + } + + GrouperConfigurationModuleAttribute subjectSourceEntityResoverModuleAttribute = this.retrieveAttributes().get("subjectSourceEntityResolverAttributes"); + if (subjectSourceEntityResoverModuleAttribute != null && StringUtils.isNotBlank(subjectSourceEntityResoverModuleAttribute.getValue())) { + String commaSeparatedResolverAttributes = subjectSourceEntityResoverModuleAttribute.getValue(); + List list = GrouperUtil.splitTrimToList(commaSeparatedResolverAttributes, ","); + if (list.size() > 3) { + String errorMessage = GrouperTextContainer.textOrNull("subjectSourceEntityResolverAttributesMoreThanThreeAttributes"); + validationErrorsToDisplay.put(subjectSourceEntityResoverModuleAttribute.getHtmlForElementIdHandle(), errorMessage); + } + } + + } @@ -312,5 +342,321 @@ private void validateTableAndColumns(Map validationErrorsToDispl public void populateProvisionerConfigurationValuesFromStartWith(Map startWithSuffixToValue, Map provisionerSuffixToValue) { + if (StringUtils.equals(startWithSuffixToValue.get("userAttributesType"), "entityResolver") || StringUtils.equals(startWithSuffixToValue.get("userAttributesType"), "subjectSourceAndEntityResolver")) { + provisionerSuffixToValue.put("entityResolver.entityAttributesNotInSubjectSource", "true"); + } + + if (GrouperUtil.booleanValue(startWithSuffixToValue.get("hasTargetEntityLink"), false)) { + provisionerSuffixToValue.put("operateOnGrouperEntities", "true"); + + provisionerSuffixToValue.put("entityAttributeValueCacheHas", "true"); + provisionerSuffixToValue.put("entityAttributeValueCache0has", "true"); + provisionerSuffixToValue.put("entityAttributeValueCache0source", "grouper"); + provisionerSuffixToValue.put("entityAttributeValueCache0type", "entityAttribute"); + + //TODO debug why this is not getting populated + provisionerSuffixToValue.put("entityAttributeValueCache0entityAttribute", startWithSuffixToValue.get("entityTableIdColumn")); + + } + + if (StringUtils.equals(startWithSuffixToValue.get("userAttributesType"), "subjectSource") || StringUtils.equals(startWithSuffixToValue.get("userAttributesType"), "subjectSourceAndEntityResolver")) { + provisionerSuffixToValue.put("operateOnGrouperEntities", "true"); + + String attributesCommaSeparated = startWithSuffixToValue.get("subjectSourceEntityResolverAttributes"); + if (StringUtils.isNotBlank(attributesCommaSeparated)) { + provisionerSuffixToValue.put("entityAttributeValueCacheHas", "true"); + String[] attributes = GrouperUtil.splitTrim(attributesCommaSeparated, ","); + // by this time the validation is already done that there are no more than 3 attributes + for (int i=0; i otherAttributeNamesSet = new HashSet<>(); + + String entityMembershipAttributeName = null; + + if (GrouperUtil.booleanValue(startWithSuffixToValue.get("hasEntityAttributeTable"), false)) { + provisionerSuffixToValue.put("useSeparateTableForEntityAttributes", "true"); + + String otherAttributeNames = startWithSuffixToValue.get("entityOtherAttributeNames"); + otherAttributeNamesSet = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(otherAttributeNames, ",")); + + entityMembershipAttributeName = startWithSuffixToValue.get("entityMembershipAttributeName"); + + } + + String commaSeparatedColNames = startWithSuffixToValue.get("entityTableColumnNames"); + Set entityTableCols = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(commaSeparatedColNames, ",")); + + int numberOfEntityAttributes = entityTableCols.size() + otherAttributeNamesSet.size() + 1; // +1 for entityTableIdColumn + + if (StringUtils.isNotBlank(entityMembershipAttributeName)) { + if (entityTableCols.contains(entityMembershipAttributeName) || otherAttributeNamesSet.contains(entityMembershipAttributeName) || StringUtils.equalsIgnoreCase(startWithSuffixToValue.get("entityTableIdColumn"), entityMembershipAttributeName)) { + provisionerSuffixToValue.put("entityMembershipAttributeName", entityMembershipAttributeName); + } else { + numberOfEntityAttributes++; + } + } + + provisionerSuffixToValue.put("numberOfEntityAttributes", numberOfEntityAttributes); + + provisionerSuffixToValue.put("targetEntityAttribute.0.name", startWithSuffixToValue.get("entityTableIdColumn")); + provisionerSuffixToValue.put("targetEntityAttribute.0.translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute.0.storageType", "entityTableColumn"); + + String startWithEntityTablePrimaryKeyValue = startWithSuffixToValue.get("entityTablePrimaryKeyValue"); + String grouperProvisioningEntityFieldValue = null; + + if (StringUtils.equals("email", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "email"; + } else if (StringUtils.equals("entityUuid", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "id"; + } else if (StringUtils.equals("entityDescription", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "description"; + } else if (StringUtils.equals("entityName", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "name"; + } else if (StringUtils.equals("subjectId", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "subjectId"; + } else if (StringUtils.equals("subjectIdentifier0", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "subjectIdentifier0"; + } else if (StringUtils.equals("subjectIdentifier1", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "subjectIdentifier1"; + } else if (StringUtils.equals("subjectIdentifier2", startWithEntityTablePrimaryKeyValue)) { + grouperProvisioningEntityFieldValue = "subjectIdentifier2"; + } else if (StringUtils.equals("other", startWithEntityTablePrimaryKeyValue) || StringUtils.equals("script", startWithEntityTablePrimaryKeyValue)) { + provisionerSuffixToValue.put("targetEntityAttribute.0.translateExpressionType", "translationScript"); + } + + if (grouperProvisioningEntityFieldValue != null) { + provisionerSuffixToValue.put("targetEntityAttribute.0.translateFromGrouperProvisioningEntityField", grouperProvisioningEntityFieldValue); + } + + int i = 1; + for (String entityTableCol: entityTableCols) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".name", entityTableCol); + + if (StringUtils.equalsIgnoreCase(entityTableCol, "entity_uuid") || StringUtils.equalsIgnoreCase(entityTableCol, "uuid") || StringUtils.equalsIgnoreCase(entityTableCol, "id")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "id"); + } else if (StringUtils.equalsIgnoreCase(entityTableCol, "entity_name") || StringUtils.equalsIgnoreCase(entityTableCol, "name")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "name"); + } else if (StringUtils.equalsIgnoreCase(entityTableCol, "email")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "email"); + } else if (StringUtils.equalsIgnoreCase(entityTableCol, "entity_description")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "description"); + } else if (StringUtils.equalsIgnoreCase(entityTableCol, "subject_id")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "subjectId"); + } else if (StringUtils.equalsIgnoreCase(entityTableCol, "subject_identifier0")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "subjectIdentifier0"); + } else if (StringUtils.equalsIgnoreCase(entityTableCol, "subject_identifier1")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "subjectIdentifier1"); + } else if (StringUtils.equalsIgnoreCase(entityTableCol, "subject_identifier2")) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateExpressionType", "grouperProvisioningEntityField"); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".translateFromGrouperProvisioningEntityField", "subjectIdentifier2"); + } + + if (GrouperUtil.booleanValue(startWithSuffixToValue.get("hasEntityAttributeTable"), false)) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".storageType", "entityTableColumn"); // storageType is visible only when hasEntityAttributeTable is true + } + + i++; + } + + for (String otherAttributeCol: otherAttributeNamesSet) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".name", otherAttributeCol); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".storageType", "separateAttributesTable"); + i++; + } + + if (i <= numberOfEntityAttributes - 1) { + provisionerSuffixToValue.put("targetEntityAttribute."+i+".name", entityMembershipAttributeName); + provisionerSuffixToValue.put("targetEntityAttribute."+i+".storageType", "separateAttributesTable"); + i++; + } + + //TODO debug why this is not getting populated + provisionerSuffixToValue.put("userPrimaryKey", startWithSuffixToValue.get("entityTableIdColumn")); + + } + + if (GrouperUtil.booleanValue(startWithSuffixToValue.get("hasGroupTable"), false)) { + + provisionerSuffixToValue.put("operateOnGrouperGroups", "true"); + provisionerSuffixToValue.put("groupTableName", startWithSuffixToValue.get("groupTableName")); + + Set otherAttributeNamesSet = new HashSet<>(); + String groupMembershipAttributeName = null; + + //TODO Later + String groupMembershipAttributeValue = null; + + if (GrouperUtil.booleanValue(startWithSuffixToValue.get("hasGroupAttributeTable"), false)) { + provisionerSuffixToValue.put("useSeparateTableForGroupAttributes", "true"); + groupMembershipAttributeName = startWithSuffixToValue.get("groupMembershipAttributeName"); + groupMembershipAttributeValue = startWithSuffixToValue.get("groupMembershipAttributeValue"); + + String otherAttributeNames = startWithSuffixToValue.get("groupOtherAttributeNames"); + otherAttributeNamesSet = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(otherAttributeNames, ",")); + + } + + String commaSeparatedColNames = startWithSuffixToValue.get("groupTableColumnNames"); + Set groupTableCols = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(commaSeparatedColNames, ",")); + + int numberOfGroupAttributes = groupTableCols.size() + otherAttributeNamesSet.size() + 1; // +1 for groupTableIdColumn + + if (StringUtils.isNotBlank(groupMembershipAttributeName)) { + if (groupTableCols.contains(groupMembershipAttributeName) || otherAttributeNamesSet.contains(groupMembershipAttributeName) || StringUtils.equalsIgnoreCase(startWithSuffixToValue.get("groupTableIdColumn"), groupMembershipAttributeName)) { + provisionerSuffixToValue.put("groupMembershipAttributeName", groupMembershipAttributeName); + } else { + numberOfGroupAttributes++; + } + } + + provisionerSuffixToValue.put("numberOfGroupAttributes", numberOfGroupAttributes); + + provisionerSuffixToValue.put("targetGroupAttribute.0.name", startWithSuffixToValue.get("groupTableIdColumn")); + provisionerSuffixToValue.put("targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); + + String startWithGroupTablePrimaryKeyValue = startWithSuffixToValue.get("groupTablePrimaryKeyValue"); + String grouperProvisioningGroupFieldValue = null; + + if (StringUtils.equals("groupExtension", startWithGroupTablePrimaryKeyValue)) { + grouperProvisioningGroupFieldValue = "extension"; + } else if (StringUtils.equals("groupIdIndex", startWithGroupTablePrimaryKeyValue)) { + grouperProvisioningGroupFieldValue = "idIndex"; + } else if (StringUtils.equals("groupName", startWithGroupTablePrimaryKeyValue)) { + grouperProvisioningGroupFieldValue = "name"; + } else if (StringUtils.equals("groupUuid", startWithGroupTablePrimaryKeyValue)) { + grouperProvisioningGroupFieldValue = "id"; + } else if (StringUtils.equals("other", startWithGroupTablePrimaryKeyValue) || StringUtils.equals("script", startWithGroupTablePrimaryKeyValue)) { + provisionerSuffixToValue.put("targetGroupAttribute.0.translateExpressionType", "translationScript"); + } + + if (grouperProvisioningGroupFieldValue != null) { + provisionerSuffixToValue.put("targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", grouperProvisioningGroupFieldValue); + } + + provisionerSuffixToValue.put("groupTableIdColumn", startWithSuffixToValue.get("groupTableIdColumn")); + + int i = 1; + for (String groupTableCol: groupTableCols) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".name", groupTableCol); + + if (StringUtils.equalsIgnoreCase(groupTableCol, "group_uuid") || StringUtils.equalsIgnoreCase(groupTableCol, "uuid") || StringUtils.equalsIgnoreCase(groupTableCol, "id")) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateExpressionType", "grouperProvisioningGroupField"); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateFromGrouperProvisioningGroupField", "id"); + } else if (StringUtils.equalsIgnoreCase(groupTableCol, "group_name") || StringUtils.equalsIgnoreCase(groupTableCol, "name")) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateExpressionType", "grouperProvisioningGroupField"); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateFromGrouperProvisioningGroupField", "name"); + } else if (StringUtils.equalsIgnoreCase(groupTableCol, "group_id_index") || StringUtils.equalsIgnoreCase(groupTableCol, "id_index")) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateExpressionType", "grouperProvisioningGroupField"); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateFromGrouperProvisioningGroupField", "idIndex"); + } else if (StringUtils.equalsIgnoreCase(groupTableCol, "group_extension") || StringUtils.equalsIgnoreCase(groupTableCol, "extension")) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateExpressionType", "grouperProvisioningGroupField"); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateFromGrouperProvisioningGroupField", "extension"); + } else if (StringUtils.equalsIgnoreCase(groupTableCol, "group_display_name") || StringUtils.equalsIgnoreCase(groupTableCol, "display_name")) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateExpressionType", "grouperProvisioningGroupField"); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateFromGrouperProvisioningGroupField", "displayName"); + } else if (StringUtils.equalsIgnoreCase(groupTableCol, "group_display_extension") || StringUtils.equalsIgnoreCase(groupTableCol, "display_extension")) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateExpressionType", "grouperProvisioningGroupField"); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateFromGrouperProvisioningGroupField", "displayExtension"); + } else if (StringUtils.equalsIgnoreCase(groupTableCol, "group_description") || StringUtils.equalsIgnoreCase(groupTableCol, "description")) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateExpressionType", "grouperProvisioningGroupField"); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".translateFromGrouperProvisioningGroupField", "description"); + } + + if (GrouperUtil.booleanValue(startWithSuffixToValue.get("hasGroupAttributeTable"), false)) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".storageType", "groupTableColumn"); // storageType is visible only when hasGroupAttributeTable is true + } + + i++; + } + + for (String otherAttributeCol: otherAttributeNamesSet) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".name", otherAttributeCol); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".storageType", "separateAttributesTable"); + i++; + } + + if ( i <= numberOfGroupAttributes - 1) { + provisionerSuffixToValue.put("targetGroupAttribute."+i+".name", groupMembershipAttributeName); + provisionerSuffixToValue.put("targetGroupAttribute."+i+".storageType", "separateAttributesTable"); + i++; + } + + } + + if (StringUtils.equals(startWithSuffixToValue.get("membershipStructure"), "membershipObjects") || + StringUtils.equals(startWithSuffixToValue.get("membershipStructure"), "groupAttributes") || + StringUtils.equals(startWithSuffixToValue.get("membershipStructure"), "entityAttributes")) { + + provisionerSuffixToValue.put("operateOnGrouperMemberships", "true"); + + provisionerSuffixToValue.put("provisioningType", startWithSuffixToValue.get("membershipStructure")); + } + + if (StringUtils.equals(startWithSuffixToValue.get("membershipStructure"), "membershipObjects")) { + + provisionerSuffixToValue.put("membershipTableName", startWithSuffixToValue.get("membershipTableName")); + + String membershipTableGroupColumn = startWithSuffixToValue.get("membershipTableGroupColumn"); + + //TODO populate it later + String membershipTableGroupValue = startWithSuffixToValue.get("membershipTableGroupValue"); + + provisionerSuffixToValue.put("numberOfMembershipAttributes", 2); + + if (StringUtils.equals(membershipTableGroupValue, "groupName") || + StringUtils.equals(membershipTableGroupValue, "groupExtension") || + StringUtils.equals(membershipTableGroupValue, "groupIdIndex") || + StringUtils.equals(membershipTableGroupValue, "groupUUID")) { + +// provisionerSuffixToValue.put("numberOfMembershipAttributes", 3); +// provisionerSuffixToValue.put("targetMembershipAttribute.2.translateExpressionType", "grouperProvisioningGroupField"); +// provisionerSuffixToValue.put("targetMembershipAttribute.2.translateFromGrouperProvisioningGroupField", membershipTableGroupValue); + + } + + String membershipTableEntityColumn = startWithSuffixToValue.get("membershipTableEntityColumn"); + + + provisionerSuffixToValue.put("targetMembershipAttribute.0.name", membershipTableGroupColumn); + // provisionerSuffixToValue.put("targetMembershipAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); + //provisionerSuffixToValue.put("targetMembershipAttribute.0.translateFromGrouperProvisioningGroupField", startWithSuffixToValue.get("membershipTableGroupValue")); + + provisionerSuffixToValue.put("targetMembershipAttribute.1.name", membershipTableEntityColumn); + // provisionerSuffixToValue.put("targetMembershipAttribute.1.translateExpressionType", "grouperProvisioningEntityField"); + //provisionerSuffixToValue.put("targetMembershipAttribute.1.translateFromGrouperProvisioningEntityField", startWithSuffixToValue.get("membershipTableEntityValue")); + + + provisionerSuffixToValue.put("membershipGroupForeignKeyColumn", membershipTableGroupColumn); + provisionerSuffixToValue.put("membershipEntityForeignKeyColumn", membershipTableEntityColumn); + } + + if (GrouperUtil.booleanValue(startWithSuffixToValue.get("addDisabledFullSyncDaemon"), false) || GrouperUtil.booleanValue(startWithSuffixToValue.get("addDisabledIncrementalSyncDaemon"), false)) { + provisionerSuffixToValue.put("showAdvanced", "true"); + } + + } } From 6a76b875e00cf83b8a9b0401bb2f6daf02e9938f Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Sun, 22 May 2022 19:16:32 -0400 Subject: [PATCH 051/125] improve provisioning --- grouper/conf/grouper-loader.base.properties | 49 ++++++++++--------- .../GrouperProvisioningBehavior.java | 34 ++++++------- .../GrouperProvisioningConfiguration.java | 10 ---- .../ProvisionerConfigurationTest.java | 1 - .../sqlProvisioning/SqlProvisionerTest.java | 4 +- .../SqlProvisionerTestUtils.java | 42 ++++++++-------- 6 files changed, 66 insertions(+), 74 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 1b848e47e4c9..fe02276448ba 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2264,6 +2264,9 @@ provisionerDefault.membershipsConvertToGroupSyncThreshold = # {valueType: "integer", defaultValue: "10000"} provisionerDefault.scoreConvertToFullSyncThreshold = +# Remove sync log rows after a certain number of days +# {valueType: "integer"} +grouper.provisioning.removeSyncLogRowsAfterDays = 7 ####################################### @@ -2731,7 +2734,7 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.hasTargetEntityLink = # number of attributes for target entities -# {valueType: "integer", order: 59000, subSection: "entity", defaultValue: "0", showEl:"${operateOnGrouperEntities}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } +# {valueType: "integer", order: 59000, subSection: "entity", defaultValue: "0", showEl:"${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities)}", formElement: "dropdown", optionValues: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] } # provisioner.genericProvisioner.numberOfEntityAttributes = # Name of the attribute @@ -2982,39 +2985,39 @@ provisionerDefault.scoreConvertToFullSyncThreshold = # provisioner.genericProvisioner.entityMembershipAttributeValue = # generally the matching attribute(s) are the same as the search attributes, but they can be different -# {valueType: "boolean", defaultValue: "true", order: 80220, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities)}"} +# {valueType: "boolean", defaultValue: "true", order: 80220, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities)))}"} # provisioner.genericProvisioner.entityMatchingAttributeSameAsSearchAttribute = # how many entity matching attributes -# {valueType: "integer", required: true, order: 80222, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities)}", formElement: "dropdown", optionValues: ["1", "2", "3"] } +# {valueType: "integer", required: true, order: 80222, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities)))}", formElement: "dropdown", optionValues: ["1", "2", "3"] } # provisioner.genericProvisioner.entityMatchingAttributeCount = # entity matching attribute 1 -# {valueType: "string", required: true, order: 80226, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && entityMatchingAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# {valueType: "string", required: true, order: 80226, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities))) && entityMatchingAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } # provisioner.genericProvisioner.entityMatchingAttribute0name = # entity matching attribute 2 -# {valueType: "string", required: true, order: 80230, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && entityMatchingAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# {valueType: "string", required: true, order: 80230, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities))) && entityMatchingAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } # provisioner.genericProvisioner.entityMatchingAttribute1name = # entity matching attribute 3 -# {valueType: "string", required: true, order: 80234, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && entityMatchingAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# {valueType: "string", required: true, order: 80234, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities))) && entityMatchingAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } # provisioner.genericProvisioner.entityMatchingAttribute2name = # how many entity search attributes -# {valueType: "integer", required: true, order: 80250, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute}", formElement: "dropdown", optionValues: ["1", "2", "3"] } +# {valueType: "integer", required: true, order: 80250, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities))) && !entityMatchingAttributeSameAsSearchAttribute}", formElement: "dropdown", optionValues: ["1", "2", "3"] } # provisioner.genericProvisioner.entitySearchAttributeCount = # entity search attribute 1 -# {valueType: "string", required: true, order: 80254, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# {valueType: "string", required: true, order: 80254, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities))) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 1}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } # provisioner.genericProvisioner.entitySearchAttribute0name = # entity search attribute 2 -# {valueType: "string", required: true, order: 80258, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# {valueType: "string", required: true, order: 80258, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities))) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 2}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } # provisioner.genericProvisioner.entitySearchAttribute1name = # entity search attribute 3 -# {valueType: "string", required: true, order: 80262, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || insertEntities || updateEntities || deleteEntities) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } +# {valueType: "string", required: true, order: 80262, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities || (makeChangesToEntities && (insertEntities || updateEntities || deleteEntities))) && !entityMatchingAttributeSameAsSearchAttribute && entitySearchAttributeCount >= 3}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions" } # provisioner.genericProvisioner.entitySearchAttribute2name = @@ -3491,15 +3494,15 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.dbExternalSystemConfigId = # users table to query to lookup users required if hasTargetEntityLink -# {valueType: "string", order: 49010, subSection: "entity", showEl: "${ operateOnGrouperEntities }"} +# {valueType: "string", order: 49010, subSection: "entity", showEl: "${ operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }"} # provisioner.someSqlProvisioner.userTableName = # users table primary key column of user table -# {valueType: "string", order: 49020, subSection: "entity", showEl: "${operateOnGrouperEntities}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", order: 49020, subSection: "entity", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.someSqlProvisioner.userPrimaryKey = # if this is more complicated than just a simple select, put the query here optional, select * from users where ... -# {valueType: "string", order: 49040, subSection: "entity", showEl: "${operateOnGrouperEntities }"} +# {valueType: "string", order: 49040, subSection: "entity", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }"} # provisioner.someSqlProvisioner.userSearchQuery = # memberships table where memberships go. include schema name if necessary @@ -3511,11 +3514,11 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.membershipPrimaryKey = # column from membership table which is the foreign key to the group table -# {valueType: "string", required: false, order: 78050, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} +# {valueType: "string", required: false, order: 78050, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' && operateOnGrouperGroups && (!customizeGroupCrud || selectGroups) }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} # provisioner.someSqlProvisioner.membershipGroupForeignKeyColumn = # column from membership table which is the foreign key to the entity table -# {valueType: "string", required: false, order: 78051, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} +# {valueType: "string", required: false, order: 78051, subSection: "membership2", showEl: "${operateOnGrouperMemberships && provisioningType == 'membershipObjects' && operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningMembershipAttributeDropdownOptions"} # provisioner.someSqlProvisioner.membershipEntityForeignKeyColumn = # if this is more complicated than just a simple select, put the query here optional, select * from memberships where ... @@ -3527,7 +3530,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.groupTableName = # groups table primary key column of group table -# {valueType: "string", subSection: "group", order: 79400, showEl: "${operateOnGrouperGroups }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} +# {valueType: "string", subSection: "group2", order: 79400, showEl: "${operateOnGrouperGroups }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.someSqlProvisioner.groupTableIdColumn = # Use separate table for group attributes @@ -3539,27 +3542,27 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.groupAttributesTableName = # column from group table which is the foreign key in the group attribute table. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 79441, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group2", order: 79441, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesGroupForeignKeyColumn = # name of the column in group attribute table that will store attribute names. Include schema name if necessary. -# {valueType: "string", subSection: "group", defaultValue: "attribute_name", order: 79442, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group2", defaultValue: "attribute_name", order: 79442, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeNameColumn = # name of the column in group attribute table that will store attribute values. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 79443, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", subSection: "group2", order: 79443, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeValueColumn = # if this is more complicated than just a simple select, put the query here optional, select * from groups where ... -# {valueType: "string", subSection: "group", order: 79912, showEl: "${operateOnGrouperGroups && group2advanced }"} +# {valueType: "string", subSection: "group2", order: 79912, showEl: "${operateOnGrouperGroups && group2advanced }"} # provisioner.someSqlProvisioner.groupSearchQuery = # name of the column in group attribute table that will store last modified timestamp. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 79913, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}"} +# {valueType: "string", subSection: "group2", order: 79913, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}"} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumn = # type of the last modified column. Include schema name if necessary. -# {valueType: "string", subSection: "group", order: 79914, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} +# {valueType: "string", subSection: "group2", order: 79914, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumnType = # Storage type @@ -3568,7 +3571,7 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # Use separate table for entity attributes -# {valueType: "boolean", order: 49011, defaultValue: "false", subSection: "entity", showEl: "${operateOnGrouperEntities}"} +# {valueType: "boolean", order: 49011, defaultValue: "false", subSection: "entity", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }"} # provisioner.someSqlProvisioner.useSeparateTableForEntityAttributes = # table to store entity attributes diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java index 2d1c30a6b863..54aabd2fd8a2 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java @@ -1400,23 +1400,23 @@ public String toString() { result.append(fieldName).append(" = '").append(GrouperUtil.toStringForLog(value, false)).append("'"); } } - for (String propertyName : new String[] {"hasEntityLinkEntityAttributeValueCache0", - "hasEntityLinkEntityAttributeValueCache1", "hasEntityLinkEntityAttributeValueCache2", "hasEntityLinkEntityAttributeValueCache3", - "hasGroupLinkGroupAttributeValueCache0", "hasGroupLinkGroupAttributeValueCache1", "hasGroupLinkGroupAttributeValueCache2", "hasGroupLinkGroupAttributeValueCache3", - "groupLinkGroupAttributeValueCache0Attribute", "groupLinkGroupAttributeValueCache1Attribute", "groupLinkGroupAttributeValueCache2Attribute", - "groupLinkGroupAttributeValueCache3Attribute", "entityLinkEntityAttributeValueCache0Attribute", "entityLinkEntityAttributeValueCache1Attribute", - "entityLinkEntityAttributeValueCache2Attribute", "entityLinkEntityAttributeValueCache3Attribute"}) { - - Object value = GrouperUtil.propertyValue(this, propertyName); - if (value != null) { - if (!firstField) { - result.append(", "); - } - firstField = false; - result.append(propertyName).append(" = '").append(GrouperUtil.toStringForLog(value, false)).append("'"); - - } - } +// for (String propertyName : new String[] {"hasEntityLinkEntityAttributeValueCache0", +// "hasEntityLinkEntityAttributeValueCache1", "hasEntityLinkEntityAttributeValueCache2", "hasEntityLinkEntityAttributeValueCache3", +// "hasGroupLinkGroupAttributeValueCache0", "hasGroupLinkGroupAttributeValueCache1", "hasGroupLinkGroupAttributeValueCache2", "hasGroupLinkGroupAttributeValueCache3", +// "groupLinkGroupAttributeValueCache0Attribute", "groupLinkGroupAttributeValueCache1Attribute", "groupLinkGroupAttributeValueCache2Attribute", +// "groupLinkGroupAttributeValueCache3Attribute", "entityLinkEntityAttributeValueCache0Attribute", "entityLinkEntityAttributeValueCache1Attribute", +// "entityLinkEntityAttributeValueCache2Attribute", "entityLinkEntityAttributeValueCache3Attribute"}) { +// +// Object value = GrouperUtil.propertyValue(this, propertyName); +// if (value != null) { +// if (!firstField) { +// result.append(", "); +// } +// firstField = false; +// result.append(propertyName).append(" = '").append(GrouperUtil.toStringForLog(value, false)).append("'"); +// +// } +// } return result.toString(); } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java index 4a853d6123bc..653a011232b8 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java @@ -1002,11 +1002,6 @@ public void preConfigure() { } } - /** - * If the subject API is needed to resolve attribute on subject required, drives requirements of other configurations. defaults to false. - */ - private boolean hasSubjectLink = false; - /** * If groups need to be resolved in the target before provisioning */ @@ -2223,11 +2218,6 @@ public void configureGenericSettings() { } } - this.hasSubjectLink = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("hasSubjectLink", false), false); - if (this.hasSubjectLink) { - this.debugMap.put("hasSubjectLink", this.hasSubjectLink); - } - this.hasTargetGroupLink = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("hasTargetGroupLink", false), false); if (this.hasTargetGroupLink) { this.debugMap.put("hasTargetGroupLink", this.hasTargetGroupLink); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java index 7162d76920db..a1614f27aa30 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/provisioning/ProvisionerConfigurationTest.java @@ -100,7 +100,6 @@ public void testLdapProvisionerConfigurationInsertEditDelete() { // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.name", "name"); // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.insert", "true"); // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.select", "true"); -// GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.update", "true"); // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); // GrouperLoaderConfig.retrieveConfig().propertiesOverrideMap().put("provisioner.ldapProvTest.targetGroupAttribute.0.translateToGroupSyncField", "groupAttributeValueCache2"); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java index ae319733cdc9..82fc19e9a5e5 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java @@ -213,8 +213,8 @@ public void testSimpleMembershipGroupNameSubjectId() { .assignMembershipDeleteType("deleteMembershipsIfNotExistInGrouper") .assignMembershipTableName("testgrouper_prov_mship0") .assignMembershipTableIdColumn("group_name, subject_id") - .assignMembershipGroupForeignKeyColumn("group_name") - .assignMembershipEntityForeignKeyColumn("subject_id") +// .assignMembershipGroupForeignKeyColumn("group_name") +// .assignMembershipEntityForeignKeyColumn("subject_id") .assignMembershipAttributeCount(2) ); diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java index 48eff0bc736c..0bb1ff3eb2e1 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java @@ -38,14 +38,17 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "debugLog", "true"); if (!StringUtils.isBlank(provisioningTestConfigInput.getEntityDeleteType())) { + configureProvisionerSuffix(provisioningTestConfigInput, "customizeEntityCrud", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "deleteEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, provisioningTestConfigInput.getEntityDeleteType(), "true"); } - if (!StringUtils.isBlank(provisioningTestConfigInput.getEntityDeleteType())) { - configureProvisionerSuffix(provisioningTestConfigInput, "deleteEntities", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, provisioningTestConfigInput.getEntityDeleteType(), "true"); + if (!StringUtils.isBlank(provisioningTestConfigInput.getGroupDeleteType())) { + configureProvisionerSuffix(provisioningTestConfigInput, "customizeGroupCrud", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "deleteGroups", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, provisioningTestConfigInput.getGroupDeleteType(), "true"); } if (!StringUtils.isBlank(provisioningTestConfigInput.getMembershipDeleteType())) { + configureProvisionerSuffix(provisioningTestConfigInput, "customizeMembershipCrud", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "deleteMemberships", "true"); configureProvisionerSuffix(provisioningTestConfigInput, provisioningTestConfigInput.getMembershipDeleteType(), "true"); } @@ -111,15 +114,16 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesTableName", "testgrouper_pro_dap_entity_attr"); } - configureProvisionerSuffix(provisioningTestConfigInput, "showFailsafe", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMaxOverallPercentGroupsRemove", "-1"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMaxOverallPercentMembershipsRemove", "-1"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMaxPercentRemove", "-1"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMinGroupSize", "-1"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMinManagedGroups", "-1"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMinOverallNumberOfMembers", "-1"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeSendEmail", "false"); - configureProvisionerSuffix(provisioningTestConfigInput, "failsafeUse", "true"); + // configureProvisionerSuffix(provisioningTestConfigInput, "showFailsafe", "true"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMaxOverallPercentGroupsRemove", "-1"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMaxOverallPercentMembershipsRemove", "-1"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMaxPercentRemove", "-1"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMinGroupSize", "-1"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMinManagedGroups", "-1"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeMinOverallNumberOfMembers", "-1"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeSendEmail", "false"); + // configureProvisionerSuffix(provisioningTestConfigInput, "failsafeUse", "true"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { configureProvisionerSuffix(provisioningTestConfigInput, "useSeparateTableForGroupAttributes", "true"); @@ -145,7 +149,6 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi } configureProvisionerSuffix(provisioningTestConfigInput, "customizeMembershipCrud", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "insertMemberships", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "logAllObjectsVerbose", "true"); if (!StringUtils.isBlank(provisioningTestConfigInput.getMembershipEntityForeignKeyColumn())) { configureProvisionerSuffix(provisioningTestConfigInput, "membershipEntityForeignKeyColumn", provisioningTestConfigInput.getMembershipEntityForeignKeyColumn()); @@ -160,19 +163,19 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "membershipTableName", provisioningTestConfigInput.getMembershipTableName()); } - + configureProvisionerSuffix(provisioningTestConfigInput, "operateOnGrouperEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "subjectSourcesToProvision", "jdbc"); if (provisioningTestConfigInput.getEntityAttributeCount() > 0) { configureProvisionerSuffix(provisioningTestConfigInput, "operateOnGrouperEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "numberOfEntityAttributes", "" + provisioningTestConfigInput.getEntityAttributeCount()); - configureProvisionerSuffix(provisioningTestConfigInput, "selectEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "customizeEntityCrud", "true"); if (provisioningTestConfigInput.getEntityAttributeCount() != 3) { - configureProvisionerSuffix(provisioningTestConfigInput, "insertEntities", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "updateEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "makeChangesToEntities", "true"); } + } else { + configureProvisionerSuffix(provisioningTestConfigInput, "customizeEntityCrud", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "selectEntities", "false"); } if (provisioningTestConfigInput.getEntityAttributeCount() == 3) { @@ -360,7 +363,6 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute." + i + ".showAttributeCrud", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute." + i + ".select", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute." + i + ".insert", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute." + i + ".update", "true"); } @@ -388,8 +390,6 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "logAllObjectsVerbose", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "provisioningType", provisioningTestConfigInput.getProvisioningType()); - configureProvisionerSuffix(provisioningTestConfigInput, "insertMemberships", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "selectMemberships", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "showAdvanced", "true"); @@ -412,7 +412,7 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi } new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.class").value("edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningFullSyncJob").store(); - new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.quartzCron").value("0 0 4 * * 2000").store(); + new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.quartzCron").value("0 0 4 * * 2099").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.provisionerConfigId").value("sqlProvTest").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("changeLog.consumer.sqlProvisionerIncremental.class").value("edu.internet2.middleware.grouper.changeLog.esb.consumer.EsbConsumer").store(); From 961abacd9b803279050b0f5cacea6aaec4f77252 Mon Sep 17 00:00:00 2001 From: ydelattre Date: Mon, 23 May 2022 16:54:21 +0200 Subject: [PATCH 052/125] added and improved french translations --- .../grouper.textNg.fr.fr.base.properties | 921 ++++++++++++------ 1 file changed, 633 insertions(+), 288 deletions(-) diff --git a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties index 8ae847e9bf5a..258520bced30 100644 --- a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties @@ -650,11 +650,14 @@ priv.action.assigned=Privileges affectés priv.action.assigned-failed=Privileges non affectés priv.action.revocation-failure=Le(s) privilège (s) suivant n'a (ont) pas pu être révoqué(s). Cela est dû au fait que le(s) privilège(s) n'a (ont) pas été attribué(s) directement à cette entité, mais à un groupe dont l'entité est membre: priv.create=Créer +priv.stemView=View +priv.stemViewUpper=VIEW priv.stem=Administrer priv.stemAdmin=Administrer priv.createUpper=CRÉER priv.stemAdminUpper=ADMINISTRER priv.creatorsUpper=CRÉER +priv.stemViewersUpper=VIEW priv.stemAdminsUpper=ADMINISTRER priv.member=Membre priv.member-list-field=membre de la liste {0} @@ -2695,7 +2698,28 @@ localEntityExpiresAtDateHint=Format - yyyy/mm/dd localEntityAllowedFromCidrsHint=Si plusieurs, les séparer par une virgule. Ex : 1.2.3.4/24, 1.2.3.5/36 - laisser vide si autoriser depuis n'importe quels réseaux -localEntityWsJwtRecentSourceAddressesLabel=Dernières adresses sources +localEntityWsJwtRecentSourceAddressesLabel=Adresses sources récentes + +localEntityWsJwtFailedSourceAddressesLabel = Adresses sources en erreurs + +localEntityWsJwtSampleAuthorizationHeaderLabel = Exemple d'en-tête d'autorisation + +localEntityWsJwtKeyMoreActionsButton = Actions sur les clés JWT WS + +ariaLabelGuiMoreLocalEntityWsJwtKeyActions = Affiche les actions sur les clés JWT WS + +localEntityWsJwtKeyMoreActionsEditSettings = Modifier les paramètres + +localEntityWsJwtKeyMoreActionsDeleteKey = Supprimer la clé et ses paramètres +localEntityWsJwtKeyConfirmDeleteKey = Êtes-vous sur de vouloir supprimer cette clé et ses paramètres ? + +localEntityWsJwtKeyMoreActionsDeleteKeyAndCreateNew = Remplacer la clé +localEntityWsJwtKeyConfirmDeleteAndCreateNewKey = Êtes-vous sur de vouloir remplacer cette clé ? + +localEntityViewWsJwtKeySaveButton = Valider +localEntityViewWsJwtKeyCancelButton = Annuler + +localEntityWsJwtKeyExpiresAtInvalidFormat = Le format de la date d'expiration est incorrect (yyyy/mm/dd) ######################### ## role hierarchies @@ -3413,11 +3437,11 @@ guiBreadcrumbsProvisioningLabel=Provisionnement guiBreadcrumbsAriaLabel=Fil d'ariane: Vous êtes ici: -# if there is more to show, this is the more button -guiMore=Plus +# if there is more details to show, this is the details button +guiMore=Afficher les détails # if there is less to show, this is the less button -guiLess=Moins +guiLess=Cacher les détails # aria Label properties for Stems, Attribute Defs, Groups and Subjects ariaLabelGuiMoreGroupDetails=Afficher plus de détails pour ce groupe @@ -3616,7 +3640,7 @@ myGroupsTabGroupsCanJoin=Groupes que je peux rejoindre myGroupsDescription=Le tableau suivant liste tous les groupes dont vous pouvez gérer les appartenances. # my groups filter for label -myGroupsFilterFor=Filtrer par: +myGroupsFilterFor=Filtrer par : # my groups name placeholder myGroupsSearchNamePlaceholder=Nom du groupe ou du dossier @@ -3696,7 +3720,7 @@ myStemsTitle=Mes dossiers myStemsDescription=Le tableau suivant liste les dossiers où vous avez des privilèges # my stems filter for label -myStemsFilterFor=Filtrer par: +myStemsFilterFor=Filtrer par : # my stems name placeholder myStemsSearchNamePlaceholder=Nom du dossier @@ -3761,7 +3785,7 @@ myServicesTitle=Mes services myServicesDescription=Le tableau suivant liste tous les services correspondant au filtre de recherche # my services filter for label -myServicesFilterFor=Filtrer par: +myServicesFilterFor=Filtrer par : # my services name placeholder myServicesSearchNamePlaceholder=Nom du service @@ -4634,10 +4658,10 @@ groupLabelThisGroupNotCompositeFactor=Ce groupe n'est pas une opérande d'un gro # composite strings for the various types of composites groupLabelCompositeUnion=${grouperRequestContainer.groupContainer.compositeOwnerGuiGroup.shortLinkWithIcon} is a composite union of ${grouperRequestContainer.groupContainer.compositeLeftFactorGuiGroup.shortLinkWithIcon} and ${grouperRequestContainer.groupContainer.compositeRightFactorGuiGroup.shortLinkWithIcon} groupLabelCompositeIntersection=${grouperRequestContainer.groupContainer.compositeOwnerGuiGroup.shortLinkWithIcon} est un groupe algébrique de type intersection entre ${grouperRequestContainer.groupContainer.compositeLeftFactorGuiGroup.shortLinkWithIcon} et ${grouperRequestContainer.groupContainer.compositeRightFactorGuiGroup.shortLinkWithIcon} -groupLabelCompositeMinus=${grouperRequestContainer.groupContainer.compositeOwnerGuiGroup.shortLinkWithIcon} est un groupe algébrique composé de ${grouperRequestContainer.groupContainer.compositeLeftFactorGuiGroup.shortLinkWithIcon} moins ${grouperRequestContainer.groupContainer.compositeRightFactorGuiGroup.shortLinkWithIcon} +groupLabelCompositeMinus=${grouperRequestContainer.groupContainer.compositeOwnerGuiGroup.shortLinkWithIcon} est un groupe composé de ${grouperRequestContainer.groupContainer.compositeLeftFactorGuiGroup.shortLinkWithIcon} moins ${grouperRequestContainer.groupContainer.compositeRightFactorGuiGroup.shortLinkWithIcon} # in the main panel this will show composites -groupLabelCompositeOwnerMainPanel=Note: ce groupe ne peut comporter de membres direct car c'est un groupe compositle: +groupLabelCompositeOwnerMainPanel=Note : ce groupe ne peut comporter de membres directs car c'est un groupe composite - groupLabelCompositeFactorMainPanel=Note: ce groupe est un groupe algébrique: # if you dont not have privileges to view the composite group information @@ -4879,11 +4903,13 @@ groupPrivilegesAssignStemAdminPrivilege=Attribuer le privilège $$priv.stemAdmin groupPrivilegesAssignCreatePrivilege=Attribuer le privilège $$priv.createUpper$$ groupPrivilegesAssignStemAttributeReadPrivilege=Attribuer le privilège $$priv.stemAttrReadUpper$$ groupPrivilegesAssignStemAttributeUpdatePrivilege=Attribuer le privilège $$priv.stemAttrUpdateUpper$$ +groupPrivilegesAssignStemViewPrivilege = Attribuer le privilège $$priv.stemViewUpper$$ groupPrivilegesAssignAllStemPrivilege=Attribuer TOUS les privilèges groupPrivilegesRevokeStemAdminPrivilege=Supprimer le privilège $$priv.stemAdminUpper$$ groupPrivilegesRevokeCreatePrivilege=Supprimer le privilège $$priv.createUpper$$ groupPrivilegesRevokeStemAttributeReadPrivilege=Supprimer le privilège $$priv.stemAttrReadUpper$$ groupPrivilegesRevokeStemAttributeUpdatePrivilege=Supprimer le privilège $$priv.stemAttrUpdateUpper$$ +groupPrivilegesRevokeStemViewPrivilege = Supprimer le privilège $$priv.stemViewUpper$$ groupPrivilegesRevokeAllStemPrivilege=Supprimer TOUS les privilèges groupPrivilegesAssignAttrAdminPrivilege=Attribuer le privilège $$priv.adminUpper$$ @@ -5024,6 +5050,27 @@ groupMembershipsRemoveNoSubjectSelects=Erreur: selectionnez au moins un membre # assign these privileges label on view group groupViewAssignThesePrivileges=Attribuer les privilèges suivants : +# start date on view group +groupViewStartDate = Start date: + +# end date on view group +groupViewEndDate = End date: + +# start date subtext on view group +groupViewStartDateSubtext = The optional date on which this entity's membership begins. Expected timezone is ${grouperUtil.getFriendlyTimezoneStringForInputDescription()}. + +# end date subtext on view group +groupViewEndDateSubtext = The optional date on which this entity's membership expires. Expected timezone is ${grouperUtil.getFriendlyTimezoneStringForInputDescription()}. + +# group view, start date invalid +groupViewFromDateInvalid = 'Start date' is invalid. Enter: yyyy/mm/dd hh:mi am/pm (12-hour clock) + +# group view, end date invalid +groupViewToDateInvalid = 'End date' is invalid. Enter: yyyy/mm/dd hh:mi am/pm (12-hour clock) + +# group view, start/end date used with privilege +groupAddMemberPrivStartEndDateError = Start date and end date can only be set for the default member privilege + # Add link in text of group view screen groupViewAddMemberLink=Ajouter @@ -5066,6 +5113,8 @@ groupViewEditGroupButton=Modifier le groupe # edit group button text localEntityViewEditLocalEntityButton=Modifier l'entité locale +localEntityWsJwtKeyLocalEntityButton = Clé JWT WS + # edit role inheritance button text roleViewEditInheritanceButton=Modifier l'héritage @@ -5106,7 +5155,10 @@ groupViewViewGroupButton=Voir le groupe groupViewActionsButton=Actions # more action buttons on group screen -groupViewMoreActionsButton=Plus d'actions +groupViewMoreActionsButton=Actions sur le groupe + +# more action buttons on subject screen +subjectViewMoreActionsButton=Actions sur l'entité #text on the "more" tab groupMoreTab=Plus d'infos @@ -5275,7 +5327,7 @@ groupImportAddAnotherGroupButton=Ajouter un autre groupe groupImportValidateButton=Valider # if no entity ids or identifiers were specified -groupImportNoEntitiesSpecified=Enter entity ids or identifiers +groupImportNoEntitiesSpecified=Merci de renseigner des ids ou identifiants d'entités # too many entities to validate from textarea groupImportTooManyEntitiesToValidate=Impossible d'effectuer l'import, trop d'entité à valider... Veuillez utiliser l'option d'import par fichier. @@ -5319,6 +5371,24 @@ groupImportSearchForMembersToAdd=Par recherche # group import, copy list of member ids groupImportCopyListOfIds=Par saisie d'une liste d'identifiants +# group import, start date invalid +groupImportFromDateInvalid = 'Date de debut' invalide. Format correct : yyyy/mm/dd hh:mi am/pm (sur 12 heures) + +# group import, end date invalid +groupImportToDateInvalid = 'Date de fin' invalide. Format correct : yyyy/mm/dd hh:mi am/pm (sur 12 heures) + +# group import, start date +groupImportStartDate = Date de début : + +# group import, start date sub text +groupImportStartDateSubtext = Date facultative de début de participation au groupe. Le fuseau horaire à utiliser est ${grouperUtil.getFriendlyTimezoneStringForInputDescription()}. + +# group import, end date +groupImportEndDate = Date de fin : + +# group import, end date sub text +groupImportEndDateSubtext = Date facultative de fin de participation au groupe. Le fuseau horaire à utiliser est ${grouperUtil.getFriendlyTimezoneStringForInputDescription()}. + # group import, select a file groupImportSelectFileToImport=Sélectionnez un fichier à importer : @@ -5525,7 +5595,28 @@ groupAttributeMembershipAssignmentsButton=Assignation d'attributs d'appartenance # electronic forms groupWorkflowElectronicForms=Formulaires en ligne - + +# quick links +groupViewMoreActionsQuickLinks = Accès rapide + +# templates +groupViewMoreActionsTemplates = Modèles + +# manage +groupViewMoreActionsManage = Gestion + +# auditing +groupViewMoreActionsAuditing = Audit + +# administration +groupViewMoreActionsAdministration = Administration + +# delete +groupViewMoreActionsDelete = Suppression + + + + ######################################## ## View this group's memberships ######################################## @@ -6852,6 +6943,8 @@ stemPrivilegesDecription=Le tableau suivant liste toutes les entités avec des p # dropdown for privileges filter, everyone stemPrivilegesFilterEveryone=Tous les privilèges +# dropdown for privileges filter, people with create group +stemPrivilegesFilterStemViewers = Entités avec $$priv.stemViewUpper$$ # dropdown for privileges filter, people with create group stemPrivilegesFilterCreators=Entités avec $$priv.createUpper$$ @@ -6996,6 +7089,25 @@ stemViewMoreActionsAddToMyFavorites=Ajouter à mes favoris # actions button stemViewActionsButton=Actions +# quick links +stemViewMoreActionsQuickLinks = Accès rapide + +# templates +stemViewMoreActionsTemplates = Modèles + +# manage +stemViewMoreActionsManage = Gestion + +# auditing +stemViewMoreActionsAuditing = Audit + +# administration +stemViewMoreActionsAdministration = Administration + +# delete +stemViewMoreActionsDelete = Delete + + ######################################## # Stem group memberships @@ -7759,8 +7871,8 @@ grouperAttestationAuthorizedGroupDescription=Le nom du groupe autorisé à attes grouperAttestationEmailAddressesRequired=Les courriels sont obligatoire # error message to add email grop if not emailing a group -grouperAttestationEmailGroupRequired = Email group is required -grouperAttestationEmailGroupCantRead = You need to be able READ the email group (Grouper privilege) +grouperAttestationEmailGroupRequired = Merci d'indiquer un groupe destinataire des notifications +grouperAttestationEmailGroupCantRead = Vous devez avoir au minimum le droit de LIRE le groupe indiqué comme destinataire des notifications # error message to add report if using report grouperAttestationReportNameRequired=Le nom du rapport est requis @@ -7801,7 +7913,9 @@ attestationReportEmailManagersLabel=Envoyer un e-mail aux membres autorisés du grouperAttestationDontEmailManagersLabel=Non, envoyer un courriel à une liste personnalisée d'adresses grouperAttestationReportEmailManagersLabel=Oui, envoyez un e-mail aux membres autorisés du groupe +grouperAttestationEmailCustomListLabel = Envoie un courriel à une liste personnalisée d'adresses grouperAttestationEmailManagersLabel=Oui, envoyer un courriel aux administrateurs et gestionnaires du groupe +grouperAttestationEmailGroupLabel = Envoyer un email aux membres d'un groupe (recommandé) # description of email group managers field grouperAttestationEmailManagersDescription=Si les gestionnaires du groupe (avec les droits ADMIN ou (READ et UPDATE)) doivent recevoir un courriel lorsqu'une attestation est due @@ -7809,6 +7923,7 @@ grouperAttestationReportEmailManagersDescription=Si les membres autorisés du gr # description of email addresses field grouperAttestationEmailAddressesDescription=Entrez une liste d'adresse de messageries séparée par des virgules +grouperAttestationEmailGroupDescription = Envoie les courriels aux membres du groupe indiqué. Seuls les membres avec les droits MODIFIER/ADMINISTRER sur ce groupe (avec attestation) seront notifiés. grouperAttestationReportEmailAddressesDescription=Entrez des adresses e-mail séparées par des virgules si vous n'envoyez pas d'e-mail aux membres autorisés du groupe # remove direct attestation configuration @@ -7845,6 +7960,12 @@ attestationEmailAddressesLabel=Liste d'adresses personnalisée # description help for the email addresses textfield attestationEmailAddressesDescription=Liste séparée par virgule des courriels pour les rappels. Si non spécifié, les ADMINS et UPDATERS seront utilisés. +# label for the email addresses textfield +attestationEmailGroupLabel = Notifier un groupe + +# description help for the email addresses textfield +attestationEmailGroupDescription = Groupe dont les membres seront destinataires des courriels liés à l'attestation + #default certify label attestationDefaultCertifyLabel=Utiliser le nbre de jours par défaut avant recertification @@ -8591,7 +8712,7 @@ ariaLabelGuiMoreProvisioningActions=Afficher les actions de provisionnement provisioningMoreActionsButton=Actions de provisionnement # more actions menu view more actions -provisioningMoreActionsViewSettings=Afficher les provisioners +provisioningMoreActionsViewSettings=Afficher les provisionnements # more actions menu edit more actions provisioningMoreActionsEditSettings=Modifier les paramètres de provisionnement @@ -8651,7 +8772,8 @@ provisioningStemScopeHint=Est-ce que les paramètres de provisionnement affecten # validation that metadata item is required provisioningMetadataItemRequired=$$metadataLabel$$ est requis - +# validation that metadata item is not unique +provisioningMetadataItemNotUnique = $$metadataLabel$$ n'est pas unique # value is not of correct type provisioningMetadataValueNotCorrectTypeRequired=$$value$$ n'est pas du type $$type$$ @@ -9718,6 +9840,7 @@ config.GshTemplateConfiguration.attribute.option.input.i.type.string.label=Chaî config.GshTemplateConfiguration.attribute.option.input.i.formElementType.text.label=Champ de texte config.GshTemplateConfiguration.attribute.option.input.i.formElementType.textarea.label=Zone de texte config.GshTemplateConfiguration.attribute.option.input.i.formElementType.dropdown.label=Menu déroulant +config.GshTemplateConfiguration.attribute.option.input.i.formElementType.password.label = Mot de passe config.GshTemplateConfiguration.attribute.option.input.i.dropdownValueFormat.sql.label=SQL config.GshTemplateConfiguration.attribute.option.input.i.dropdownValueFormat.csv.label=CSV @@ -9767,6 +9890,21 @@ config.GshTemplateConfiguration.attribute.folderUuidToShow.description=Sur quel config.GshTemplateConfiguration.attribute.folderShowOnDescendants.label=Condition d'affichage sur les descendants config.GshTemplateConfiguration.attribute.folderShowOnDescendants.description=certainFolder : uniquement sur un dossier oneChildLevel : uniquement sur les dossiers à la racine. certainFolderAndOneChildLevel : uniquement sur un dossier et les dossiers à la racine. Descendants : sur l'ensemble des sous-dossiers contenus dans le dossier. certainFolderAndDescendants : sur un dossier et sur l'ensemble des sous-dossiers. +config.GshTemplateConfiguration.attribute.showOnGroups.label=Afficher sur les groupes +config.GshTemplateConfiguration.attribute.showOnGroups.description=si cette option de modèle est disponible sur les groupes + +config.GshTemplateConfiguration.attribute.groupShowType.label=Condition d'affichage +config.GshTemplateConfiguration.attribute.groupShowType.description=Doit-il s'afficher pour un groupe, des groupes dans un certain dossier ou tous les groupes + +config.GshTemplateConfiguration.attribute.groupUuidsToShow.label = UUID des groupes +config.GshTemplateConfiguration.attribute.groupUuidsToShow.description = UUID des groupes, séparés par une virgule, où ce template sera disponible + +config.GshTemplateConfiguration.attribute.folderUuidForGroupsInFolder.label = UUID du dossier parent +config.GshTemplateConfiguration.attribute.folderUuidForGroupsInFolder.description = UUID du dossier dans lequel les groupes auront ce template de disponible + +config.GshTemplateConfiguration.attribute.groupShowOnDescendants.label=Condition d'affichage sur les descendants +config.GshTemplateConfiguration.attribute.groupShowOnDescendants.description=OneChildLevel : uniquement sur les groupes à la racine du dossier. Descendants : sur l'ensemble des groupes contenus dans le dossier + config.GshTemplateConfiguration.attribute.securityRunType.label=Sécurité liée à l'execution config.GshTemplateConfiguration.attribute.securityRunType.description=Qui peut exécuter ce modèle. Seulement GrouperSystem, le groupe d'admins ou un groupe spécifique @@ -9923,6 +10061,8 @@ config.GshTemplateConfiguration.attribute.numberOfTests.description=Nombre de te config.GenericConfiguration.subSection.test.title=Paramètres de test config.GenericConfiguration.subSection.test.description=Paramètres de test +provisioning.documentationLink = Documentation + config.GenericConfiguration.subSection.test.i.title=Test __i+1__ : paramètres config.GenericConfiguration.subSection.test.i.description=Paramètres de test @@ -9974,82 +10114,82 @@ gshTemplate.error.input.invalidDropdownValue.message='$$inputName$$' n'est pas v ## Sql Sync ######################################## -sqlSyncMainLink = Sql sync +sqlSyncMainLink = Synchro SQL -miscellaneousSqlSyncOverallBreadcrumb = Sql sync +miscellaneousSqlSyncOverallBreadcrumb = Synchro SQL -miscellaneousSqlSyncMainDescription = Sql sync +miscellaneousSqlSyncMainDescription = Synchro SQL sqlSyncMoreActionsButton = Actions -sqlSyncConfigIdLabel = Config id +sqlSyncConfigIdLabel = ID Config -sqlSyncMoreActionsAddButton = Add sql sync +sqlSyncMoreActionsAddButton = Ajouter une synchro SQL -sqlSyncMoreActionsViewButton = View Sql sync configs +sqlSyncMoreActionsViewButton = Afficher les configurations -ariaLabelGuiMoreSqlSyncActions = Show Sql sync actions +ariaLabelGuiMoreSqlSyncActions = Affiche les actions liés à la synchronisation SQL -sqlSyncNoConfiguredSqlSyncs = There are no sql syncs configured. +sqlSyncNoConfiguredSqlSyncs = Aucune synchro SQL de configurée -miscellaneousSqlSyncAddBreadcrumb = Add sql sync -miscellaneousSqlSyncEditBreadcrumb = Edit sql sync +miscellaneousSqlSyncAddBreadcrumb = Ajouter synchro SQL +miscellaneousSqlSyncEditBreadcrumb = Modifier synchro SQL -sqlSyncConfigAddFormSubmitButton = Submit +sqlSyncConfigAddFormSubmitButton = Valider -sqlSyncConfigAddFormCancelButton = Cancel +sqlSyncConfigAddFormCancelButton = Annuler -sqlSyncConfigIdHint = The Config id is an alphanumeric key for the sql sync that will be referred to from places that use the sql sync. It is also used in the configuration keys. +sqlSyncConfigIdHint = L'ID de configuration est une clé alphanumérique. Elle sera utilisé pour identifier de manière unique cette configuration de synchronisation SQL. -sqlSyncTypeLabel = Sql sync configuration +sqlSyncTypeLabel = Configuration synchro SQL -sqlSyncTypeHint = Sql sync configuration +sqlSyncTypeHint = Configuration synchro SQL -sqlSyncCreateErrorConfigIdRequired = Error: Config id is required +sqlSyncCreateErrorConfigIdRequired = Erreur : l'ID Config est obligatoire -sqlSyncConfigAddEditSuccess = Sql sync config was saved successfully. -sqlSyncConfigDeleteSuccess = Sql sync config was deleted successfully. -sqlSyncConfigChangeStatusSuccess = Sql sync config's status was changed successfully. +sqlSyncConfigAddEditSuccess = La configuration de la synchro SQL a été sauvegardée avec succès. +sqlSyncConfigDeleteSuccess = La configuration de cette synchro SQL a été supprimée avec succès. +sqlSyncConfigChangeStatusSuccess = La configuration de cette synchro SQL a été mis à jour avec succès. -sqlSyncConfigsTableHeaderConfigId = Config id +sqlSyncConfigsTableHeaderConfigId = ID Config -sqlSyncConfigsTableHeaderEnabled = Enabled +sqlSyncConfigsTableHeaderEnabled = Statut sqlSyncConfigsTableHeaderActions = Actions -sqlSyncConfigsTableEnabledTrueValue = Enabled +sqlSyncConfigsTableEnabledTrueValue = Activé -sqlSyncConfigsTableEnabledFalseValue = Disabled +sqlSyncConfigsTableEnabledFalseValue = Désactivé sqlSyncConfigsRowActionsButton = Actions -sqlSyncConfigsTableViewDetailsActionOption = View details +sqlSyncConfigsTableViewDetailsActionOption = Afficher les détails -sqlSyncConfigsTableEditDetailsActionOption = Edit details +sqlSyncConfigsTableEditDetailsActionOption = Modifier -sqlSyncConfigsTableRunActionOption = Run +sqlSyncConfigsTableRunActionOption = Exécuter -sqlSyncConfigsTableDeleteDetailsActionOption = Delete sql sync config +sqlSyncConfigsTableDeleteDetailsActionOption = Supprimer la conf de la synchro SQL -sqlSyncConfigsTableDisableActionOption = Disable +sqlSyncConfigsTableDisableActionOption = Désactiver -sqlSyncConfigsTableEnableActionOption = Enable +sqlSyncConfigsTableEnableActionOption = Activer -sqlSyncConfigsConfirmDeleteConfig = Are you sure you want to delete this sql sync config? +sqlSyncConfigsConfirmDeleteConfig = Êtes-vous sûr de vouloir supprimer cette synchro SQL ? -config.SqlSyncConfiguration.attribute.databaseFrom.label = Database from +config.SqlSyncConfiguration.attribute.databaseFrom.label = BDD d'origine -config.SqlSyncConfiguration.attribute.tableFrom.label = Table from +config.SqlSyncConfiguration.attribute.tableFrom.label = Table d'origine -config.SqlSyncConfiguration.attribute.databaseTo.label = Database to +config.SqlSyncConfiguration.attribute.databaseTo.label = BDD de destination -config.SqlSyncConfiguration.attribute.databaseToReadonly.label = Database to readonly +config.SqlSyncConfiguration.attribute.databaseToReadonly.label = BDD en lecture seule -config.SqlSyncConfiguration.attribute.tableTo.label = Table to +config.SqlSyncConfiguration.attribute.tableTo.label = Table de destination -config.SqlSyncConfiguration.attribute.columns.label = Columns +config.SqlSyncConfiguration.attribute.columns.label = Colonnes -config.SqlSyncConfiguration.attribute.primaryKeyColumns.label = Primary key columns +config.SqlSyncConfiguration.attribute.primaryKeyColumns.label = Clés primaires des colonnes config.SqlSyncConfiguration.attribute.changeFlagColumn.label = Change flag column @@ -10057,9 +10197,9 @@ config.SqlSyncConfiguration.attribute.groupingColumn.label = Grouping column config.SqlSyncConfiguration.attribute.groupingSize.label = Grouping size -config.SqlSyncConfiguration.attribute.batchSize.label = Batch size +config.SqlSyncConfiguration.attribute.batchSize.label = Taille des lots -config.SqlSyncConfiguration.attribute.maxBindVarsInSelect.label = Max bind variables in select +config.SqlSyncConfiguration.attribute.maxBindVarsInSelect.label = Nbre max de bind variables dans un select config.SqlSyncConfiguration.attribute.switchFromIncrementalToFullIfOverRecords.label = Incremental to full if over records @@ -10075,10 +10215,10 @@ config.SqlSyncConfiguration.attribute.incrementalProgressColumn.label = Incremen config.SqlSyncConfiguration.attribute.incrementalAllColumnsColumn.label = Incremental all columns column -config.SqlSyncConfiguration.attribute.statusDatabase.label = Status database +config.SqlSyncConfiguration.attribute.statusDatabase.label = Statut de la BDD -sqlSyncConfigSaveErrorTableFromContainsIllegalCharacters = Table from value can only contain alphanumeric characters, underscores, and dots -sqlSyncConfigSaveErrorTableToContainsIllegalCharacters = Table to value can only contain alphanumeric characters, underscores, and dots +sqlSyncConfigSaveErrorTableFromContainsIllegalCharacters = Le champ "Table d'origine" ne peut contenir que des caractères alphanumeriques , tirets bas (soulignés) et points +sqlSyncConfigSaveErrorTableToContainsIllegalCharacters = Le champ "Table destinataire" ne peut contenir que des caractères alphanumeriques , tirets bas (soulignés) et points ######################################## ## Subject Resolution / USDU @@ -10288,7 +10428,7 @@ subjectResolutionViewSubjectTableSubjectLastResolvedDate=Date de la dernière r subjectResolutionViewSubjectTableSubjectLastCheckedDate=Date de la dernière vérification du sujet # subject resolution view subject - days subject has been unresolved -subjectResolutionViewSubjectTableSubjectDaysUnresolved = Days subject has been unresolved +subjectResolutionViewSubjectTableSubjectDaysUnresolved = Nbre de jours depuis que le sujet est non résolu # subject resolution view subject - subject deleted? subjectResolutionViewSubjectTableSubjectIsDeleted=Est supprimé @@ -10585,42 +10725,42 @@ localEntityCreateDescriptionLabel=Description: localEntityCreateDescriptionDescription=La description contient des informations sur l'entité locale, par exemple : ce que l'entité représente, pourquoi elle a été créée... # label for the enabled date field -groupCreateEnabledDateLabel=Date d'activation: +groupCreateEnabledDateLabel=Date d'activation : # description for the enabled date field -groupCreateEnabledDateDescription = When this group will be enabled if the time is in the future +groupCreateEnabledDateDescription = A quelle date le groupe sera activé # label for the disabled date field groupCreateDisabledDateLabel=Date de désactivation : # description for the disabled date field -groupCreateDisabledDateDescription = When this group will be disabled if the time is in the future +groupCreateDisabledDateDescription = A quelle date le groupe sera désactivé # placeholder in the date field groupCreateDatePlaceholder = yyyy/mm/dd hh24:mi:ss # invalid dates on edit group -groupCreateErrorEnabledDateInvalid = 'Enabled date' is invalid. Enter: yyyy/mm/dd hh24:mi:ss -groupCreateErrorDisabledDateInvalid = 'Disabled date' is invalid. Enter: yyyy/mm/dd hh24:mi:ss +groupCreateErrorEnabledDateInvalid = 'Date d'activation' est invalide. Le format correct est : yyyy/mm/dd hh24:mi:ss +groupCreateErrorDisabledDateInvalid = 'Date de désactivation' est invalide. Le format correct est : yyyy/mm/dd hh24:mi:ss # label for the enabled date field -localEntityCreateEnabledDateLabel=Date d'activation: +localEntityCreateEnabledDateLabel=Date d'activation : # description for the enabled date field -localEntityCreateEnabledDateDescription = When this local entity will be enabled if the time is in the future +localEntityCreateEnabledDateDescription = A quelle date cette entité locale sera activée # label for the disabled date field localEntityCreateDisabledDateLabel=Date de désactivation : # description for the disabled date field -localEntityCreateDisabledDateDescription = When this local entity will be disabled if the time is in the future +localEntityCreateDisabledDateDescription = A quelle date cette entité locale sera désactivée # placeholder in the date field localEntityCreateDatePlaceholder = yyyy/mm/dd hh24:mi:ss # invalid dates on edit group -localEntityCreateErrorEnabledDateInvalid = 'Enabled date' is invalid. Enter: yyyy/mm/dd hh24:mi:ss -localEntityCreateErrorDisabledDateInvalid = 'Disabled date' is invalid. Enter: yyyy/mm/dd hh24:mi:ss +localEntityCreateErrorEnabledDateInvalid = 'Date d'activation' est invalide. Le format correct est : yyyy/mm/dd hh24:mi:ss +localEntityCreateErrorDisabledDateInvalid = 'Date de désactivation' est invalide. Le format correct est : yyyy/mm/dd hh24:mi:ss # show advanced properties button groupCreateAdvanced=Voir les options avancées @@ -11063,6 +11203,8 @@ grouperReportConfigInvalidSendEmailToGroupNameIdError=L'identifiant du groupe au grouperReportConfigQueryBlankError=La requête est un champ obligatoire +grouperReportConfigScriptBlankError = Script GSH est un champ obligatoire + grouperReportConfigQuartzCronBlankError=La planification est un champ obligatoire grouperReportConfigQuartzCronInvalidError=La planification n'est pas valide @@ -11181,7 +11323,7 @@ stemCopyIntoFolder=Copier dans ce dossier: stemCopyIntoFolderDescription=Saisissez un nom ou rechercher un dossier.
    Saisissez '$$stem.root.display-name$$' pour le dossier racine # stem copy cant find parent stem -stemCopyCantFindParentStemId=Erreur: Impossible de trouver le dossier parent. Veuillez sélectionner un dossier proveneant des résultats. +stemCopyCantFindParentStemId=Erreur: Impossible de trouver le dossier parent. Veuillez sélectionner un dossier provenant des résultats. # stem copy no privileges on parent stem stemCopyCantStemParent=Erreur: Vous n'avez les privilèges suffisant afin de créer un nouveau dossier dans le dossier parent @@ -11229,7 +11371,10 @@ stemCopyGroupsAsMembers=Copier aussi l'appartenance des groupes, de ce dossier, stemCopyGroupsAsMembersHelp=Si vous sélectionnez cette option et que des groupes de ce dossier sont aussi membres d'autres groupes, les nouveaux groupes créés lors de la copie seront aussi ajoutés en tant que membres de ces groupes. Si vous n'avez les privilèges suffisants, vous obtiendrez une erreur. # stem copy groups have privileges elsewhere checkbox -stemCopyGroupsAsPrivilegees=Si vous sélectionnez cette option et que des groupes de ce dossier ont aussi des privilèges sur d'autres groupes, les nouveaux groupes créés lors de la copie auront les mêmes privilèges. Si vous n'avez les privilèges suffisants, vous obtiendrez une erreur. +stemCopyGroupsAsPrivilegees=Si le dossier d'origine a des privilèges sur d'autres groupes ou dossiers, en sélectionnant cette option ses privilèges seront dupliqués. + +# stem copy groups have privileges elsewhere checkbox help +stemCopyGroupsAsPrivilegeesHelp = Si vous sélectionnez cette option et que des groupes de ce dossier ont aussi des privilèges sur d'autres groupes ou dossiers, les nouveaux groupes créés lors de la copie auront les mêmes privilèges. Si vous n'avez les privilèges suffisants, vous obtiendrez une erreur. # stem copy folder privileges checkbox stemCopyFolderPrivileges=Copier les privilèges du dossier? @@ -11304,16 +11449,16 @@ adminProvisionerConfigurationsLink=Provisionnement provisionerConfigsMoreActionsButton=Actions # aria label provisioner configs actions dropdown button text -ariaLabelGuiMoreProvisionerConfigsActions = Show provisioner configuration actions +ariaLabelGuiMoreProvisionerConfigsActions = Affiche les actions liés à la configuration des provisionnements # more action add form option -provisionerConfigMoreActionsAddButton=Ajouter un provisioner +provisionerConfigMoreActionsAddButton=Ajouter un provisionnement # more action view provisioner configs option -provisionerConfigMoreActionsViewButton=Afficher les provisioners +provisionerConfigMoreActionsViewButton=Afficher les provisionnements # message when no provisioner configurations are in the system -provisionerConfigNoConfiguredProvisionerConfigsFound=Aucun provisioner n'est configuré. +provisionerConfigNoConfiguredProvisionerConfigsFound=Aucun provisionnement configuré. provisionerConfigNoRecentActivityFound=Il n'y a aucune activité récente @@ -11359,7 +11504,7 @@ provisionerLogsTableHeaderOwner=Propriétaire provisionerLogsTableHeaderStatus=Status provisionerLogsTableHeaderRecordsProcessed=Enregistrements traités provisionerLogsTableHeaderRecordsChanged=Enregistrements modifiés -provisionerLogsTableHeaderJobTookMillis = Millis job took +provisionerLogsTableHeaderJobTookMillis = Durée en millis provisionerLogsTableHeaderServer=Serveur provisionerLogsTableHeaderDescription=Description @@ -11504,7 +11649,7 @@ provisionerConfigsTableViewLogsActionOption=Voir les logs provisionerConfigsTableViewActivityActionOption=Afficher l'activité # view provisioner config jobs option in dropdown in table -provisionerConfigsTableViewJobsActionOption=Afficher les travaux +provisionerConfigsTableViewJobsActionOption=Afficher les tâches # edit provisioner config details option in dropdown in table provisionerConfigsTableEditDetailsActionOption=Modifier le provisionnement @@ -11574,9 +11719,11 @@ provisionerConfigConfirmDeleteConfig=Voulez-vous vraiment supprimer cette config # error that provisioner config id is required provisionerConfigCreateErrorConfigIdRequired=Erreur : l'identifiant de configuration est requis +provisionerConfigStartWithIdRequired = Erreur : le champ "Commencer avec" est obligatoire + # Add provisioner config breadcrumb on misc. page -miscellaneousProvisionerConfigAddBreadcrumb=Ajouter une configuration de provisionnement -miscellaneousProvisionerConfigEditBreadcrumb=Modifier une configuration de provisionnement +miscellaneousProvisionerConfigAddBreadcrumb=Ajouter un provisionnement +miscellaneousProvisionerConfigEditBreadcrumb=Modifier un provisionnement # provisioner config add form submit button label provisionerConfigAddFormSubmitButton=Soumettre @@ -11595,13 +11742,17 @@ provisionerConfigEditFormCancelButton=Annuler provisionerConfigIdLabel=Identifiant de configuration # provisioner config id hint -provisionerConfigIdHint=L'ID de configuration est une clé alphanumérique pour la configuration de ce provisionnement. Il est également utilisé dans les clés de configuration. Exemple : myLdapProvisioner +provisionerConfigIdHint=L'ID de configuration est une clé alphanumérique correspondant à la configuration de ce provisionnement. Il est aussi utilisé pour composer les noms des différents paramètres. Exemple : myLdapProvisioner # provisioner type label provisionerTypeLabel=Type de provisionnement + # provisioner type hint -provisionerTypeHint=Type de provisionnement auquel se connecter, par exemple LDAP ou Duo +provisionerTypeHint=Type de provisionnement, par exemple LDAP ou Duo + +provisionerStartWithLabel = Commencer avec +provisionerStartWithHint = Commencer avec # provisioner config was saved successfully provisionerConfigAddEditSuccess=La configuration du provisionnement a été enregistrée avec succès. @@ -11626,22 +11777,18 @@ grouperProvisioningDiagnosticsBack=Retour à la liste des provisionnements grouperProvisioningDiagnosticsLargeOperationsLabel=Opérations étendues -grouperProvisioningDiagnosticsSelectAllGroupsError=Le comportement de ce provisionnement n'est pas de sélectionner tous les groupes ! grouperProvisioningDiagnosticsSelectAllGroupsLabel=Sélectionnez tous les groupes grouperProvisioningDiagnosticsSelectAllGroupsDescription=Pour les provisionnements conséquents, les diagnostics peuvent prendre plus de temps. Le mieux serait peut-être de les exécuter en dehors de l'interface utilisateur -grouperProvisioningDiagnosticsSelectAllEntitiesError=Le comportement de ce provisionnement n'est pas de sélectionner toutes les entités ! grouperProvisioningDiagnosticsSelectAllEntitiesLabel=Sélectionnez toutes les entités grouperProvisioningDiagnosticsSelectAllEntitiesDescription=Pour les provisionnements conséquents, les diagnostics peuvent prendre plus de temps. Le mieux serait peut-être de les exécuter en dehors de l'interface utilisateur -grouperProvisioningDiagnosticsSelectAllMembershipsError=Le comportement de ce provisionnement n'est pas de sélectionner toutes les appartenances de membres ! grouperProvisioningDiagnosticsSelectAllMembershipsLabel=Sélectionnez toutes les appartenances de membres grouperProvisioningDiagnosticsSelectAllMembershipsDescription=Pour les provisionnements conséquents, les diagnostics peuvent prendre plus de temps. Le mieux serait peut-être de les exécuter en dehors de l'interface utilisateur grouperProvisioningDiagnosticsGroupNameLabel=Nom du groupe de tests grouperProvisioningDiagnosticsGroupNameDescription=Nom d'un groupe pouvant être sélectionné, inséré, mis à jour, supprimé dans la cible. Ce groupe doit être provisionnable pour la cible -grouperProvisioningDiagnosticsGroupInsertError=Le comportement de ce provisionnement n'est pas de sélectionner tous les groupes ! grouperProvisioningDiagnosticsGroupInsertLabel=Insérer un groupe dans la cible grouperProvisioningDiagnosticsGroupInsertDescription=Si le groupe de test n'est pas dans la cible ou s'il peut être supprimé, créez le groupe dans la cible. grouperProvisioningDiagnosticsGroupInsertLabelTrue=Vrai @@ -11736,7 +11883,7 @@ customUiConfigAddFormSubmitButton=Envoyer customUiConfigAddFormCancelButton=Annuler -customUiConfigIdHint=L'ID de configuration est une clé alphanumérique pour l'interface utilisateur personnalisée qui sera référencée à partir d'endroits qui utilisent l'interface utilisateur personnalisée. Il est également utilisé dans les clés de configuration. +customUiConfigIdHint=L'ID de configuration est une clé alphanumérique correspondant à cette interface personnalisée. Il est aussi utilisé pour composer les noms des différents paramètres. customUiTypeLabel=Configuration de l'interface utilisateur personnalisée @@ -11999,12 +12146,12 @@ grouperExternalSystemTableEnableActionOption=Activé grouperConfigIsElLabel=EL? # for each of the attributes, el label -grouperConfigIsElTooltip=Si coché, cela permettra un langage d'expression similaire à celui de la configuration EL +grouperConfigIsElTooltip=Si coché, autorise l'utilisation d'une expression language (EL) # ldap external system title config.LdapGrouperExternalSystem.title=Ldap -# azure external system title +# external system titles config.AzureGrouperExternalSystem.title=Azure config.GoogleGrouperExternalSystem.title=Google config.Office365GrouperExternalSystem.title=Office 365 @@ -12064,9 +12211,9 @@ grouperExternalSystemCreateErrorConfigIdRequired=Erreur : ID Config est obligato # error that external system config id grouper cannot be used for database type grouperExternalSystemCreateErrorConfigIdGrouperCanNotBeUsed=Erreur : l'ID config "grouper" ne peut pas être utilisé pour un type base de données -config.defaultTrueLabel=Vrai -config.defaultFalseLabel=Faux -config.defaultValueLabel=Valeur par défaut +config.defaultTrueLabel=Oui +config.defaultFalseLabel=Non +config.defaultValueLabel=Par défaut # labels for attributes config.LdapGrouperExternalSystem.attribute.url.label=URL @@ -12126,6 +12273,15 @@ config.DuoGrouperExternalSystem.attribute.adminIntegrationKey.label = Integratio config.DuoGrouperExternalSystem.attribute.adminSecretKey.label = Secret key config.DuoGrouperExternalSystem.attribute.useSsl.label = Use ssl +config.GoogleGrouperExternalSystem.attribute.domain.label = Domain name +config.GoogleGrouperExternalSystem.attribute.serviceAccountEmail.label = Service account email +config.GoogleGrouperExternalSystem.attribute.serviceAccountPKCS12FilePath.label = Service account PKCS12 file path +config.GoogleGrouperExternalSystem.attribute.serviceAccountPrivateKeyPEM.label = Service account private key +config.GoogleGrouperExternalSystem.attribute.serviceImpersonationUser.label = Service impersonation user +config.GoogleGrouperExternalSystem.attribute.tokenUrl.label = Token api url +config.GoogleGrouperExternalSystem.attribute.directoryApiBaseUrl.label = Directory api base url +config.GoogleGrouperExternalSystem.attribute.groupSettingsApiBaseUrl.label = Group settings api base url + config.SftpGrouperExternalSystem.attribute.host.label=Hôte config.SftpGrouperExternalSystem.attribute.user.label=Nom d'utilisateur config.SftpGrouperExternalSystem.attribute.secret.privateKey_0.label=Clé privée @@ -12136,6 +12292,13 @@ config.SftpGrouperExternalSystem.attribute.deleteTempFilesAfterSession.label=Sup config.SftpGrouperExternalSystem.attribute.timeoutMillis.label=Timeout en milliseconde config.SftpGrouperExternalSystem.attribute.enabled.label=Activé +config.SftpGrouperExternalSystem.attribute.proxyHost.label = Hôte proxy +config.SftpGrouperExternalSystem.attribute.proxyHost.description = Hôte du proxy pour ce connecteur externe SFTP, si vide la valeur par défaut est reprise du grouper.properties : grouperSftp.proxyHost +config.SftpGrouperExternalSystem.attribute.proxyPort.label = Port proxy +config.SftpGrouperExternalSystem.attribute.proxyPort.description = Port du proxy pour ce connecteur externe SFTP, si vide la valeur par défaut est reprise du grouper.properties : grouperSftp.proxyPort +config.SftpGrouperExternalSystem.attribute.proxyType.label = Type proxy +config.SftpGrouperExternalSystem.attribute.proxyType.description = Type de proxy pour ce connecteur externe SFTP : PROXY_HTTP, PROXY_SOCKS5, PROXY_STREAM, si vide la valeur par défaut est reprise du grouper.properties : grouperSftp.proxyType + config.SmtpGrouperExternalSystem.attribute.server.label=Serveur config.SmtpGrouperExternalSystem.attribute.user.label=Nom d'utilisateur config.SmtpGrouperExternalSystem.attribute.pass.label=Mot de passe @@ -12235,6 +12398,19 @@ grouperConfigurationValidationConfigIdInvalid=Erreur : '$$configIdLabel$$' doit grouperConfigurationValidationTestSqlQueryRequired=Erreur : '${configFieldLabel}' est obligatoire quand le test sur la valeur retournée est renseigné grouperConfigurationTestExpectedNotMatchingResult=Erreur : valeur attendue '$$expectedValue$$' mais obtenue '$$receivedValue$$' +grouperStartWithGroupTableConfigurationValidationGroupTableNotFound = Erreur : '$$tableName$$' introuvable +grouperStartWithEntityTableConfigurationValidationUserTableNotFound = Erreur : '$$userTableName$$' introuvable +grouperStartWithGroupTableConfigurationValidationGroupIdColumnNotFound = Erreur : '$$column$$' introuvable +grouperStartWithEntityTableConfigurationValidationUserIdColumnNotFound = Erreur : '$$userTableIdColumn$$' introuvable +grouperStartWithGroupTableConfigurationValidationGroupColumnsNotFound = Erreur : '$$groupTableColumns$$' colonnes introuvable +grouperStartWithEntityTableConfigurationValidationEntityColumnsNotFound = Erreur : '$$userTableColumns$$' colonnes introuvable + +grouperStartWithLdapConfigurationValidationExternalSystemNotActiveDirectory = Erreur : Le connecteur externe avec l'id '$$externalSystemId$$' n'est pas de type active directory. +grouperStartWithLdapConfigurationValidationSubjectAttributesNotValid = Erreur : '$$subjectAttributes$$' n'est pas valide + +grouperStartWithAzureConfigurationValidationEntityFieldNotSelected = Error: Select at least one of user principal name, on prem immutable id, mail nickname + +grouperConfigurationValidationGoogleFilePathOrPrivateKeyRequired = Error: Supply PKCS12 file path or private key grouperConfigurationValidationInvalidBoolean=Erreur : '${configFieldLabel}' n'est pas un booléen valide. Il devrait être à 'true' ou 'false' grouperConfigurationValidationInvalidClass=Erreur : '${configFieldLabel}' n'est pas une classe Java valide. Le champ devrait contenir le nom d'une classe présente dans la classpath (.jar dans /opt/grouper/grouperWebapp/WEB-INF/lib ou .class dans /opt/grouper/grouperWebapp/WEB-INF/classes) @@ -12249,13 +12425,13 @@ grouperConfigurationValidationInvalidGroup=Erreur : '${configFieldLabel}' n'est grouperConfigurationValidationDoesNotExtendClass=Erreur : '${configFieldLabel}' n’étend pas $$mustExtendClass$$ grouperConfigurationValidationDoesNotImplementInterface=Erreur : '${configFieldLabel}' n’implémente pas $$mustImplementInterface$$ -miscellaneousGrouperExternalSystemsAddBreadcrumb=Ajouter config brique externe +miscellaneousGrouperExternalSystemsAddBreadcrumb=Ajouter config connecteur externe -miscellaneousGrouperExternalSystemsEditBreadcrumb=Modifier config brique externe +miscellaneousGrouperExternalSystemsEditBreadcrumb=Modifier config connecteur externe miscellaneousGrouperExternalSystemsViewDetailsBreadcrumb=Voir les détails -grouperConfigDefaultValueHintPrefix=La valeur par défaut est +grouperConfigDefaultValueHintPrefix=Par défaut config.GrouperDaemonReportConfiguration.attribute.quartz.cron.label=Quartz cron config.GrouperDaemonReportConfiguration.attribute.emailTo.label=Destinataire @@ -12645,18 +12821,138 @@ config.BoxProvisionerConfiguration.attribute.boxExternalSystemConfigId.label=Id config.BoxProvisionerConfiguration.attribute.invitabilityLevel.label=Invitability level config.BoxProvisionerConfiguration.attribute.memberViewabilityLevel.label=Member viewability level -config.AzureProvisionerConfiguration.title=Azure provisioner - -config.GenericConfiguration.subSection.group.title=Configuration de groupe -config.GenericConfiguration.subSection.group.description=Configuration concernant les groupes de la cible +config.DuoProvisionerConfiguration.title = Duo users +config.DuoProvisionerConfiguration.attribute.duoExternalSystemConfigId.label = Duo external system +config.DuoProvisionerConfiguration.attribute.duoExternalSystemConfigId.description = Duo external system + +config.DuoRoleProvisionerConfiguration.title = Duo administrators + +startWithBlankConfiguration = Configuration vide +config.SqlProvisioningGroupTableStartWith.startWithDescription = This is the description for group table start with +config.SqlProvisioningGroupTableStartWith.startWithDocumentation = This is the documentation for group table start with + +config.SqlProvisionerConfiguration.description = Le provisionneur Grouper SQL permet de provisionner les groupes / entitées / membres vers une BDD SQL. +config.SqlProvisionerConfiguration.documentation = La base données peut-être de n'importe quelle type et doit avoir été configurée comme connecteur externe. La structure des tables doit-être composé de : d'une table pour les groupes, d'une table pour les attributs de groupe, d'une table pour les entités, d'une table pour les attributs d'entités et d'une table pour les appartenances. + +config.LdapGrouperExternalSystem.description = Le provisionneur Grouper LDAP permet de provisionner les groupes / entitées / membres vers un LDAP ou un AD. +config.LdapGrouperExternalSystem.documentation = Le LDAP ou l'AD doit avoir été configuré en tant que connecteur externe. Les appartenances peuvent être représentés en tant que valeurs d'attributs d'un groupe (groupAttributes), ou en tant que valeurs d'attributs d'un utilisateur LDAP (entityAttributes). + +config.AzureProvisionerConfiguration.title=Azure +config.AzureProvisionerConfiguration.description = This is the description for Azure provisioner +config.AzureProvisionerConfiguration.documentation = This is the documentation for Azure provisioner +config.AzureProvisionerConfiguration.attribute.azureExternalSystemConfigId.label = External system config id + +config.AzureProvisionerConfiguration.attribute.allowOnlyMembersToPost.label = Show metadata for 'allow only members to post' +config.AzureProvisionerConfiguration.attribute.allowOnlyMembersToPost.description = When marking a group as provisionable, allow users to choose if only members can post +grouperProvisioningMetadataAllowOnlyMembersToPostLabel = Allow only members to post +grouperProvisioningMetadataAllowOnlyMembersToPostDescription = Change the default settings on a group that allows only members to post + +grouperProvisioningMetadataAzureGroupTypeDescription = Azure group type +grouperProvisioningMetadataAzureGroupTypeLabel = Azure group type + +config.azureGroupTypeMailEnabled = Mail enabled +config.azureGroupTypeMailEnabledSecurity = Mail enabled security +config.azureGroupTypeSecurity = Security +config.azureGroupTypeUnifiedSecurityEnabled = Unified security enabled +config.azureGroupTypeUnifiedNotSecurityEnabled = Unified security not enabled + +config.AzureProvisionerConfiguration.attribute.hideGroupInOutlook.label = Show metadata for 'hide group in outlook' +config.AzureProvisionerConfiguration.attribute.hideGroupInOutlook.description = When marking a group as provisionable, allow users to choose if group can be hidden in outlook +grouperProvisioningMetadataHideGroupInOutlookLabel = Hide group in outlook +grouperProvisioningMetadataHideGroupInOutlookDescription = Change the default settings on a group that allows to hide group in outlook + +config.AzureProvisionerConfiguration.attribute.subscribeNewGroupMembers.label = Show metadata for 'subscribe new group members' +config.AzureProvisionerConfiguration.attribute.subscribeNewGroupMembers.description = When marking a group as provisionable, allow users to choose if new group members can subscribe +grouperProvisioningMetadataSubscribeNewGroupMembersLabel = Subscribe new group members +grouperProvisioningMetadataSubscribeNewGroupMembersDescription = Change the default settings on a group that allows new group members to subscribe + +config.AzureProvisionerConfiguration.attribute.welcomeEmailDisabled.label = Show metadata for 'welcome email disabled' +config.AzureProvisionerConfiguration.attribute.welcomeEmailDisabled.description = When marking a group as provisionable, allow users to choose if welcome email can be disabled +grouperProvisioningMetadataWelcomeEmailDisabledLabel = Welcome email disabled +grouperProvisioningMetadataWelcomeEmailDisabledDescription = Change the default settings on a group that disables welcome email + +config.AzureProvisionerConfiguration.attribute.resourceProvisioningOptionsTeams.label = Show metadata for 'teams' +config.AzureProvisionerConfiguration.attribute.resourceProvisioningOptionsTeams.description = When marking a group as provisionable, allow users to choose if resource provisioning options can be set as Teams +grouperProvisioningMetadataResourceProvisioningOptionsTeamsLabel = Teams +grouperProvisioningMetadataResourceProvisioningOptionsTeamsDescription = Change the default settings on a group that sets resource provisioning options to Teams + +config.GoogleProvisionerConfiguration.title = Google + +config.GoogleProvisionerConfiguration.attribute.googleExternalSystemConfigId.label = External system config id + +config.GoogleProvisionerConfiguration.attribute.whoCanAdd.label = Show metadata for 'who can add' +config.GoogleProvisionerConfiguration.attribute.whoCanAdd.description = When marking a group as provisionable, allow users to choose who can add + +config.GoogleProvisionerConfiguration.attribute.whoCanJoin.label = Show metadata for 'who can join' +config.GoogleProvisionerConfiguration.attribute.whoCanJoin.description = When marking a group as provisionable, allow users to choose who can join + +config.GoogleProvisionerConfiguration.attribute.whoCanViewMembership.label = Show metadata for 'who can view membership' +config.GoogleProvisionerConfiguration.attribute.whoCanViewMembership.description = When marking a group as provisionable, allow users to choose who can view membership + +config.GoogleProvisionerConfiguration.attribute.whoCanViewGroup.label = Show metadata for 'who can view group' +config.GoogleProvisionerConfiguration.attribute.whoCanViewGroup.description = When marking a group as provisionable, allow users to choose who can view group + +config.GoogleProvisionerConfiguration.attribute.whoCanInvite.label = Show metadata for 'who can invite' +config.GoogleProvisionerConfiguration.attribute.whoCanInvite.description = When marking a group as provisionable, allow users to choose who can invite + +config.GoogleProvisionerConfiguration.attribute.allowExternalMembers.label = Show metadata for 'allow external members' +config.GoogleProvisionerConfiguration.attribute.allowExternalMembers.description = When marking a group as provisionable, allow users to choose if external members are allowed + +config.GoogleProvisionerConfiguration.attribute.whoCanPostMessage.label = Show metadata for 'who can post message' +config.GoogleProvisionerConfiguration.attribute.whoCanPostMessage.description = When marking a group as provisionable, allow users to choose who can post message + +config.GoogleProvisionerConfiguration.attribute.allowWebPosting.label = Show metadata for 'allow web posting' +config.GoogleProvisionerConfiguration.attribute.allowWebPosting.description = When marking a group as provisionable, allow users to choose if web posting is allowed + +grouperProvisioningMetadataWhoCanAddLabel = Who can add +grouperProvisioningMetadataWhoCanAddDescription = Change the default settings on a group to modify who can add +grouperProvisioningMetadataWhoCanJoinLabel = Who can join +grouperProvisioningMetadataWhoCanJoinDescription = Change the default settings on a group to modify who can join +grouperProvisioningMetadataWhoCanViewMembershipLabel = Who can view membership +grouperProvisioningMetadataWhoCanViewMembershipDescription = Change the default settings on a group to modify who can view membership +grouperProvisioningMetadataWhoCanInviteLabel = Who can invite +grouperProvisioningMetadataWhoCanInviteDescription = Change the default settings on a group to modify who can invite +grouperProvisioningMetadataWhoCanViewGroupLabel = Who can view +grouperProvisioningMetadataWhoCanViewGroupDescription = Change the default settings on a group to modify who can view group +grouperProvisioningMetadataWhoCanPostMessageLabel = Who can post +grouperProvisioningMetadataWhoCanPostMessageDescription = Change the default settings on a group to modify who can post +grouperProvisioningMetadataAllowExternalMembersLabel = Allow external members +grouperProvisioningMetadataAllowExternalMembersDescription = Change the default settings on a group that allows external members +grouperProvisioningMetadataAllowWebPostingLabel = Allow web posting +grouperProvisioningMetadataAllowWebPostingDescription = Change the default settings on a group that allows web posting + +grouperProvisioningMetadataDuoRolesLabel = Duo role +grouperProvisioningMetadataDuoRolesDescription = Pick a role +config.duoRoleOwner = Owner +config.duoRoleAdministrator = Administrator +config.duoRoleApplicationManager = Application manager +config.duoRoleUserManager = User manager +config.duoRoleHelpDesk = Help desk +config.duoRoleBilling = Billing +config.duoPhishingManager = Phishing Manager +config.duoRoleReadOnly = Read only + +grouperProvisioningMetadataDuoEmailLabel = Email address +grouperProvisioningMetadataDuoEmailDescription = Add an email address + +config.GenericConfiguration.subSection.entityAttributes.title=Configuration des attributs d'entité +config.GenericConfiguration.subSection.entityAttributes.description=Configuration concernant les attributs d'entité de la source +config.GenericConfiguration.subSection.entityAttributes.documentation = When provisioning user (entity) data, the data might be built-in to Grouper (e.g. subject id, name, description, subject identifier), or need a subject link (retrieve arbitrary subject API attributes), or use this, make a SQL or LDAP call to get attributes about a user. Generally this is 'false' and will be removed in a future Grouper release as we transition to user data fields. +config.GenericConfiguration.subSection.group.title=Configuration des groupes +config.GenericConfiguration.subSection.group.description=Configuration du provisionnement des groupes vers la cible +config.GenericConfiguration.subSection.group.documentation = A group consists of attributes and a collection of entities. Grouper provisions groups in the format that the target uses to represent them. config.GenericConfiguration.subSection.entity.title=Configuration de l'entité config.GenericConfiguration.subSection.entity.description=Configuration concernant les entités de la cible -config.GenericConfiguration.subSection.membership.title=Configuration des membres -config.GenericConfiguration.subSection.membership.description=Configuration concernant les membres de la cible +config.GenericConfiguration.subSection.entity.documentation = Une entité est un sujet ou un utilisateur. Les entités peuvent être dans des groupes en tant que membre (appartenance). Grouper provisionne les entités dans le format utilisé par la cible. Par défaut, Grouper assume qu'une autre système provisionne les entités et les utilises dont qu'en lecture seule, mais Grouper peut aussi insérer/mettre à jour/supprimer des entités si besoin. +config.GenericConfiguration.subSection.membership.title=Configuration des appartenances +config.GenericConfiguration.subSection.membership.description=Configuration du provisionnement des appartenances vers la cible +config.GenericConfiguration.subSection.membership.documentation = Grouper provisionne la relation effective entre une entité et un groupe sous la forme d'une appartenance. Grouper la provisionnera dans le format utilisé par la cible poour representer les appartenances. config.GenericConfiguration.subSection.assigningProvisioning.title=Affectation du provisionnement config.GenericConfiguration.subSection.assigningProvisioning.description=Paramètres liés à la façon dont les objets sont marqués comme provisionnable +config.GenericConfiguration.subSection.assigningProvisioning.documentation = Vous pouvez configurer comment les utilisateurs peuvent assigner des objets à un provisionnement, qui peut assigner, voir... config.GenericConfiguration.subSection.provisioningDiagnostics.title=Diagnostic de provisionnement config.GenericConfiguration.subSection.provisioningDiagnostics.description=Diagnostic de provisionnement +config.GenericConfiguration.subSection.provisioningDiagnostics.documentation = Execute un diagnostic pour avoir une vue des transformations et opérations effectuées sur la cible. Permet de s'assurer que le provisionnement s'effectue bien comme attendu. config.GenericConfiguration.subSection.advanced.title=Avancé config.GenericConfiguration.subSection.advanced.description=Avancé @@ -12666,51 +12962,78 @@ config.GenericConfiguration.subSection.targetGroupAttribute.i.description=Config config.GenericConfiguration.subSection.targetEntityAttribute.i.title=Cible __i+1__ config.GenericConfiguration.subSection.targetEntityAttribute.i.description=Configuration pour le champ / l'attribut de l'entité -config.GenericConfiguration.attribute.class.label=Classe +config.GenericConfiguration.subSection.targetMembershipAttribute.i.title = Target __i+1__ +config.GenericConfiguration.subSection.targetMembershipAttribute.i.description = Configuration for the membership attribute + +config.GenericConfiguration.attribute.class.label=Classe JAVA utilisée config.GenericConfiguration.attribute.quartzCron.label=Quartz cron -config.GenericConfiguration.attribute.quartzCron.description = Job quartz cron (not exact cron syntax) e.g. 38 17 4 * * ? means daily at 4:17:38am +config.GenericConfiguration.attribute.quartzCron.description = Quartz cron (diffère de la syntaxte cron habituelle, ex : 38 17 4 * * ? signifie tous les jours à 4:17:38am) config.GenericConfiguration.attribute.provisionerConfigId.label=Identifiant de configuration du provisionnement -config.GenericConfiguration.attribute.operateOnGrouperMemberships.label=Opère sur l'appartenance -config.GenericConfiguration.attribute.operateOnGrouperMemberships.description=Si vous provisionnez les membres. Généralement, ce sera « vrai ». +config.GenericConfiguration.attribute.operateOnGrouperMemberships.label=Provisionner les appartenances +config.GenericConfiguration.attribute.operateOnGrouperMemberships.description=Si vous provisionnez les appartenances. Dans la plupart des cas, oui. config.GenericConfiguration.attribute.membershipFields.label=Champs d'appartenance config.GenericConfiguration.attribute.membershipFields.description=Si vous provisionnez des appartenances ou des privilèges. En général, il suffit de laisser cela à la valeur par défaut (membres, ce qui signifie appartenance) à moins que vous ne vouliez que la cible ait des informations sur les personnes autorisées à effectuer certaines opérations dans Grouper (p. ex., droit de LECTURE sur l'appartenance d’un groupe). -config.GenericConfiguration.attribute.insertMemberships.label=Ajouter des membres -config.GenericConfiguration.attribute.insertMemberships.description=Si des membres doivent être ajoutées à la cible, ce sera généralement « vrai ». -config.GenericConfiguration.attribute.selectMemberships.label=Sélectionner des membres -config.GenericConfiguration.attribute.selectMemberships.description=Si les membres doivent être lues à partir de la cible. Généralement, ce sera 'vrai', sauf dans les cas où des messages sont envoyés à la cible sans connaître l’état de la cible. -config.GenericConfiguration.attribute.deleteMemberships.label=Supprimer des membres -config.GenericConfiguration.attribute.deleteMemberships.description=Si vous voulez supprimer des membres dans la cible, vous pouvez sélectionner le type de « suppressions » par défaut il est à la valeur « vrai ». -config.GenericConfiguration.attribute.deleteMembershipsIfGrouperDeleted.label=Supprimer les membres si supprimées par Grouper -config.GenericConfiguration.attribute.deleteMembershipsIfGrouperDeleted.description=Il s’agit du paramétrage « classique ». Supprimer les membres des groupes provisionnables dans la cible que si le membre vient d’être supprimée dans Grouper. Cela signifie que les membres présents avant l’existence du provisonnement, ou les membres qui ont été ajoutées uniquement dans la cible (pas dans Grouper), ne seront pas supprimées. -config.GenericConfiguration.attribute.deleteMembershipsIfGrouperCreated.label=Supprimer les membres si créées par Grouper -config.GenericConfiguration.attribute.deleteMembershipsIfGrouperCreated.description=Supprimer les membres si Grouper a provisionné le membre à un moment donné dans le passé et le membre a été supprimée dans Grouper. -config.GenericConfiguration.attribute.operateOnGrouperGroups.label=Opérer sur des groupes -config.GenericConfiguration.attribute.operateOnGrouperGroups.description=Si ce provisionnement implique des objets de groupe. Cela peut ne pas être vrai si vous mettez en service des appartenances ou des entityAttributes sans lien sur le groupe cible. -config.GenericConfiguration.attribute.selectGroups.label=Sélectionnez des groupes -config.GenericConfiguration.attribute.selectGroups.description = If groups should be read from the target. Generally this will be 'true' except:
    1. Messages are sent to the target without knowing the state of the target
    2. Provisioning userAttributes with no group link
    3. Provisioning membership objects with no group link
    -config.GenericConfiguration.attribute.insertGroups.label=Insérer des groupes -config.GenericConfiguration.attribute.insertGroups.description = If provisionable groups in Grouper which do not exist in the target should be created in the target. Generally this will be 'true'. +config.GenericConfiguration.attribute.insertMemberships.label=Insertion des appartenances +config.GenericConfiguration.attribute.insertMemberships.description=Si les appartenances doivent être provisionnées dans la cible, généralement oui. +config.GenericConfiguration.attribute.customizeMembershipCrud.label = Personnaliser le CRUD des appartenances +config.GenericConfiguration.attribute.customizeMembershipCrud.description = Personnalise les caractéristiques des opération de insertion/lecture/mis à jour/suppression (Create/Read/Update/Delete) pour les appartenances. Par défaut, les opérations sur les appartenances seronts les suivantes : SELECT / INSERT / DELETE_IF_GROUPER_CREATED_THEN_DELETED +config.GenericConfiguration.attribute.selectMemberships.label=Sélection des appartenances +config.GenericConfiguration.attribute.selectMemberships.description=Si les appartenances doivent être récupérés depuis la cible. Généralement oui, sauf dans les cas où l’état de la cible importe peu. +config.GenericConfiguration.attribute.deleteMemberships.label=Supprimer les appartenances +config.GenericConfiguration.attribute.deleteMemberships.description=Si vous voulez supprimer les appartenances provisionnées dans la cible, généralement oui. Plusieurs type de suppressions vous seront proposé. +config.GenericConfiguration.attribute.deleteMembershipsIfGrouperDeleted.label=Supprimer les appartenances lorsqu'ils le sont côté Grouper +config.GenericConfiguration.attribute.deleteMembershipsIfGrouperDeleted.description=Option intermediaire. Supprimer les appartenances dans la cible uniquement si elles sont supprimées dans Grouper. Cela implique que les appartenances présentes avant la mise en place du provisionnement, ou présentes uniquement dans la cible (et non dans Grouper), ne seront pas supprimées. +config.GenericConfiguration.attribute.deleteMembershipsIfGrouperCreated.label=Supprimer l'appartenance si créées par Grouper +config.GenericConfiguration.attribute.deleteMembershipsIfGrouperCreated.description=Supprime les appartenances lorsque Grouper les a provisionnée à un moment donné et que cette appartenance a été supprimée dans Grouper. +config.GenericConfiguration.attribute.operateOnGrouperGroups.label=Provisionner les groupes +config.GenericConfiguration.attribute.operateOnGrouperGroups.description=Si le provisionnement implique des groupes. Ce n'est pas toujours le cas, notamment si vous provisionnez des appartenances ou des attributs d'entités (entityAttributes) sans lien avec un groupe cible. + +config.GenericConfiguration.attribute.membershipAdvancedOptions.label = Options avancées +config.GenericConfiguration.attribute.membershipAdvancedOptions.description = Advanced membership options, note, there might not be any + +config.GenericConfiguration.attribute.membership2AdvancedOptions.label = Options avancées +config.GenericConfiguration.attribute.membership2AdvancedOptions.description = Advanced membership2 options, note, there might not be any + +config.GenericConfiguration.attribute.customizeGroupCrud.label = Personnaliser le CRUD des groupes +config.GenericConfiguration.attribute.customizeGroupCrud.description = Personnalise les caractéristiques des opération de insertion/lecture/mis à jour/suppression (Create/Read/Update/Delete) pour les groupes. Par défaut, les opérations sur les groupes seronts les suivantes : SELECT / INSERT / UPDATE / DELETE_IF_GROUPER_CREATED_THEN_DELETED + +config.GenericConfiguration.attribute.makeChangesToEntities.label = Opérer sur les entités +config.GenericConfiguration.attribute.makeChangesToEntities.description = Si des opérations d'insertion, de mise à jours ou de suppression doivent être effectuées sur les entités de la cible. Par défaut, Grouper fait uniquement de la selection sur les entités de la cible. + +config.GenericConfiguration.attribute.customizeEntityCrud.label = Personnaliser le CRUD des entités +config.GenericConfiguration.attribute.customizeEntityCrud.description = Personnalise les caractéristiques des opération de insertion/lecture/mis à jour/suppression (Create/Read/Update/Delete) pour les entités. Par défaut, les opérations seront limités au SELECT ou SELECT / INSERT / UPDATE / DELETE_IF_GROUPER_CREATED_THEN_DELETED si le choix a été fait d'opérer sur les entités de la cibles. + +config.GenericConfiguration.attribute.selectGroups.label=Sélection des groupes +config.GenericConfiguration.attribute.selectGroups.description = Si les groupes doivent être récupérés depuis la cible. Généralement oui, sauf dans les cas où :
    1. l'état de la cible importe peu
    2. Le provisionnement d'attributs d'utilisateur (userAttribute) sans aucun lien avec un groupe de la cible
    3. Le provisionnement d'appartenance sans aucun lien avec un groupe de la cible
    +config.GenericConfiguration.attribute.insertGroups.label=Insertion des groupes +config.GenericConfiguration.attribute.insertGroups.description = Si les groupes provisionnables, inexistants dans la cible, doivent être créés. Généralement oui. config.GenericConfiguration.attribute.deleteGroups.label=Supprimer les groupes -config.GenericConfiguration.attribute.deleteGroups.description=Si vous souhaitez supprimer des groupes dans la cible. Vous pouvez sélectionner la valeur "vrai" pour choisir parmi les types de "suppressions" dans les options de suppression ci-dessous. -config.GenericConfiguration.attribute.deleteMembershipsIfNotExistInGrouper.label=Supprimer les appartenances de membres si elles n'existent pas dans Grouper -config.GenericConfiguration.attribute.deleteMembershipsIfNotExistInGrouper.description=En général, c'est l'option que vous souhaitez. Supprimez toutes les appartenances des groupes provisionnables dans la cible qui ne trouvent pas dans Grouper. Cela signifie que Grouper fait autorité sur les appartenances. +config.GenericConfiguration.attribute.deleteGroups.description=Si vous voulez supprimer les groupes provisionnés dans la cible. Plusieurs type de suppressions vous seront proposé. +config.GenericConfiguration.attribute.deleteMembershipsIfNotExistInGrouper.label=Supprimer les appartenances si elles n'existent pas dans Grouper +config.GenericConfiguration.attribute.deleteMembershipsIfNotExistInGrouper.description=En général, c'est l'option à utiliser. Supprime toutes les appartenances, ne se trouvant pas dans Grouper, de la cible. Signifie que Grouper fait autorité sur les appartenances de la cible. config.GenericConfiguration.attribute.deleteGroupsIfNotExistInGrouper.label=Supprimer les groupes s'ils n'existent pas dans Grouper -config.GenericConfiguration.attribute.deleteGroupsIfNotExistInGrouper.description=Supprimez tous les groupes de la cible sélectionnés à partir de l'opération « sélectionner tous les groupes » qui ne sont pas dans Grouper. Cela signifie que Grouper fait autorité sur les groupes. -config.GenericConfiguration.attribute.deleteGroupsIfGrouperDeleted.label=Supprimer les groupes s'ils sont supprimés dans Grouper -config.GenericConfiguration.attribute.deleteGroupsIfGrouperDeleted.description = This is the "medium" knob. Only delete a group if the group was provisionable and was just deleted in Grouper. This means that groups that existed before the provisioner existed, or groups that were added only in the target (not in Grouper), will not be removed. -config.GenericConfiguration.attribute.deleteGroupsIfGrouperCreated.label=Supprimer les groupes s'ils sont créés par Grouper -config.GenericConfiguration.attribute.deleteGroupsIfGrouperCreated.description=Supprimez les groupes si Grouper a provisionné le groupe à un moment donné dans le passé et que le groupe a été supprimé dans Grouper. -config.GenericConfiguration.attribute.updateGroups.label=Mettre à jour les groupes -config.GenericConfiguration.attribute.updateGroups.description = If group fields and attributes which differ from the target should cause the target data to be updated. This does not include the membership attribute if the membership provisioning type if groupAttributes. +config.GenericConfiguration.attribute.deleteGroupsIfNotExistInGrouper.description=Supprimer les groupes de la cible n'existant plus dans Grouper et à condition de faire partie de la requête de sélection des tous les groupes (select all groupes). Signifie que Grouper fait autorité sur les groupes de la cible. +config.GenericConfiguration.attribute.deleteGroupsIfGrouperDeleted.label=Supprimer les groupes lorsqu'ils le sont côté Grouper +config.GenericConfiguration.attribute.deleteGroupsIfGrouperDeleted.description = Option intermediaire. Supprimer les groupes dans la cible uniquement si elles sont supprimées dans Grouper. Cela implique que les groupes présents avant la mise en place du provisionnement, ou présents uniquement dans la cible (et non dans Grouper), ne seront pas supprimées. +config.GenericConfiguration.attribute.deleteGroupsIfGrouperCreated.label=Supprimer les groupes si créés par Grouper +config.GenericConfiguration.attribute.deleteGroupsIfGrouperCreated.description=Supprime les groupes si Grouper a provisionné le groupe à un moment donné et que le groupe a été supprimé dans Grouper. +config.GenericConfiguration.attribute.updateGroups.label=Mise à jour des groupes +config.GenericConfiguration.attribute.updateGroups.description = Si les champs et attributs des groupes qui diffèrent de la cible doivent être mis à jour. Cela ne concerne pas les attributs d'appartenances si le type de provisionnement est groupAttributes. + +config.GenericConfiguration.attribute.groupRequireMembers.label = Membres obligatoires +config.GenericConfiguration.attribute.groupRequireMembers.description = Si le groupe n'a pas de membres, alors considérer qu'il n'est pas provisionnable (avec possibilité de suppression dans la cible) + + +grouper.provisioning.attribute = Attribut config.GenericConfiguration.attribute.showProvisioningDiagnostics.label=Afficher les diagnostics d'approvisionnement config.GenericConfiguration.attribute.showAdvanced.label=Afficher les paramètres avancés config.GenericConfiguration.attribute.canFullSync.label=Peut synchroniser complètement config.GenericConfiguration.attribute.selectAllGroupsDuringDiagnostics.label=Sélectionnez tous les groupes pendant le diagnostic -config.GenericConfiguration.attribute.selectAllGroupsDuringDiagnostics.description = For large provisioners this could take some time. Will select all groups and show some info on them +config.GenericConfiguration.attribute.selectAllGroupsDuringDiagnostics.description = Selectionne tous les groupes et affiche certaines informations. En cas de large provisionnement, peut allonger le délai de traitement. config.GenericConfiguration.attribute.selectAllEntitiesDuringDiagnostics.label=Sélectionner toutes les entités lors du diagnostic -config.GenericConfiguration.attribute.selectAllEntitiesDuringDiagnostics.description = For large provisioners this could take some time. Will select all entities and show some info on them -config.GenericConfiguration.attribute.selectAllMembershipsDuringDiagnostics.label = Select all memberships during diagnostics -config.GenericConfiguration.attribute.selectAllMembershipsDuringDiagnostics.description = For large provisioners this could take some time. Will select all memberships and show some info on them +config.GenericConfiguration.attribute.selectAllEntitiesDuringDiagnostics.description = Selectionne toutes les entités et affiche certaines informations. En cas de large provisionnement, peut allonger le délai de traitement. +config.GenericConfiguration.attribute.selectAllMembershipsDuringDiagnostics.label = toutes les appartenances lors du diagnostic +config.GenericConfiguration.attribute.selectAllMembershipsDuringDiagnostics.description = Selectionne toutes les appartenances et affiche certaines informations. En cas de large provisionnement, peut allonger le délai de traitement. config.GenericConfiguration.attribute.createGroupDuringDiagnostics.label=Créer un groupe pendant le diagnostic config.GenericConfiguration.attribute.createEntityDuringDiagnostics.label=Créer une entité pendant le diagnostic config.GenericConfiguration.attribute.deleteGroupDuringDiagnostics.label=Supprimer le groupe pendant le diagnostic @@ -12718,57 +13041,134 @@ config.GenericConfiguration.attribute.deleteEntityDuringDiagnostics.label=Suppri config.GenericConfiguration.attribute.testGroupName.label=Nom du groupe de tests config.GenericConfiguration.attribute.testGroupName.description=Mettez un nom complet de groupe ici qui est marqué comme provisionnable, par ex. test:testGroup config.GenericConfiguration.attribute.testSubjectIdOrIdentifier.label=Test de l'id du sujet ou de l'identifiant -config.GenericConfiguration.attribute.debugLog.label=Journal de débogage -config.GenericConfiguration.attribute.logAllObjectsVerbose.label=Déboguer tous les objets détaillés -config.GenericConfiguration.attribute.groupAllowedToAssign.label=Groupe autorisé à attribuer +config.GenericConfiguration.attribute.debugLog.label=Journal de debug +config.GenericConfiguration.attribute.logAllObjectsVerbose.label=Afficher les logs détaillés de tous les objets +config.GenericConfiguration.attribute.logCommandsAlways.label = Log toutes les commandes effectuées sur la cible +config.GenericConfiguration.attribute.logCommandsAlways.description = Log toutes les commandes bas niveau effectuées sur la cible (succès et echec). A activer uniquement en cas de dépannage. +config.GenericConfiguration.attribute.logCommandsOnError.label = Log les commandes en erreur effectuées sur la cible +config.GenericConfiguration.attribute.logCommandsOnError.description = Log les commandes bas niveau, en erreur, sur la cible. A activer uniquement en cas de dépannage. Influence les performances même pour les transactions sans erreurs. +config.GenericConfiguration.attribute.groupAllowedToAssign.label=Groupe autorisé à assigner +config.GenericConfiguration.attribute.groupAllowedToView.label = Group autorisé à voir config.GenericConfiguration.attribute.allowAssignmentsOnlyOnOneStem.label=Autoriser les affectations uniquement sur une racine config.GenericConfiguration.attribute.readOnly.label=Lecture seulement -config.GenericConfiguration.attribute.numberOfGroupAttributes.label=Nombre d'attributs de groupe -config.GenericConfiguration.attribute.numberOfGroupAttributes.description = In the object that represents a target group, this is the number of fields and attributes +config.GenericConfiguration.attribute.readOnly.description = Execute le provisionnement en lecture seule, cela signifie qu'aucun changement ne sera fait sur la cible. L'option "Afficher les logs détaillés de tous les objets" permet d'afficher les opérations qu'auraient fait le provisionnement. +config.GenericConfiguration.attribute.numberOfGroupAttributes.label=Nombre d'attribut de groupe +config.GenericConfiguration.attribute.numberOfMembershipAttributes.label = Nombre d'attribut d'appartenance +config.GenericConfiguration.attribute.numberOfGroupAttributes.description = Dans l'objet representant un groupe dans la cible, c'est le nombre de champs et d'attributs +config.GenericConfiguration.attribute.numberOfMembershipAttributes.description = Dans l'objet representant une appartenance dans la cible, c'est le nombre d'attributs config.GenericConfiguration.attribute.recalculateAllOperations.label=Recalculer tous les événements en temps réel config.GenericConfiguration.attribute.provisioningType.label=Type d'approvisionnement config.GenericConfiguration.attribute.groupIdOfUsersToProvision.label=ID de groupe d'entités à provisionner -config.GenericConfiguration.attribute.groupIdOfUsersToProvision.Description = Provide a group name of users to provision to the target. If a user is not in the group then they are not provisionable anymore. +config.GenericConfiguration.attribute.groupIdOfUsersToProvision.Description = Founit un groupe d'utilisateurs à provisionner dans la cible. Si l'utilisateur n'en fait pas partie, il n'est plus provisionnable. +config.GenericConfiguration.attribute.subjectIdentifierForMemberSyncTable.label = Synchro de membre -identifiant de sujet +config.GenericConfiguration.attribute.subjectIdentifierForMemberSyncTable.description = Les membres peuvent avoir jusqu'à 3 identifiants de sujets configurés dans Grouper. Selectionner celui qui sera stocké, dans la table de synchro de membre, pour le provisionnement. Surcharge le comportement par défaut déterminé par la manière dont le provisionnement est configuré. config.GenericConfiguration.attribute.membershipsConvertToGroupSyncThreshold.label = Memberships convert to group sync threshold config.GenericConfiguration.attribute.scoreConvertToFullSyncThreshold.label = Score convert to full sync threshold -config.GenericConfiguration.attribute.hasTargetGroupLink.label=A un lien avec le groupe cible -config.GenericConfiguration.attribute.hasTargetGroupLink.description = "Group link" is when memberships refer to some data that does not exist in Grouper and needs to be retrieved from the target Group object. This data is cached in the "group sync" database table. Here are some examples:
    1. Provisioning membership objects where the group reference is a target DN or UUID.
    2. Provisioning entityAttributes where the group value is a target DN or UUID
    +config.GenericConfiguration.attribute.hasTargetGroupLink.label=A un lien avec des groupes dans la cible +config.GenericConfiguration.attribute.hasTargetGroupLink.description = Un lien de groupe (group link) doit s'opérer lorsque le provisionnement nécessite des données non-présentes dans Grouper mais récupérable dans l'objet du groupe cible. Ces données sont mis en cache dans la table "group sync" de la base de données. Quelques exemples de cas où cela est nécessaire :
    1. Provisionner les appartenances à un groupe à partir de son DN ou de son UUID.
    2. Provisionner des entityAttributes où la valeur de groupe est un DN ou un UUID
    +config.AzureProvisioningStartWith.attribute.azureExternalSystemConfigId.label = External system config id +config.AzureProvisioningStartWith.attribute.azureExternalSystemConfigId.description = Pick the Azure extenal system to connect to for this provisioner. If the azure external system is not in the list, first go and configure that in the Grouper external system UI screen. + +config.AzureProvisioningStartWith.attribute.azurePattern.label = Azure pattern +config.AzureProvisioningStartWith.attribute.azurePattern.description = Azure pattern + +config.AzureProvisioningStartWith.attribute.userAttributesType.label = User attributes type +config.AzureProvisioningStartWith.attribute.userAttributesType.description = User attributes type + +config.AzureProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.label = Subject source entity resolver attributes +config.AzureProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.description = Subject source entity resolver attributes + +config.AzureProvisioningStartWith.attribute.groupDisplayNameAttributeValue.label = Group display name attribute value +config.AzureProvisioningStartWith.attribute.groupDisplayNameAttributeValue.description = Group display name attribute value + +config.AzureProvisioningStartWith.attribute.useGroupDescription.label = Use group description +config.AzureProvisioningStartWith.attribute.useGroupDescription.description = Use group description + +config.AzureProvisioningStartWith.attribute.mailNicknameAttributeValue.label = Mail nickname attribute value +config.AzureProvisioningStartWith.attribute.mailNicknameAttributeValue.description = Mail nickname attribute value + +config.AzureProvisioningStartWith.attribute.hasMetadataForGroupType.label = Has metadata for group type +config.AzureProvisioningStartWith.attribute.hasMetadataForGroupType.description = Has metadata for group type + +config.AzureProvisioningStartWith.attribute.hasMetadataForAllowOnlyMembersToPost.label = Has metadata for allow only members to post +config.AzureProvisioningStartWith.attribute.hasMetadataForAllowOnlyMembersToPost.description = Has metadata for allow only members to post + +config.AzureProvisioningStartWith.attribute.hasMetadataForHideGroupInOutlook.label = Has metadata for hide group in outlook +config.AzureProvisioningStartWith.attribute.hasMetadataForHideGroupInOutlook.description = Has metadata for hide group in outlook + +config.AzureProvisioningStartWith.attribute.hasMetadataForSubscribeNewGroupMembers.label = Has metadata for subscribe new group members +config.AzureProvisioningStartWith.attribute.hasMetadataForSubscribeNewGroupMembers.description = Has metadata for subscribe new group members + +config.AzureProvisioningStartWith.attribute.hasMetadataForWelcomeEmailDisabled.label = Has metadata for welcome email disabled +config.AzureProvisioningStartWith.attribute.hasMetadataForWelcomeEmailDisabled.description = Has metadata for welcome email disabled + +config.AzureProvisioningStartWith.attribute.hasMetadataForResourceProvisioningOptionsTeams.label = Has metadata for resource provisioning options teams +config.AzureProvisioningStartWith.attribute.hasMetadataForResourceProvisioningOptionsTeams.description = Has metadata for resource provisioning options teams + +config.AzureProvisioningStartWith.attribute.entityUserPrincipalName.label = Entity user principal name +config.AzureProvisioningStartWith.attribute.entityUserPrincipalName.description = Entity user principal name + +config.AzureProvisioningStartWith.attribute.entityMailNickname.label = Entity mail nickname +config.AzureProvisioningStartWith.attribute.entityMailNickname.description = Entity mail nickname + +config.AzureProvisioningStartWith.attribute.entityOnPremisesImmutableId.label = Entity on premises immutable id +config.AzureProvisioningStartWith.attribute.entityOnPremisesImmutableId.description = Entity on premises immutable id + +config.AzureProvisioningStartWith.attribute.manageEntitiesInAzure.label = Manage entities in azure +config.AzureProvisioningStartWith.attribute.manageEntitiesInAzure.description = Manage entities in azure + +config.AzureProvisioningStartWith.attribute.entityDisplayName.label = Entity display name +config.AzureProvisioningStartWith.attribute.entityDisplayName.description = Entity display name + +config.DuoProvisioningStartWith.attribute.duoExternalSystemConfigId.label = Duo external system +config.DuoProvisioningStartWith.attribute.duoExternalSystemConfigId.description = Duo external system + +config.DuoProvisioningStartWith.attribute.duoPattern.label = Duo pattern +config.DuoProvisioningStartWith.attribute.duoPattern.description = Duo pattern + +config.DuoProvisioningStartWith.attribute.userAttributesType.label = User attributes type +config.DuoProvisioningStartWith.attribute.userAttributesType.description = User attributes type + +config.DuoProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.label = Subject source entity resolver attributes +config.DuoProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.description = Subject source entity resolver attributes + +config.DuoProvisioningStartWith.attribute.manageGroups.label = Manage groups +config.DuoProvisioningStartWith.attribute.manageGroups.description = Manage groups + +config.DuoProvisioningStartWith.attribute.groupNameAttributeValue.label = Group name attribute value +config.DuoProvisioningStartWith.attribute.groupNameAttributeValue.description = Group name attribute value + +config.DuoProvisioningStartWith.attribute.useGroupDescription.label = Use group description +config.DuoProvisioningStartWith.attribute.useGroupDescription.description = Use group description + +config.DuoProvisioningStartWith.attribute.manageEntities.label = Manage entities +config.DuoProvisioningStartWith.attribute.manageEntities.description = Manage entities + +config.DuoProvisioningStartWith.attribute.entityUserName.label = User name +config.DuoProvisioningStartWith.attribute.entityUserName.description = Entity user name + +config.DuoProvisioningStartWith.attribute.entityNameSubjectAttribute.label = Name subject attribute or entity resolver name +config.DuoProvisioningStartWith.attribute.entityNameSubjectAttribute.description = Name subject attribute or entity resolver name + +config.DuoProvisioningStartWith.attribute.entityFirstNameSubjectAttribute.label = First name subject attribute or entity resolver name +config.DuoProvisioningStartWith.attribute.entityFirstNameSubjectAttribute.description = First name subject attribute or entity resolver name + +config.DuoProvisioningStartWith.attribute.entityEmailSubjectAttribute.label = Email subject attribute or entity resolver name +config.DuoProvisioningStartWith.attribute.entityEmailSubjectAttribute.description = Email subject attribute or entity resolver name config.GenericConfiguration.attribute.refreshSubjectLinkIfLessThanAmount.label=Actualiser le lien du sujet config.GenericConfiguration.attribute.refreshEntityLinkIfLessThanAmount.label=Actualiser le lien de l'entité cible config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.label=Actualiser le lien du groupe cible -config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.description = Target group links will be refreshed when they can be (full sync retrieve all groups), or when they must be (group link data is not cached in Grouper). Otherwise if there are groups to operate on, if there are only a few (less than this amount), then refresh the group link, otherwise for expediency just use the cached data. Generally you do not need to edit this value. This is an integer. - -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache0.label=Lien du sujet - entityAttributeValueCache0 -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache1.label=Lien du sujet - entityAttributeValueCache1 -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache2.label=Lien du sujet - entityAttributeValueCache2 -config.GenericConfiguration.attribute.common.subjectLink.entityAttributeValueCache3.label=Lien du sujet - entityAttributeValueCache3 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache0.label=Lien d'entité cible - entityAttributeValueCache0 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache1.label=Lien d'entité cible - entityAttributeValueCache1 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache2.label=Lien d'entité cible - entityAttributeValueCache2 -config.GenericConfiguration.attribute.common.entityLink.entityAttributeValueCache3.label=Lien d'entité cible - entityAttributeValueCache3 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.label=Lien du groupe cible - groupAttributeValueCache0 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache0.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.label=Lien du groupe cible - groupAttributeValueCache1 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache1.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.label=Lien du groupe cible - groupAttributeValueCache2 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache2.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.label=Lien du groupe cible - groupAttributeValueCache3 -config.GenericConfiguration.attribute.common.groupLink.groupAttributeValueCache3.description=En général, vous n’avez pas besoin de modifier cela, et vous le configurerez dans une configuration d’attributs. Il s’agit de l’un des quatre buckets de synchronisation. Entrez un JEXL en utilisant la variable "targetGroup" (type ProvisioningGroup.java). En fonction des données retournées par le DAO du provisionneur, vous pouvez vous référer aux champs ${targetGroup.name} ou aux attributs ${targetGroup.retrieveAttributeValue('someAttrName')} +config.GenericConfiguration.attribute.refreshGroupLinkIfLessThanAmount.description = Les liens de groupes cibles seront rafraichis quand ils peuvent l'être (récupération de tous les groupes lors d'une synchro complète), ou quand ils doivent l'être (les données de lien du groupe ne sont pas en cache dans Grouper). Autrement lors d'opérations sur des groupes et lorsqu'il y en a moins que ce nombre le lien de groupe sera actualisé et si il y en a plus, les données mises en cache seront utilisées. La valeur doit-être un entier. + config.GenericConfiguration.attribute.targetGroupAttribute.i.name.label=__i+1__ - nom config.GenericConfiguration.attribute.targetGroupAttribute.i.name.description=Le nom de l'attribut est la clé dans les paires clé/valeur pour ce groupe -config.GenericConfiguration.attribute.targetGroupAttribute.i.isFieldElseAttribute.label=__i+1__ - champ ou attribut -config.GenericConfiguration.attribute.option.targetGroupAttribute.i.isFieldElseAttribute.trueLabel=Champ -config.GenericConfiguration.attribute.option.targetGroupAttribute.i.isFieldElseAttribute.falseLabel=Attribut config.GenericConfiguration.attribute.option.targetGroupAttribute.i.groupAttributePrefix=Groupe config.GenericConfiguration.attribute.option.targetEntityAttribute.i.entityAttributePrefix=Entité config.GenericConfiguration.attribute.option.targetGroupAttribute.i.attributePrefix=attr -config.GenericConfiguration.attribute.option.targetGroupAttribute.i.fieldPrefix=Champ -config.GenericConfiguration.attribute.targetGroupAttribute.i.isFieldElseAttribute.description=Il existe des champs de groupe intégrés : id, idIndex, name, displayName. Les attributs peuvent avoir des noms libres. Consultez la documentation sur le type de fournisseur pour connaitre les champs ou attributs pris en charge. -config.GenericConfiguration.attribute.targetGroupAttribute.i.fieldName.label=__i+1__ - nom -config.GenericConfiguration.attribute.targetGroupAttribute.i.fieldName.description = ProvisioningGroup.java field name. + provisioning.helper.variable.grouperProvisioningGroup=grouperProvisioningGroup (ProvisioningGroup.java) : il s’agit de la représentation Grouper du groupe. Les champs incluent : id, idIndex, name, displayName. Les attributs comprennent : description provisioning.helper.variable.gcGrouperSyncGroup=gcGrouperSyncGroup (GcGrouperSyncGroup.java) : il s’agit de l’objet de groupe "sync". Les champs comprennent : groupAttributeValueCache0, groupAttributeValueCache1, groupAttributeValueCache2, groupAttributeValueCache3 @@ -12785,16 +13185,9 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.update.label=__i+1_ config.GenericConfiguration.attribute.targetGroupAttribute.i.update.description=Cet attribut devrait être modifié lors de la mise à jour du groupe. config.GenericConfiguration.attribute.targetGroupAttribute.i.ignoreIfMatchesValue.label=__i+1__ - ignorer si cela correspond à la valeur config.GenericConfiguration.attribute.targetGroupAttribute.i.ignoreIfMatchesValue.description=Si le champ de groupe ou la valeur d'attribut correspond à l'une de ces valeurs, ignorez-le (ne pas supprimer ni mettre à jour). Valeurs séparées par des virgules, la virgule échappée est U+002C -config.GenericConfiguration.attribute.targetGroupAttribute.i.matchingId.label=__i+1__ - identifiant correspondant -config.GenericConfiguration.attribute.targetGroupAttribute.i.matchingId.description=Le "matching id" est l'attribut qui est utilisé pour faire correspondre les objets cibles avec les objets Grouper. Si l'ID correspondant est quelque chose d'opaque comme idIndex ou uuid, les objets peuvent être renommés de manière plus fiable. config.GenericConfiguration.attribute.targetGroupAttribute.i.multiValued.label=__i+1__ - attribut à plusieurs valeurs config.GenericConfiguration.attribute.targetGroupAttribute.i.multiValued.description=Si cet attribut est multi-évalué dans la cible. En général, les attributs ont une valeur unique. L'attribut d'appartenance doit avoir plusieurs valeurs si vous approvisionnez groupAttributes. -config.GenericConfiguration.attribute.targetGroupAttribute.i.searchAttribute.label=__i+1__ - attribut de recherche -config.GenericConfiguration.attribute.targetGroupAttribute.i.searchAttribute.description=Si cet attribut est utilisé pour rechercher des groupes dans la cible. La recherche dans la cible pour ce groupe peut simplement avoir besoin de ce nom et de cette valeur d'attribut ou il peut y avoir un filtre de recherche, et c'est la valeur de la variable de liaison. -config.GenericConfiguration.attribute.targetGroupAttribute.i.membershipAttribute.label=__i+1__ - attribut d'appartenance -config.GenericConfiguration.attribute.targetGroupAttribute.i.membershipAttribute.description=S'il s'agit d'un approvisionnement de type groupAttribute et que cet attribut est multi-évalué et contient des entrées qui représentent des entités/appartenances config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionCreateOnly.label=__i+1__ - insertion d'expression de traduction uniquement -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionCreateOnly.description = If you have a different translation from Grouper to Target for updates as opposed to inserts, put the insert translation here. Available variables:
    • $$provisioning.helper.variable.grouperProvisioningGroup$$
    • $$provisioning.helper.variable.gcGrouperSyncGroup$$
    • $$provisioning.helper.variable.provisioningGroupWrapper$$
    • $$provisioning.helper.variable.grouperTargetGroup$$
    config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionTypeCreateOnly.label=__i+1__ - insertion de type de traduction uniquement config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionTypeCreateOnly.description=Si c’est une simple (insérer seulement) traduction directement à partir du champ, puis sélectionnez GrouperProvisioningGroupField puisque vous n’avez pas à vous soucier d’une faute de script et la performance est meilleure. Sinon, configurez un script de traduction. @@ -12803,13 +13196,9 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromGroupe config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromGrouperProvisioningGroupFieldCreateOnly.description=Sélectionnez le champ (pour insérer uniquement) dans grouperProvisioningGroup à partir duquel copier les données. id : est l’UUID du groupe, idIndex : identifiant numérique, displayExtension : dernière partie du nom e.g. pour affichage dans l’interface utilisateur, displayName : chemin complet du nom d’affichage e.g. pour affichage dans l’interface utilisateur, extension : dernière partie du nom du système, nom : chemin complet du nom du système, description : description du groupe config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionType.label=__i+1__ - type de traduction -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionType.description = If this is a simple translation straight from field, then select GrouperProvisioningGroupField since you do not have to worry about a script typo and the performance is better. Otherwise configure a translation script. -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromGrouperProvisioningGroupField.label = __i+1__ - translate from grouperProvisioningGroup field -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromGrouperProvisioningGroupField.description = Select the field from grouperProvisioningGroup to copy data from. id: is the UUID of the group, idIndex: numeric indentifier, displayExtension: last part of the name e.g. for display in the UI, displayName: full path of of the display name e.g. for display in the UI, extension: last part of the system name, name: full path of the system name, description: group description config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpression.label=__i+1__ - expression de traduction -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpression.description = This is the translation for this attribute from Grouper to Target format during Group updates and inserts (if not overridden by "insert only" translation). Available variables:
    • $$provisioning.helper.variable.grouperProvisioningGroup$$
    • $$provisioning.helper.variable.gcGrouperSyncGroup$$
    • $$provisioning.helper.variable.provisioningGroupWrapper$$
    • $$provisioning.helper.variable.grouperTargetGroup$$
    config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionFromMembership.label=__i+1__ - expression de traduction de l'appartenance config.GenericConfiguration.attribute.targetGroupAttribute.i.translateExpressionFromMembership.description=En règle générale, vous laisserez ce champ vide et utiliserez une "synchronisation des membres à partir du champ". Si vous devez effectuer une traduction, vous pouvez utiliser n'importe quelle variable d'objet d'appartenance config.GenericConfiguration.attribute.targetGroupAttribute.i.defaultValue.label=__i+1__ - valeur par défaut @@ -12822,52 +13211,27 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.validExpression.lab config.GenericConfiguration.attribute.targetGroupAttribute.i.validExpression.description=S’il y a une validation complexe par le script JEXL, saisissez-la ici. Les variables disponibles sont "value" (valeur unique), et "valueMultiple" (valeurs multiples supportées. Renvoie true pour valide ou false pour invalide. Exemple pour voir si la valeur numérique est positive : ${value>0} config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromMemberSyncField.label=__i+1__ - synchronisation des membres depuis le champ config.GenericConfiguration.attribute.targetGroupAttribute.i.translateFromMemberSyncField.description=S'il s'agit d'un attribut d'appartenance pour l'approvisionnement groupAttributes, les valeurs peuvent être copiées à partir de l'objet de synchronisation de membre contenu dans ce champ. -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateToGroupSyncField.label=__i+1__ - champ de lien du groupe cible -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateToGroupSyncField.description = If this is a group link field/attribute, then copy the target value to this group sync field, and retrieve from the group sync field as a cache during translation for incremental provisioning or during deletes. -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateGrouperToGroupSyncField.label = __i+1__ - Grouper group link field -config.GenericConfiguration.attribute.targetGroupAttribute.i.translateGrouperToGroupSyncField.description=Copiez la valeur de Grouper dans ce champ de synchronisation de groupe, et récupérez le pendant le approvisionnement. -config.GenericConfiguration.attribute.operateOnGrouperEntities.label = Operate on entities -config.GenericConfiguration.attribute.operateOnGrouperEntities.description = If the provisioner involves entity objects. This might not be true if you are provisioning memberships or groupAttributes without a target entity link. -config.GenericConfiguration.attribute.selectAllEntities.label = Select all entities -config.GenericConfiguration.attribute.selectAllEntities.description = Select false if the target does not allow selecting all entities e.g AWS. config.GenericConfiguration.attribute.selectEntities.label=Sélectionner des entités -config.GenericConfiguration.attribute.selectEntities.description = If entities should be read from the target. Generally this will be 'true' except:
    1. Messages are sent to the target without knowing the state of the target
    2. Provisioning groupAttributes with no entity link
    3. Provisioning membership objects with no entity link
    config.GenericConfiguration.attribute.insertEntities.label=Insérer les entités -config.GenericConfiguration.attribute.insertEntities.description = If provisionable entities in Grouper which do not exist in the target should be created in the target. This will not be true if all the needed entities exist in the target or if the target manages entities it another process. config.GenericConfiguration.attribute.updateEntities.label=Mettre à jour les entités -config.GenericConfiguration.attribute.updateEntities.description = If entity fields and attributes which differ from the target should cause the target data to be updated. This does not include the membership attribute if the membership provisioning type if entityAttributes. config.GenericConfiguration.attribute.deleteEntities.label=Supprimer les entités -config.GenericConfiguration.attribute.deleteEntities.description = If you want to delete entities in the target. Note, there are a few types of "deletes" you can choose from if you select "true", you must pick which delete option below. config.GenericConfiguration.attribute.deleteEntitiesIfNotExistInGrouper.label=Supprimer les entités si elles n'existent pas dans Grouper config.GenericConfiguration.attribute.deleteEntitiesIfNotExistInGrouper.description=Supprimer toutes les entités de la cible qui sont sélectionnées dans l’opération "Sélectionner toutes les entités" qui ne sont pas approvisionné par Grouper dans la cible. Cela signifie que Grouper fait autorité sur les entités. config.GenericConfiguration.attribute.deleteEntitiesIfGrouperDeleted.label=Supprimer les entités si supprimées dans Grouper -config.GenericConfiguration.attribute.deleteEntitiesIfGrouperDeleted.description = This is the "medium" knob. Only delete an entity if the entity was provisionable now is not. This means that entities that existed before the provisioner existed, or entities that were added only in the target (not in Grouper), will not be removed. config.GenericConfiguration.attribute.deleteEntitiesIfGrouperCreated.label=Supprimer les entités s'ils ont été créé par Grouper -config.GenericConfiguration.attribute.deleteEntitiesIfGrouperCreated.description = Delete entities if Grouper provisioned the entity at some point in the past and the entity was removed as provisionable in Grouper. -config.GenericConfiguration.attribute.subjectSourcesToProvision.label=Sources des sujets à approvisionner +config.GenericConfiguration.attribute.subjectSourcesToProvision.label=Sources des sujets à utiliser config.GenericConfiguration.attribute.subjectSourcesToProvision.description=Généralement, vous ne sélectionnerez que vos sources « personnes ». Si un sujet ne figure dans aucune des sources sélectionnées, il n'est pas considéré comme provisionnable. config.GenericConfiguration.attribute.hasTargetEntityLink.label=A un lien d'entité cible -config.GenericConfiguration.attribute.hasTargetEntityLink.description = "Entity link" is when memberships refer to some data that does not exist in Grouper or the Subject API and needs to be retrieved from the target Entity object. This data is cached in the "member sync" database table. Here are some examples:
    1. Provisioning membership objects where the entity reference is a target DN or UUID.
    2. Provisioning groupAttributes where the entity value is a target DN or UUID
    config.GenericConfiguration.attribute.numberOfEntityAttributes.label=Nombre d'attributs d'entité -config.GenericConfiguration.attribute.targetEntityAttribute.i.name.label=__i+1__ - nom -config.GenericConfiguration.attribute.targetEntityAttribute.i.name.description = Attribute name is the key in the key/value pairs for this entity -config.GenericConfiguration.attribute.targetEntityAttribute.i.isFieldElseAttribute.label=__i+1__ - champ ou attribut -config.GenericConfiguration.attribute.option.targetEntityAttribute.i.isFieldElseAttribute.trueLabel=Champ -config.GenericConfiguration.attribute.option.targetEntityAttribute.i.isFieldElseAttribute.falseLabel=Attribut -config.GenericConfiguration.attribute.option.targetEntityAttribute.i.attributePrefix=attr -config.GenericConfiguration.attribute.option.targetEntityAttribute.i.fieldPrefix=Champ -config.GenericConfiguration.attribute.targetEntityAttribute.i.isFieldElseAttribute.description=Il existe des champs d'entité par défaut : id, loginId, subjectId, name, email. Les attributs peuvent avoir des noms libres. Consultez la documentation du type de fournisseur pour voir quels champs ou attributs sont pris en charge. -config.GenericConfiguration.attribute.targetEntityAttribute.i.fieldName.label=__i+1__ - nom -config.GenericConfiguration.attribute.targetEntityAttribute.i.fieldName.description = ProvisioningEntity.java field name. +config.GenericConfiguration.attribute.option.targetEntityAttribute.i.attributePrefix=attr -provisioning.helper.variable.grouperProvisioningEntity = grouperProvisioningEntity (ProvisioningEntity.java): this is the Grouper representation of the entity. Fields include: email (needs configuration), id, loginId (needs configuration), name, subjectId. Attributes include: subjectSourceId, description, subjectIdentifier0 provisioning.helper.variable.gcGrouperSyncMember=gcGrouperSyncMember (GcGrouperSyncMember.java) : c'est l'objet entité "sync". Les champs incluent : entityAttributeValueCache0, entityAttributeValueCache1, entityAttributeValueCache2, entityAttributeValueCache3 provisioning.helper.variable.provisioningEntityWrapper=provisioningEntityWrapper (ProvisioningGroupWrapper.java) : contient des références à toutes les données d'entité. Les champs incluent : créer, supprimer, recalc, gcGrouperSyncMember, grouperProvisioningEntity, grouperTargetEntity, targetProvisioningEntity, targetNativeEntity provisioning.helper.variable.grouperTargetEntity=grouperTargetEntity (ProvisioningEntity.java) : en général, il n'est pas nécessaire car il est construit par le processus de traduction. Les champs et les attributs dépendent du fournisseur. @@ -12882,47 +13246,25 @@ config.GenericConfiguration.attribute.targetEntityAttribute.i.update.label=__i+1 config.GenericConfiguration.attribute.targetEntityAttribute.i.update.description=Cet attribut devrait être modifié lors de la mise à jour du groupe. config.GenericConfiguration.attribute.targetEntityAttribute.i.ignoreIfMatchesValue.label=__i+1__ - ignorer si cela correspond à la valeur config.GenericConfiguration.attribute.targetEntityAttribute.i.ignoreIfMatchesValue.description=Si le champ d'entité ou la valeur d'attribut correspond à l'une de ces valeurs, ignorez-la (ne pas supprimer ni mettre à jour). Valeurs séparées par des virgules, la virgule échappée est U+002C -config.GenericConfiguration.attribute.targetEntityAttribute.i.matchingId.label=__i+1__ - identifiant correspondant -config.GenericConfiguration.attribute.targetEntityAttribute.i.matchingId.description = The "matching id" is the attribute that is used to match up target objects with Grouper objects. If the matching ID is something opaque like the subjectId then objects can be more reliably renamed. config.GenericConfiguration.attribute.targetEntityAttribute.i.multiValued.label=__i+1__ - attribut à plusieurs valeurs -config.GenericConfiguration.attribute.targetEntityAttribute.i.multiValued.description = If this attribute is multi-valued in the target. Generally attributes are single-valued. The membership attribute must be multi-valued if provisioning entityAttributes. -config.GenericConfiguration.attribute.targetEntityAttribute.i.membershipAttribute.label=__i+1__ - attribut d'appartenance -config.GenericConfiguration.attribute.targetEntityAttribute.i.membershipAttribute.description = If this is entityAttribute provisioning and this attribute is multi-valued and holds entries that represents groups/memberships -config.GenericConfiguration.attribute.targetEntityAttribute.i.searchAttribute.label=__i+1__ - attribut de recherche -config.GenericConfiguration.attribute.targetEntityAttribute.i.searchAttribute.description = If this attribute is used to find entities in the target. The search in the target for this entity might just need this attribute name and value or there might be a search filter, and this is the value of the bind variable. config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionCreateOnly.label = __i+1__ - translation expression during inserts -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionCreateOnly.description = If you have a different translation from Grouper to Target for updates as opposed to inserts, put the insert translation here. Available variables:
    • $$provisioning.helper.variable.grouperProvisioningEntity$$
    • $$provisioning.helper.variable.gcGrouperSyncEntity$$
    • $$provisioning.helper.variable.provisioningEntityWrapper$$
    • $$provisioning.helper.variable.grouperTargetEntity$$
    config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpression.label=__i+1__ - expression de traduction -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpression.description = This is the translation for this attribute from Grouper to Target format during Entity updates and inserts (if not overridden by "insert only" translation). Available variables:
    • $$provisioning.helper.variable.grouperProvisioningEntity$$
    • $$provisioning.helper.variable.gcGrouperSyncEntity$$
    • $$provisioning.helper.variable.provisioningEntityWrapper$$
    • $$provisioning.helper.variable.grouperTargetEntity$$
    config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionTypeCreateOnly.label=__i+1__ - insertion de type de traduction uniquement -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionTypeCreateOnly.description = If this is a simple translation straight from field, then select GrouperProvisioningEntityField since you do not have to worry about a script typo and the performance is better. Otherwise configure a translation script. -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGrouperProvisioningEntityFieldCreateOnly.label = __i+1__ - translate from grouperProvisioningEntity field insert only -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGrouperProvisioningEntityFieldCreateOnly.description = Select the field from grouperProvisioningEntity to copy data from. id: is the UUID of the entity, email: email address of the user, loginid: netId to log in to systems, name: first and last name, subjectId: should be an opaque unchanging identifier, subjectSourceId: sourceId of the user, description: description that is configured in the subject source, subjectIdentifier0: the first identifier of the subject (might be a netId) config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionType.label=__i+1__ - type de traduction -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionType.description = If this is a simple translation straight from field, then select GrouperProvisioningEntityField since you do not have to worry about a script typo and the performance is better. Otherwise configure a translation script. -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGrouperProvisioningEntityField.label = __i+1__ - translate from grouperProvisioningEntity field -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGrouperProvisioningEntityField.description = Select the field from grouperProvisioningEntity to copy data from. id: is the UUID of the entity, email: email address of the user, loginid: netId to log in to systems, name: first and last name, subjectId: should be an opaque unchanging identifier, subjectSourceId: sourceId of the user, description: description that is configured in the subject source, subjectIdentifier0: the first identifier of the subject (might be a netId) config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionFromMembership.label=__i+1__ - expression de traduction de l'appartenance config.GenericConfiguration.attribute.targetEntityAttribute.i.translateExpressionFromMembership.description=En règle générale, vous laisserez ce champ vide et utiliserez une "synchronisation des membres à partir du champ". Si vous devez effectuer une traduction, vous pouvez utiliser n'importe quelle variable d'objet d'appartenance config.GenericConfiguration.attribute.targetEntityAttribute.i.defaultValue.label=__i+1__ - valeur par défaut config.GenericConfiguration.attribute.targetEntityAttribute.i.defaultValue.description=Si la valeur ne doit pas être vide dans la cible, répertoriez ici la valeur à affecter au champ/attribut s'il est vide. config.GenericConfiguration.attribute.targetEntityAttribute.i.required.label=__i+1__ - obligatoire -config.GenericConfiguration.attribute.targetEntityAttribute.i.required.description = If this field is required, then the Entity is invalid and will not be provisioned if the value is missing config.GenericConfiguration.attribute.targetEntityAttribute.i.maxlength.label=__i+1__ - longueur maximale config.GenericConfiguration.attribute.targetEntityAttribute.i.maxlength.description=Nombre de caractères maximum pour ce champ. Si ce nombre est dépassé alors l'entité sera invalide et ne sera pas provisionnée config.GenericConfiguration.attribute.targetEntityAttribute.i.validExpression.label=__i+1__ - expression de validation config.GenericConfiguration.attribute.targetEntityAttribute.i.validExpression.description=S’il y a une validation complexe par le script JEXL, saisissez-la ici. Les variables disponibles sont "value" (valeur unique), et "valueMultiple" (valeurs multiples supportées. Renvoie true pour valide ou false pour invalide. Exemple pour voir si la valeur numérique est positive : ${value>0} -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGroupSyncField.label = __i+1__ - Group sync from field -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGroupSyncField.description = If this is a membership attribute for entityAttributes provisioning, then the values can be copied from the group sync object from this field. -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateToMemberSyncField.label = __i+1__ - Member sync to field -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateToMemberSyncField.description = If this is an entity link field/attribute, then copy the target value to this member sync field, and retrieve from the member sync field as a cache during translation for incremental provisioning or during deletes. -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateGrouperToMemberSyncField.label = __i+1__ - Grouper member link field -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateGrouperToMemberSyncField.description = Copy the grouper value to this member sync field, and retrieve from the member sync field during provisioning. config.GenericConfiguration.subSection.metadata.title=Métadonnées config.GenericConfiguration.subSection.metadata.description=Les métadonnées sont des informations supplémentaires attachées aux dossiers, groupes, entités ou appartenances utilisées dans la configuration de l'approvisionnement @@ -12938,7 +13280,6 @@ config.GenericConfiguration.subSection.metadata.i.description=Configurer l'attri config.GenericConfiguration.attribute.metadata.i.name.label=Métadonnées __i+1__ : nom -config.GenericConfiguration.attribute.metadata.i.name.description = name of metadata item. This will be the name in the json attribute and can be assigned to a group, entity, or membership attribute. This must be unique across metadata for this provisioner. Must start with md_
    The label on the screen will be the externalized text key md_metadataName_provisionerConfigId_label
    The description on the screen will be the externalized text key md_metadataName_provisionerConfigId_description config.GenericConfiguration.attribute.metadata.i.showForFolder.label=Métadonnées __i+1__ : afficher pour le dossier config.GenericConfiguration.attribute.metadata.i.showForFolder.description=Cet élément de métadonnées doit s'afficher quand il est marqué sur un dossier comme provisionnable @@ -12999,38 +13340,36 @@ grouperProvisioningObjectMetadataProvisionableRegexLabel=Regex de provision grouperProvisioningObjectMetadataProvisionableRegexDescription=Si vous souhaitez filtrer les groupes dans les dossiers provisionnés par une expression régulière sur leurs noms.
    Valeur par défaut : '${grouperRequestContainer.provisioningContainer.currentGuiGrouperProvisioningAttributeValue.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getProvisionableRegex()}'.
    Si le groupe concorde avec la regex alors il sera provisionné. Si vous utilisez "not matches" alors il sera filtré. Ex :
    folderExtension matches ^.*_someExtension$
    folderName not matches ^.*_someExtension$
    groupExtension matches ^.*_someExtension$
    groupName not matches ^.*_someExtension$ grouperProvisioningObjectMetadataProvisionableRegexError=Erreur : regex invalide. Elle doit être de la forme : folderExtension matches ^.*_someExtension$   folderName not matches ^.*_someExtension   groupExtension matches ^.*_someExtension$   groupName not matches ^.*_someExtension$ -config.LdapProvisionerConfiguration.title=Provisionnement LDAP +config.LdapProvisionerConfiguration.title=LDAP config.LdapProvisionerConfiguration.attribute.ldapExternalSystemConfigId.label=Id config brique externe config.LdapProvisionerConfiguration.attribute.ldapExternalSystemConfigId.description=Sélectionner le LDAP à utiliser pour ce provisionnement. Si le LDAP n'est pas dans la liste, vous pouvez en configurer un nouveau depuis l'interface de configuration d'une brique externe. -config.LdapProvisionerConfiguration.attribute.provisioningType.label=Type de provisonnement LDAP -config.LdapProvisionerConfiguration.attribute.provisioningType.description=groupAttributes : groupe ldap possédant des attributs contenant les membres
    entityAttributes : utilisateur ldap possédant des attributs contenant les membres
    Habituellement, avec un provisionnement LDAP, le type utilisé est groupAttributes. - -config.LdapProvisionerConfiguration.attribute.targetGroupAttribute.i.isFieldElseAttribute.description=$$config.GenericConfiguration.attribute.targetGroupAttribute.i.isFieldElseAttribute.description$$ Le processus de provisionnement du LDAP utilise le champ 'nom' du groupe pour renseigner le DN du groupe. Toutes les autres données des groupes LDAP sont représentées par des attributs. -config.LdapProvisionerConfiguration.attribute.targetGroupAttribute.i.fieldName.description=$$config.GenericConfiguration.attribute.targetGroupAttribute.i.fieldName.description$$ Le champ "nom" est le DN du groupe LDAP. - -config.LdapProvisionerConfiguration.attribute.targetEntityAttribute.i.isFieldElseAttribute.description=$$config.GenericConfiguration.attribute.targetEntityAttribute.i.isFieldElseAttribute.description$$ Le processus de provisionnement du LDAP utilise le champ 'nom' de l'entité pour renseigner le DN de l'entité au sein du LDAP. Toutes les autres données des groupes LDAP sont représentées par des attributs. -config.LdapProvisionerConfiguration.attribute.targetEntityAttribute.i.fieldName.description=$$config.GenericConfiguration.attribute.targetGroupAttribute.i.fieldName.description$$ Le champ "nom" est le DN de l'entité LDAP. +config.LdapProvisionerConfiguration.attribute.provisioningType.label=Type de provisionnement LDAP +config.LdapProvisionerConfiguration.attribute.provisioningType.description=groupAttributes : groupe ldap avec des attributs contenant les appartenances
    entityAttributes : utilisateur ldap avec des attributs contenant les appartenances
    Habituellement, avec un provisionnement LDAP, le type utilisé est groupAttributes. config.LdapProvisionerConfiguration.attribute.userSearchBaseDn.label=Base DN pour la recherche d'entité config.LdapProvisionerConfiguration.attribute.userSearchFilter.label=Filtre de recherche d'entité config.LdapProvisionerConfiguration.attribute.userSearchAllFilter.label=Filtre de recherche de toutes les entités config.LdapProvisionerConfiguration.attribute.groupSearchBaseDn.label=Base DN pour la recherche de groupe config.LdapProvisionerConfiguration.attribute.groupSearchFilter.label=Filtre de recherche de groupe -config.LdapProvisionerConfiguration.attribute.groupSearchFilter.description=Recherche retournant un seul groupe. Vous pouvez utiliser la variable 'targetGroup'. Ex : (&(gidNumber=${targetGroup.retrieveAttributeValue('gidNumber')})(objectClass=groupOfNames)). Remarque : si le filtre de recherche est simplement l'attribut de recherche, vous pouvez laisser ce champ à vide +config.LdapProvisionerConfiguration.attribute.groupSearchFilter.description=Recherche retournant un seul groupe. Vous pouvez utiliser la variable 'targetGroup'. Ex : (&(gidNumber=${targetGroup.retrieveAttributeValue('gidNumber')})(objectClass=groupOfNames)). Remarque : si le filtre de recherche est simplement l'attribut configuré comme attribut de recherche, vous pouvez laisser ce champ à vide config.LdapProvisionerConfiguration.attribute.groupSearchAllFilter.label=Filtre de recherche de tous les groupes +config.LdapProvisionerConfiguration.attribute.groupSearchAllFilter.description=Filtre retournant l'ensemble des groupes. Si vide, par défaut, la recherche utilisera l'attribut configuré comme attribut de recherche et les objectclass, si configuré. Ex : (&(gidNumber=*)(objectClass=posixGroup)(objectClass=top)) + config.LdapProvisionerConfiguration.attribute.allowLdapGroupDnOverride.label=Autoriser la surchage du DN config.LdapProvisionerConfiguration.attribute.allowLdapGroupDnOverride.description=Lorsque un groupe est marqué comme provisionnable, autoriser une valeur différente que celle par défaut pour le DN (afin de provisionner un groupe dans une branche spécifique) config.LdapProvisionerConfiguration.attribute.groupDnType.label=Type de DN de groupe -config.LdapProvisionerConfiguration.attribute.groupRdnAttribute.label=Attribut RDN pour les groupes -config.LdapProvisionerConfiguration.attribute.groupRdnAttribute.description=L'attribut RDN pour les groupes LDAP. Ce menu déroulant est alimenté depuis les attributs de groupe. Renseignez-les puis sélectionner le RDN. Actualiser +config.LdapProvisionerConfiguration.attribute.groupRdnAttribute.label=Attribut RDN des groupes +config.LdapProvisionerConfiguration.attribute.groupRdnAttribute.description=L'attribut RDN pour les groupes LDAP. Ce menu déroulant est alimenté à partir des attributs de groupe (à configurer un peu plus bas). Renseignez-les puis sélectionner le RDN. Actualiser config.LdapProvisionerConfiguration.attribute.folderRdnAttribute.label=Attribut RDN pour les dossiers config.LdapProvisionerConfiguration.attribute.folderRdnAttribute.description=L'attribut RDN à utiliser pour provisionner les dossiers dans le LDAP. Ex : si l'attribut "ou" pour les dossiers et "cn" pour les groupes sont utilisés comme attribut RDN, alors un groupe app:foo:service:policy:foo_user sera provisionné dans le LDAP avec le DN suivant : cn=foo_user,ou=policy,ou=service,ou=foo,ou=app. config.LdapProvisionerConfiguration.attribute.folderObjectClasses.label=Object classes des dossiers config.LdapProvisionerConfiguration.attribute.folderObjectClasses.description=Les objectClass (séparés par une virgule) à ajouter lorsqu'un dossier est provisionné dans le LDAP. -config.SqlProvisionerConfiguration.title=Provisionnement SQL +config.SqlProvisionerConfiguration.title=SQL config.SqlProvisionerConfiguration.attribute.provisioningType.label=Type de provisionnement SQL config.SqlProvisionerConfiguration.attribute.dbExternalSystemConfigId.label=ID config de base de données externe +config.SqlProvisionerConfiguration.attribute.provisioningType.label=Type de provisionnement SQL + config.SqlProvisionerConfiguration.attribute.membershipTableName.label=Nom de la table des appartenances config.SqlProvisionerConfiguration.attribute.membershipSearchQuery.label=Requête utilisée pour rechercher les appartenances @@ -13040,7 +13379,6 @@ config.SqlProvisionerConfiguration.attribute.userSearchQuery.label=Requête de r config.SqlProvisionerConfiguration.attribute.insertEntities.label=Insérer les entités config.SqlProvisionerConfiguration.attribute.groupTableName.label=Nom de la table de groupe -config.SqlProvisionerConfiguration.attribute.groupPrimaryKey.label=Clé primaire de groupe config.SqlProvisionerConfiguration.attribute.groupSearchQuery.label=Requête de recherche de groupe provisioning.configuration.validation.mustHaveEntityMembershipAttribute=Erreur : ce provisionnement alimente des entityAttributes mais vous n'avez pas de champ d'entité ni d'attribut utilisé pour l'appartenance. Merci d'indiquer un champ d'entité ou d'attribut @@ -13073,29 +13411,9 @@ provisioning.configuration.validation.groupIdOfUsersToProvisionNotExist=Erreur : provisionerConfigurationSaveErrorMetadataNotValidFormat=Le nom d'une métadonnée doit commencer par md_ et ne peut contenir que des caractères alphanumériques et des tirets-bas. provisionerConfigurationSaveErrorMetadataDefaultValueNotCorrectType=La valeur par défaut doit être du type sélectionné '$$selectedType$$'. -provisioning.configuration.validation.idRequired = Error: group field 'id' is required. It represents the group id -provisioning.configuration.validation.groupNameString = Error: group field 'name' must be value type 'string'. It represents the group name -provisioning.configuration.validation.idString = Error: group field 'id' must be value type 'string'. It represents the group id -provisioning.configuration.validation.entityLoginIdRequired = Error: entity field 'loginId' is required. It represents the username -provisioning.configuration.validation.entityLoginIdString = Error: entity field 'loginId' must be value type 'string'. It represents the username - -provisioning.configuration.validation.groupFieldRequired = Error: group field '$$fieldName$$' is required. It represents the group $$fieldName$$ -provisioning.configuration.validation.entityFieldRequired = Error: entity field '$$fieldName$$' is required. It represents the entity $$fieldName$$ -provisioning.configuration.validation.groupFieldString = Error: group field '$$fieldName$$' must be value type 'string'. It represents the group $$fieldName$$ -provisioning.configuration.validation.entityFieldString = Error: entity field '$$fieldName$$' must be value type 'string'. It represents the entity $$fieldName$$ -provisioning.configuration.validation.groupAttributeString = Error: group attribute '$$attributeName$$' must be value type 'string'. It represents the group $$attributeName$$ -provisioning.configuration.validation.entityAttributeString = Error: entity attribute '$$attributeName$$' must be value type 'string'. It represents the entity $$attributeName$$ -provisioning.configuration.validation.groupMoreThanTwoFields = Error: groups cannot have more than two fields configured. -provisioning.configuration.validation.entityMoreThanFourFields = Error: entities cannot have more than four fields configured. -provisioning.configuration.validation.entityMoreThanOneField = Error: entities cannot have more than one field configured. -provisioning.configuration.validation.entityMoreThanTwelveAttributes = Error: entities cannot have more than 12 attributes configured for this provisioner type. -provisioning.configuration.validation.incorrectGroupAttributeConfigured = Error: only one group attribute can be configured and that must be 'description' -provisioning.configuration.validation.incorrectDuoEntityAttributeConfigured = Error: only two entity attributes can be configured and they must be 'firstname' and 'lastname' -provisioning.configuration.validation.incorrectAWSEntityAttributeConfigured = Error: only 12 entity attributes can be configured. -provisioning.configuration.validation.incorrectEntityFieldsConfigured = Error: only four entity fields can be configured and they must be 'id', 'loginId', 'name' and 'email' - -config.GrouperScim2Configuration.title=Provisionnement SCIM 2 -config.GrouperScim2Configuration.attribute.bearerTokenExternalSystemConfigId.label=id brique externe du bearer token + +config.GrouperScim2Configuration.title=SCIM2 +config.GrouperScim2Configuration.attribute.bearerTokenExternalSystemConfigId.label=id connecteur externe du bearer token config.GrouperScim2Configuration.attribute.scimType.label = SCIM type config.GrouperScim2Configuration.attribute.scimType.description = SCIM type @@ -13107,7 +13425,6 @@ config.GenericConfiguration.attribute.replaceMemberships.description=Si les memb -config.AzureProvisionerConfiguration.attribute.targetGroupAttribute.i.fieldName.description=Plusieurs champs embarqués qui correspondent à des attributs Azure @@ -13161,12 +13478,13 @@ config.GenericConfiguration.attribute.param.netId.value.description=Sélectionne config.GenericConfiguration.attribute.enabled.label=Activé config.GenericConfiguration.attribute.enabled.description=Activé -config.GenericConfiguration.attribute.id.label=ID source de sujet -config.GenericConfiguration.attribute.id.description=L'ID source de sujet est l'identifiant utilisé au sein du code, de l'API, des tâche...Il doit être à la fois alphanumérique, court et compréhensible. Ex : pennperson -config.GenericConfiguration.attribute.name.label=Nom de la source de sujet -config.GenericConfiguration.attribute.name.description=Le nom de la source de sujet est le nom utilisé pour l'affichage (ex : menu déroulant dans l'UI). Il peut contenir des espaces, des accents... -config.GenericConfiguration.attribute.types.label=Types -config.GenericConfiguration.attribute.types.description=Les types ne sont pas utilisés actuellement. Choisissez "person" si votre source contient en majorité des personnes ou 'application' si elle contient plutôt des comptes applicatifs + +config.LdapSubjectSourceConfiguration.attribute.id.label=ID source de sujet +config.LdapSubjectSourceConfiguration.attribute.id.description=L'ID source de sujet est l'identifiant utilisé au sein du code, de l'API, des tâche...Il doit être à la fois alphanumérique, court et compréhensible. Ex : pennperson +config.LdapSubjectSourceConfiguration.attribute.name.label=Nom de la source de sujet +config.LdapSubjectSourceConfiguration.attribute.name.description=Le nom de la source de sujet est le nom utilisé pour l'affichage (ex : menu déroulant dans l'UI). Il peut contenir des espaces, des accents... +config.LdapSubjectSourceConfiguration.attribute.types.label=Types +config.LdapSubjectSourceConfiguration.attribute.types.description=Les types ne sont pas utilisés actuellement. Choisissez "person" si votre source contient en majorité des personnes ou 'application' si elle contient plutôt des comptes applicatifs config.GenericConfiguration.attribute.param.maxResults.value.label=Taille max des resultats config.GenericConfiguration.attribute.param.maxResults.value.description=Taille max des resultats @@ -13342,7 +13660,7 @@ adminDaemonJobsHomeBreadcrumb=Accueil adminDaemonJobsBreadcrumb=Toutes les tâches # breadcrumb on the daemon logs screen -adminDaemonLogsBreadcrumb=Tâches périodiques +adminDaemonLogsBreadcrumb=Tâches planifiées # title of daemon jobs adminDaemonJobsTitle=Toutes les tâches @@ -13423,9 +13741,9 @@ adminDaemonJobsColumnTooltipMoreActions=Actions proposées pour cette tâche adminDaemonJobsCronDescriptionError=Erreur : impossible de charger la chaîne du cron Quartz # various states -adminDaemonJobsStateRunning=RUNNING -adminDaemonJobsStateEnabled=ENABLED -adminDaemonJobsStateDisabled=DISABLED +adminDaemonJobsStateRunning=EN COURS +adminDaemonJobsStateEnabled=ACTIVÉ +adminDaemonJobsStateDisabled=DÉSACTIVÉ # more actions ariaLabelGuiMoreDaemonJobActions=Montrer plus d'actions pour cette tâche @@ -13433,7 +13751,8 @@ adminDaemonJobsMoreActionsDefaultText=Actions de la tâche adminDaemonJobsMoreActionsRunNow=Exécuter la tâche maintenant adminDaemonJobsMoreActionsDisable=Désactiver la tâche adminDaemonJobsMoreActionsEnable=Activer la tâche -adminDaemonJobsMoreActionsLogs=Visualiser les journaux des tâches périodiques +adminDaemonJobsMoreActionsLogs=Visualiser les journaux des tâches planifiées +adminDaemonJobsMoreActionsDelete = Supprimer # daemon jobs change log pending in queue daemonJobsChangeLogPendingInQueue=Tâches en attente : @@ -13462,6 +13781,9 @@ daemonJobsResetButton=Réinitialiser # if no results found daemonJobsNoResultsFound=Aucun résultat +# if no results found +daemonJobConfigNotFound = Erreur : configuration introuvable pour la tâche ${grouperRequestContainer.adminContainer.daemonJobName} + # next refresh daemonJobsNextRefresh=Prochain rafraichissement : @@ -13469,11 +13791,27 @@ daemonJobsNextRefresh=Prochain rafraichissement : daemonJobsMaxRefreshesReached=Nombre max de rafraichissement atteint # description at the top of log screen -daemonJobsViewLogsTitle=Logs des tâches périodiques - +daemonJobsViewLogsTitle=Logs des tâches planifiées # if there are logs daemonJobsViewLogsDescription=Journaux ${grouperUtil.length(grouperRequestContainer.adminContainer.guiHib3GrouperLoaderLogs)} trouvés pour tâche : ${grouperRequestContainer.adminContainer.guiDaemonJobs.get(0).jobName} +# aria label accessibility for more actions for daemon +daemonJobsMoreActionsAria = Voir les actions liés aux tâches + +# more actions button +daemonJobsViewMoreActionsButton = Actions sur la tâche + +# all daemon jobs button +daemonJobsButtonAllDaemonJobs = Toutes les tâches + +# add daemon +daemonJobsAddDaemon = Ajouter une tâche + +# edit daemon +daemonJobsEditDaemon = Modifier une tâche + +daemonNameLabel = Tâche + grouperDaemonConfigEnableLabel=Activé # error that config id is required @@ -13486,8 +13824,7 @@ grouperDaemonConfigCreateErrorConfigIdRequired=Erreur : ID Config est obligatoir # Last updated tooltip label adminJobHistoryTooltipLastUpdated=Dernière mise à jour -# Elapsed tooltip label -adminJobHistoryTooltipElapsed = Elapsed + ######################################## ## Admin menu subject API diagnostics @@ -13688,15 +14025,17 @@ grouperLoaderGroupManagedByLoaderSummary=Résumé : {0} grouperLoaderIsNotGrouperLoader=Aucune tâche de synchronisation configuré pour ce groupe. Cliquez sur [Plus] pour en configurer une. # description at top of group loader -grouperLoaderEditConfiguration=Modifier la configuration +grouperLoaderEditConfiguration=Modifier # LDAP or SQL grouperLoaderSourceType=Type de source grouperLoaderLdap=LDAP grouperLoaderSql=SQL grouperLoaderRecentMemberships=Appartenances récentes +grouperLoaderJexlScript = JEXL script grouperLoaderSourceType__SQL=extrait les membres depuis une base de données SQL. grouperLoaderSourceType__LDAP=extrait les membres depuis un annuaire LDAP. +grouperLoaderSourceType__JEXL_SCRIPT = Récupère les membres depuis un script JEXL. grouperLoaderSourceType__RECENT_MEMBERSHIPS=Récupère les membres à partir des appartenances récentes d'un groupe grouperLoaderSourceType__=extrait les membres depuis une base de données SQL, d'un annuaire LDAP ou depuis les dernières appartenances d'un groupe @@ -13962,7 +14301,7 @@ grouperLoaderStatus_CONFIG_ERROR=Erreur de configuration grouperLoaderStatus_SUBJECT_PROBLEMS=Problèmes de sujet # drop down for view loader settings -grouperLoaderMoreActionsViewLoader=Afficher la configuration +grouperLoaderMoreActionsViewLoader=Afficher # drop down for view loader logs grouperLoaderMoreActionsViewLoaderLogs=Afficher les journaux @@ -14050,7 +14389,7 @@ grouperLoaderLogsShowSubjobs=Sous-tâche : grouperLoaderLogsShowSubjobsLabel=Voir les sous-tâches grouperLoaderLogsShowSubjobsTooltip=Une tâche qui synchronise plusieurs groupes a une ligne de sous-tâche pour chacun de ces groupes. Cocher cette case permet d'afficher aussi ces lignes. grouperLoaderLogsShowStatus=Status: -grouperLoaderLogsNumberOfRows=Nombre de lignes: +grouperLoaderLogsNumberOfRows=Nombre de lignes : grouperLoaderLogsCannotParseDate=Impossible de traiter la date : grouperLoaderLogsCannotParseNumberOfRows=Impossible de traiter le nombre de lignes : grouperLoaderLogsNumberOfRowsOverMax=Le nombre maximum de ligne est : @@ -14271,7 +14610,7 @@ attributeDefAttributeAssignmentsTitle=Assignation d'attributs attributeDefAttributeAssignmentsDescription=Assignation d'attributs # more actions on attribute def more actions panel -attributeDefViewMoreActionsButton=Plus d'actions +attributeDefViewMoreActionsButton=Actions sur l'attribut # save button on attribute def assignment screen attributeDefAssignSaveButton=Sauvegarder @@ -14377,6 +14716,9 @@ membershipAssignAttributeAttributeDefDescription=La définition d'un attribut re # attribute name label membershipAssignAttributeAttributeDefNameLabel=Nom d'attribut : +# group label +membershipAssignAttributeGroupLabel = Groupe : + # attribute name description membershipAssignAttributeAttributeDefNameDescription=L'attribut est la partie qui est assigné à l'objet. Généralement plusieurs attributs sont liés à une définition d'attribut. @@ -14490,7 +14832,10 @@ miscellaneousConfigureBreadcrumb=Configuration miscellaneousConfigurationFilesBreadcrumb=Fichiers de configuration # breadcrumb for grouper external systems -miscellaneousGrouperExternalSystemsBreadcrumb=Briques externes +miscellaneousGrouperExternalSystemsBreadcrumb=Connecteurs externes + +# breadcrumb for provisioner configs +miscellaneousProvisionerConfigurationsBreadcrumb=Provisionnement # breadcrumb for provisioner config run full sync miscellaneousProvisionerConfigRunFullSyncBreadcrumb=Exécuter la synchronisation complète @@ -14511,7 +14856,7 @@ miscellaneousConfigurationMainDescription=Fichiers de configuration miscellaneousConfigurationHistoryMainDescription=Historique des modifications # header for grouper external systems -miscellaneousGrouperExternalSystemsMainDescription=Briques externes à Grouper +miscellaneousGrouperExternalSystemsMainDescription=Connecteurs externes à Grouper # configuration description below the h1 miscellaneousConfigurationMainSubtitle = Paramétrage de Grouper. Les changements prennent quelques minutes à s'appliquer sur l'ensemble des JVM connecté à cette base de données. @@ -14610,7 +14955,7 @@ configurationMustExtendClass=, doit hériter de la classe Java : configurationMustImplementInterface=, doit implémenter l'interface Java : # if base value is different put here -configurationBaseValueIfDifferent=Valeur par défaut : +configurationBaseValueIfDifferent=Par défaut : # if unprocessed value is different configurationUnprocessedValueIfDifferentLabel=Valeur non traitée : From 3da4422b21f317098a0de428f59dd4b89f1d04af Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Tue, 24 May 2022 13:32:09 -0400 Subject: [PATCH 053/125] GRP-4051: sql provisioner does not compute the correct matching id when provisioning to a membership table --- grouper/conf/grouper-loader.base.properties | 4 ++ .../grouper.textNg.en.us.base.properties | 3 + .../SqlProvisioningConfiguration.java | 65 ++++++++++++++++++- .../sqlProvisioning/SqlProvisionerTest.java | 2 +- .../SqlProvisionerTestUtils.java | 16 +++-- 5 files changed, 80 insertions(+), 10 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index fe02276448ba..047815e0dce6 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -2838,6 +2838,10 @@ grouper.provisioning.removeSyncLogRowsAfterDays = 7 # {valueType: "boolean", order: 76500, defaultValue: "false", subSection: "membership2", showEl: "${operateOnGrouperMemberships}"} # provisioner.genericProvisioner.membership2AdvancedOptions = +# Matching ID expression +# {valueType: "string", order: 76510, subSection: "membership2", showEl: "${operateOnGrouperMemberships && membership2AdvancedOptions && provisioningType == 'membershipObjects'}"} +# provisioner.genericProvisioner.membershipMatchingIdExpression = + # membership attribute name for groups # {valueType: "string", required: true, order: 77000, subSection: "group2", showEl: "${operateOnGrouperGroups && provisioningType == 'groupAttributes'}", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningGroupAttributeDropdownOptions"} # provisioner.genericProvisioner.groupMembershipAttributeName = diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index fc52aff3e99a..5e49fca5a6b1 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13403,6 +13403,9 @@ config.GenericConfiguration.attribute.membershipAdvancedOptions.description = Ad config.GenericConfiguration.attribute.membership2AdvancedOptions.label = Advanced options config.GenericConfiguration.attribute.membership2AdvancedOptions.description = Advanced membership2 options, note, there might not be any +config.GenericConfiguration.attribute.membershipMatchingIdExpression.label = Membership matching ID expression +config.GenericConfiguration.attribute.membershipMatchingIdExpression.description = This is an advanced option for edge cases. Put in a JEXL expression that will create a matching ID for memberships (e.g. SQL, though SQL should be able to do this automatically). e.g.
    ${new('edu.internet2.middleware.grouperClient.collections.MultiKey', targetMembership.retrieveAttributeValueString('group_col'), targetMembership.retrieveAttributeValueString('entity_col'))} + config.GenericConfiguration.attribute.customizeGroupCrud.label = Customize group CRUD config.GenericConfiguration.attribute.customizeGroupCrud.description = Customize Create/Read/Update/Delete characteristics of groups. By default groups will SELECT / INSERT / UPDATE / DELETE_IF_GROUPER_CREATED_THEN_DELETED diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java index 5bdba5008baf..3a60df761088 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java @@ -2,6 +2,8 @@ import java.util.Map; +import org.apache.commons.lang.StringUtils; + import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningConfigurationAttribute; import edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningConfiguration; @@ -261,8 +263,10 @@ public void configureSpecificSettings() { // TODO is this used???? this.membershipTableIdColumn = this.retrieveConfigString("membershipPrimaryKey", false); - //setMembershipMatchingIdExpression("${new edu.internet2.middleware.grouperClient.collections.MultiKey(targetMembership.getProvisioningGroup().retrieveAttributeValueString('"+groupTableIdColumn+"'), targetMembership.getProvisioningEntity().retrieveAttributeValueString('"+entityTableIdColumn+"'))}"); - setMembershipMatchingIdExpression("${new('edu.internet2.middleware.grouperClient.collections.MultiKey', targetMembership.retrieveAttributeValueString('"+membershipGroupForeignKeyColumn+"'), targetMembership.retrieveAttributeValueString('"+membershipEntityForeignKeyColumn+"'))}"); + if (!StringUtils.isBlank(this.membershipTableName) && StringUtils.isBlank(this.getMembershipMatchingIdExpression())) { + //setMembershipMatchingIdExpression("${new edu.internet2.middleware.grouperClient.collections.MultiKey(targetMembership.getProvisioningGroup().retrieveAttributeValueString('"+groupTableIdColumn+"'), targetMembership.getProvisioningEntity().retrieveAttributeValueString('"+entityTableIdColumn+"'))}"); + setMembershipMatchingIdExpression("${new('edu.internet2.middleware.grouperClient.collections.MultiKey', targetMembership.retrieveAttributeValueString('"+findMembershipGroupMatchingIdAttribute()+"'), targetMembership.retrieveAttributeValueString('"+findMembershipEntityMatchingIdAttribute()+"'))}"); + } // this.groupAttributeTableForeignKeyToGroup = this.retrieveConfigString("groupAttributeTableForeignKeyToGroup", false); // this.groupAttributeTableIdColumn = this.retrieveConfigString("groupAttributeTableIdColumn", false); // this.groupAttributeTableAttributeNameColumn = this.retrieveConfigString("groupAttributeTableAttributeNameColumn", false); @@ -294,6 +298,63 @@ public void configureSpecificSettings() { } + /** + * find the matching ID part for membership table that goes to the group + * @return the column which is the matching ID in memberships for group + */ + public String findMembershipGroupMatchingIdAttribute() { + if (!StringUtils.isBlank(this.membershipGroupForeignKeyColumn)) { + return this.membershipGroupForeignKeyColumn; + } + + // "id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description" + // configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.name", "group_name"); + // configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.translateFromGrouperProvisioningGroupField", "name"); + // configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); + + for (String groupMapping : new String[] {"id", "idIndex", "idIndexString", "name", "displayName", "extension", "displayExtension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3"}) { + for (String name: getTargetMembershipAttributeNameToConfig().keySet()) { + + SqlGrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = (SqlGrouperProvisioningConfigurationAttribute) this.getTargetMembershipAttributeNameToConfig().get(name); + + if (StringUtils.equals(groupMapping, grouperProvisioningConfigurationAttribute.getTranslateFromGrouperProvisioningGroupField())) { + return name; + } + + } + + } + throw new RuntimeException("Cant find membership column to use for matching when it involves groups"); + } + + /** + * find the matching ID part for membership table that goes to the entity + * @return the column which is the matching ID in memberships for entity + */ + public String findMembershipEntityMatchingIdAttribute() { + if (!StringUtils.isBlank(this.membershipEntityForeignKeyColumn)) { + return this.membershipEntityForeignKeyColumn; + } + + // "id", "email", "loginid", "memberId", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2" + // configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.name", "subject_id"); + // configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateExpressionType", "grouperProvisioningEntityField"); + // configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateFromGrouperProvisioningEntityField", "subjectId"); + + for (String entityMapping : new String[] {"memberId", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2", "email", "loginid", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "id"}) { + for (String name: getTargetMembershipAttributeNameToConfig().keySet()) { + + SqlGrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = (SqlGrouperProvisioningConfigurationAttribute) this.getTargetMembershipAttributeNameToConfig().get(name); + + if (StringUtils.equals(entityMapping, grouperProvisioningConfigurationAttribute.getTranslateFromGrouperProvisioningEntityField())) { + return name; + } + + } + + } + throw new RuntimeException("Cant find membership column to use for matching when it involves entities"); + } public String getDbExternalSystemConfigId() { diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java index 82fc19e9a5e5..31dee3466d06 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java @@ -212,7 +212,7 @@ public void testSimpleMembershipGroupNameSubjectId() { SqlProvisionerTestUtils.configureSqlProvisioner(new SqlProvisionerTestConfigInput() .assignMembershipDeleteType("deleteMembershipsIfNotExistInGrouper") .assignMembershipTableName("testgrouper_prov_mship0") - .assignMembershipTableIdColumn("group_name, subject_id") +// .assignMembershipTableIdColumn("group_name, subject_id") // .assignMembershipGroupForeignKeyColumn("group_name") // .assignMembershipEntityForeignKeyColumn("subject_id") .assignMembershipAttributeCount(2) diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java index 0bb1ff3eb2e1..4315157587fd 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java @@ -157,6 +157,7 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "membershipGroupForeignKeyColumn", provisioningTestConfigInput.getMembershipGroupForeignKeyColumn()); } if (!StringUtils.isBlank(provisioningTestConfigInput.getMembershipTableIdColumn())) { + configureProvisionerSuffix(provisioningTestConfigInput, "membership2AdvancedOptions", provisioningTestConfigInput.getMembershipTableIdColumn()); configureProvisionerSuffix(provisioningTestConfigInput, "membershipPrimaryKey", provisioningTestConfigInput.getMembershipTableIdColumn()); } if (!StringUtils.isBlank(provisioningTestConfigInput.getMembershipTableName())) { @@ -358,13 +359,14 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi if (provisioningTestConfigInput.getMembershipAttributeCount() > 0) { configureProvisionerSuffix(provisioningTestConfigInput, "numberOfMembershipAttributes", "" + provisioningTestConfigInput.getMembershipAttributeCount()); - for (int i=0;i Date: Wed, 25 May 2022 02:56:01 -0400 Subject: [PATCH 054/125] membership sql provisioning --- .../provisionerConfigAddHelper.jsp | 2 +- grouper/conf/grouper-loader.base.properties | 74 +++++------ .../grouper.textNg.en.us.base.properties | 13 +- .../GrouperProvisioningBehavior.java | 72 ++++++++++- ...erProvisioningConfigurationValidation.java | 3 +- .../GrouperProvisioningFullSyncJob.java | 1 + .../GrouperProvisioningLogic.java | 8 +- .../GrouperProvisioningLogicIncremental.java | 115 +++++++++++++++++- .../GrouperProvisioningObjectLogType.java | 2 +- .../GrouperProvisioningOutput.java | 1 + .../GrouperProvisionerTargetDaoBase.java | 2 +- .../SqlProvisioningConfiguration.java | 36 ++++-- .../sqlProvisioning/SqlProvisioningDao.java | 52 ++++++-- .../SqlProvisioningStartWith.java | 66 +++++++--- .../app/upgradeTasks/UpgradeTasks.java | 58 ++++----- .../LdapProvisionerTestUtils.java | 1 + .../SqlProvisionerTestUtils.java | 2 +- 17 files changed, 388 insertions(+), 120 deletions(-) diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp index 5a9d5bb77f9b..79af14ec5cf0 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAddHelper.jsp @@ -61,7 +61,7 @@ + >${textContainer.text['provisionerStartWithOption_' += startWithConfigClass['class'].name]} External systems. You can also provision across database link. config.SqlProvisioningStartWith.attribute.sqlPattern.label = Sql pattern -config.SqlProvisioningStartWith.attribute.sqlPattern.description = Sql pattern +config.SqlProvisioningStartWith.attribute.sqlPattern.description = entityTable - provision a table of entities
    entityTableWithAttributeTable - provision entities into a table but allow some attributes to be columns of the entity table and some attributes to be in a separate table for entity attributes
    entityTableWithAttributeTableAndMemberships - provision entities into a table but allow some attributes to be columns of the entity table and some attributes to be in a separate table for entity attributes. Memberships will be provisioned like LDAP where they are a multi-valued attribute of the entity, in the entity attributes table
    entityTableMembershipTable - provision a table of entities and a table for memberships. One column of the membership table is a foreign key to the entity table, and the other column is something related to the group (e.g. groupName)
    groupTable - provision a table of groups
    groupTableWithAttributeTable - provision groups into a table but allow some attributes to be columns of the group table and some attributes to be in a separate table for group attributes
    groupTableWithAttributeTableAndMemberships - provision groups into a table but allow some attributes to be columns of the group table and some attributes to be in a separate table for group attributes. Memberships will be provisioned like LDAP where they are a multi-valued attribute of the group, in the group attributes table
    groupTableMembershipTable - provision a table of groups and a table for memberships. One column of the membership table is a foreign key to the group table, and the other column is something related to the entity (e.g. subjectId)
    groupTableEntityTableMembershipTable - provision a table for groups, a table for entities, and a table for memberships. The memberships table has two columns, one for the foreign key to groups, and one for the foreign key to memberships
    membershipTable - provision a table with memberships with two columns, something related to the group (e.g. groupName), and something related to the entity (e.g. subjectId)
    other - no pattern, just fill out this form config.SqlProvisioningStartWith.attribute.userAttributesType.label = User attributes type config.SqlProvisioningStartWith.attribute.userAttributesType.description = User attributes type @@ -13650,8 +13655,8 @@ config.SqlProvisioningStartWith.attribute.membershipStructure.description = Memb config.SqlProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.label = Subject source entity resolver attributes config.SqlProvisioningStartWith.attribute.subjectSourceEntityResolverAttributes.description = Subject source entity resolver attributes -config.SqlProvisioningStartWith.attribute.hasGroupTable.label = Has group table? -config.SqlProvisioningStartWith.attribute.hasGroupTable.description = Has group table? +config.SqlProvisioningStartWith.attribute.hasGroupTable.label = Has group table +config.SqlProvisioningStartWith.attribute.hasGroupTable.description = Has group table config.SqlProvisioningStartWith.attribute.groupTableName.label = Group table name config.SqlProvisioningStartWith.attribute.groupTableName.description = Group table name, e.g. from_grouper_group @@ -14253,7 +14258,7 @@ config.GenericConfiguration.attribute.deleteEntitiesIfGrouperCreated.description config.GenericConfiguration.attribute.subjectSourcesToProvision.label = Subject sources to provision config.GenericConfiguration.attribute.subjectSourcesToProvision.description = Generally you will only select your "people" source(s). If a subject is not in any of the selected sources, they are not considered provisionable. -grouperProvisioningSubjectSourcesToProvisionRequiresEntitiesInvalid = Error with '$$config.GenericConfiguration.attribute.subjectSourcesToProvision.label$$', if you configure sources then you need to '$$config.GenericConfiguration.attribute.operateOnGrouperEntities.label$$' +grouperProvisioningSubjectSourcesToProvisionRequiresEntitiesInvalid = Error with '$$config.GenericConfiguration.attribute.subjectSourcesToProvision.label$$', if you configure sources then you need to '$$config.GenericConfiguration.attribute.operateOnGrouperEntities.label$$' or '$$config.GenericConfiguration.attribute.operateOnGrouperMemberships.label$$' config.GenericConfiguration.attribute.hasTargetEntityLink.label = Has target entity link config.GenericConfiguration.attribute.hasTargetEntityLink.description = "Entity link" is when memberships refer to some data that does not exist in Grouper or the Subject API and needs to be retrieved from the target Entity object. This data is cached in the "member sync" database table. Here are some examples:
    1. Provisioning membership objects where the entity reference is a target DN or UUID.
    2. Provisioning groupAttributes where the entity value is a target DN or UUID
    diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java index 54aabd2fd8a2..f5b487f491cf 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java @@ -433,6 +433,10 @@ public boolean isSelectEntities() { selectEntities = false; return selectEntities; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeEntityCrud()) { + selectEntities = true; + return selectEntities; + } this.selectEntities = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isSelectEntities(); return this.selectEntities; @@ -468,7 +472,10 @@ public boolean isSelectMemberships() { selectMemberships = false; return selectMemberships; } - + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeMembershipCrud()) { + selectMemberships = true; + return selectMemberships; + } this.selectMemberships = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isSelectMemberships(); return this.selectMemberships; } @@ -558,6 +565,10 @@ public boolean isSelectGroups() { selectGroups = false; return selectGroups; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeGroupCrud()) { + selectGroups = true; + return selectGroups; + } this.selectGroups = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isSelectGroups(); return this.selectGroups; @@ -605,6 +616,16 @@ public boolean isDeleteEntitiesIfGrouperCreated() { return deleteEntitiesIfGrouperCreated; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isMakeChangesToEntities()) { + deleteEntitiesIfGrouperCreated = false; + return deleteEntitiesIfGrouperCreated; + } + + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeEntityCrud()) { + deleteEntitiesIfGrouperCreated = true; + return deleteEntitiesIfGrouperCreated; + } + // is it configured to? deleteEntitiesIfGrouperCreated = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isDeleteEntitiesIfGrouperCreated(); return deleteEntitiesIfGrouperCreated; @@ -630,6 +651,10 @@ public boolean isDeleteGroupsIfGrouperCreated() { deleteGroupsIfGrouperCreated = false; return deleteGroupsIfGrouperCreated; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeGroupCrud()) { + deleteGroupsIfGrouperCreated = true; + return deleteGroupsIfGrouperCreated; + } // is it configured to? deleteGroupsIfGrouperCreated = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isDeleteGroupsIfGrouperCreated(); @@ -655,6 +680,10 @@ public boolean isDeleteMembershipsIfGrouperCreated() { deleteMembershipsIfGrouperCreated = false; return deleteMembershipsIfGrouperCreated; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeMembershipCrud()) { + deleteMembershipsIfGrouperCreated = true; + return deleteMembershipsIfGrouperCreated; + } // is it configured to? this.deleteMembershipsIfGrouperCreated = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isDeleteMembershipsIfGrouperCreated(); @@ -708,7 +737,11 @@ public boolean isDeleteGroups() { deleteGroups = false; return deleteGroups; } - + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeGroupCrud()) { + deleteGroups = true; + return deleteGroups; + } + // is it configured to? deleteGroups = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isDeleteGroups(); return deleteGroups; @@ -750,6 +783,11 @@ public boolean isDeleteEntities() { return deleteEntities; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeEntityCrud()) { + deleteEntities = true; + return deleteEntities; + } + // is it configured to? deleteEntities = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isDeleteEntities(); return deleteEntities; @@ -848,6 +886,10 @@ public boolean isDeleteMemberships() { deleteMemberships = false; return deleteMemberships; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeMembershipCrud()) { + deleteMemberships = true; + return deleteMemberships; + } // is it configured to? this.deleteMemberships = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isDeleteMemberships(); @@ -917,6 +959,10 @@ public boolean isUpdateGroups() { updateGroups = false; return updateGroups; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeGroupCrud()) { + updateGroups = true; + return updateGroups; + } // is it configured to? updateGroups = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isUpdateGroups(); @@ -953,6 +999,10 @@ public boolean isInsertGroups() { insertGroups = false; return insertGroups; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeGroupCrud()) { + insertGroups = true; + return insertGroups; + } // is it configured to? insertGroups = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isInsertGroups(); @@ -1079,6 +1129,11 @@ public boolean isUpdateEntities() { return updateEntities; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeEntityCrud()) { + updateEntities = true; + return updateEntities; + } + // is it configured to? updateEntities = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isUpdateEntities(); return updateEntities; @@ -1123,6 +1178,11 @@ public boolean isInsertEntities() { return insertEntities; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeEntityCrud()) { + insertEntities = true; + return insertEntities; + } + // is it configured to? insertEntities = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isInsertEntities(); return insertEntities; @@ -1257,6 +1317,10 @@ public boolean isUpdateMemberships() { updateMemberships = false; return updateMemberships; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeMembershipCrud()) { + updateMemberships = true; + return updateMemberships; + } // is it configured to? theres not a lot of use cases for updating memberships, so lets sort of ignore this for now this.updateMemberships = this.isInsertMemberships(); @@ -1296,6 +1360,10 @@ public boolean isInsertMemberships() { insertMemberships = false; return insertMemberships; } + if (!this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isCustomizeMembershipCrud()) { + insertMemberships = true; + return insertMemberships; + } this.insertMemberships = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().isInsertMemberships(); return this.insertMemberships; diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java index 8c0a69221d59..01083dcf7fc4 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationValidation.java @@ -434,10 +434,11 @@ public void validateFromSuffixValueMap() { public void validateOperateOnEntitiesIfSubjectSourcesToProvision() { boolean operateOnGrouperEntities = GrouperUtil.booleanValue(this.suffixToConfigValue.get("operateOnGrouperEntities"), false); + boolean operateOnGrouperMemberships = GrouperUtil.booleanValue(this.suffixToConfigValue.get("operateOnGrouperMemberships"), false); String subjectSourcesToProvision = this.suffixToConfigValue.get("subjectSourcesToProvision"); - if (!StringUtils.isBlank(subjectSourcesToProvision) && !operateOnGrouperEntities) { + if (!StringUtils.isBlank(subjectSourcesToProvision) && !operateOnGrouperEntities && !operateOnGrouperMemberships) { this.addErrorMessage(new ProvisioningValidationIssue().assignMessage(GrouperTextContainer.textOrNull("grouperProvisioningSubjectSourcesToProvisionRequiresEntitiesInvalid"))); } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningFullSyncJob.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningFullSyncJob.java index 27e5981e0098..1f4770e20a86 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningFullSyncJob.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningFullSyncJob.java @@ -55,6 +55,7 @@ public void run() { grouperProvisioner.setJobName(hib3GrouperLoaderLog.getJobName()); GrouperProvisioningOutput grouperProvisioningOutput = grouperProvisioner.provision(GrouperProvisioningType.fullProvisionFull); + grouperProvisioningOutput.setHib3GrouperLoaderLog(hib3GrouperLoaderLog); grouperProvisioningOutput.copyToHib3LoaderLog(); hib3GrouperLoaderLog.store(); } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogic.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogic.java index d90162878e2e..838b5d57c8c2 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogic.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogic.java @@ -987,13 +987,13 @@ public void provisionIncremental() { // ######## Retrieve memberships from target that are recalc where the group is not recalc try { - debugMap.put("state", "retrieveTargetIncrementalMembershipsWithRecalcWhereGroupIsNotRecalc"); + debugMap.put("state", "retrieveTargetIncrementalMembershipsWithRecalcWhereContainerIsNotRecalc"); long start = System.currentTimeMillis(); - grouperProvisioningLogicIncremental.retrieveTargetIncrementalMembershipsWithRecalcWhereGroupIsNotRecalc(); + grouperProvisioningLogicIncremental.retrieveTargetIncrementalMembershipsWithRecalcWhereContainerIsNotRecalc(); long retrieveTargetDataMillis = System.currentTimeMillis()-start; - debugMap.put("retrieveTargetDataMillis", retrieveTargetDataMillis); + debugMap.put("retrieveTargetIncrementalMembershipsMillis", retrieveTargetDataMillis); } finally { - this.getGrouperProvisioner().retrieveGrouperProvisioningObjectLog().debug(GrouperProvisioningObjectLogType.retrieveTargetIncrementalMembershipsWithRecalcWhereGroupIsNotRecalc); + this.getGrouperProvisioner().retrieveGrouperProvisioningObjectLog().debug(GrouperProvisioningObjectLogType.retrieveTargetIncrementalMembershipsWithRecalcWhereContainerIsNotRecalc); } { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicIncremental.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicIncremental.java index d6c99c2f4bfe..98e03c5d7508 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicIncremental.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLogicIncremental.java @@ -2219,7 +2219,7 @@ public void copyIncrementalStateToWrappers() { } - public void retrieveTargetIncrementalMembershipsWithRecalcWhereGroupIsNotRecalc() { + public void retrieveTargetIncrementalMembershipsWithRecalcWhereContainerIsNotRecalc() { if (!this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isSelectMemberships()) { return; @@ -2272,7 +2272,9 @@ public void retrieveTargetIncrementalMembershipsWithRecalcWhereGroupIsNotRecalc( requestGrouperTargetGroups.add(clonedGrouperTargetGroup); } - + if (GrouperUtil.length(requestGrouperTargetGroups) == 0) { + return; + } targetDaoRetrieveMembershipsRequest.setTargetMemberships(requestGrouperTargetGroups); TargetDaoRetrieveMembershipsResponse membershipsResponse = this.getGrouperProvisioner().retrieveGrouperProvisioningTargetDaoAdapter().retrieveMemberships(targetDaoRetrieveMembershipsRequest); @@ -2300,9 +2302,116 @@ public void retrieveTargetIncrementalMembershipsWithRecalcWhereGroupIsNotRecalc( } + } else if (this.getGrouperProvisioner().retrieveGrouperProvisioningBehavior().getGrouperProvisioningBehaviorMembershipType() == GrouperProvisioningBehaviorMembershipType.entityAttributes) { + + Set entityWrappersFromMembershipsWithoutRecalc = new HashSet(); + for (ProvisioningMembershipWrapper provisioningMembershipWrapper : this.getGrouperProvisioner().retrieveGrouperProvisioningData().getProvisioningMembershipWrappers()) { + + ProvisioningEntityWrapper entityWrapper = provisioningMembershipWrapper.getGrouperProvisioningMembership().getProvisioningEntity().getProvisioningEntityWrapper(); + if (!entityWrapper.isRecalc() && provisioningMembershipWrapper.isRecalc()) { + entityWrappersFromMembershipsWithoutRecalc.add(entityWrapper); + } + } + + // we need to send this list to the target dao and ask about certain memberships + List requestGrouperTargetEntities = new ArrayList(); + + String attributeForMemberships = this.getGrouperProvisioner().retrieveGrouperProvisioningConfiguration().getAttributeNameForMemberships(); + + for (ProvisioningEntityWrapper entityWrapperFromMembership: entityWrappersFromMembershipsWithoutRecalc) { + + ProvisioningEntity clonedGrouperTargetEntity = entityWrapperFromMembership.getGrouperTargetEntity().clone(); + + Object attributeValue = clonedGrouperTargetEntity.retrieveAttributeValue(attributeForMemberships); + + ProvisioningAttribute grouperAttribute = GrouperUtil.nonNull(clonedGrouperTargetEntity.getAttributes()).get(attributeForMemberships); + + if (attributeValue instanceof Collection) { + + Iterator valueIterator = ((Collection) attributeValue).iterator(); + + while (valueIterator.hasNext()) { + Object value = valueIterator.next(); + ProvisioningMembershipWrapper provisioningMembershipWrapper = grouperAttribute.getValueToProvisioningMembershipWrapper().get(value); + if (!provisioningMembershipWrapper.isRecalc()) { + valueIterator.remove(); + } + + } + } + + requestGrouperTargetEntities.add(clonedGrouperTargetEntity); + + } + + if (GrouperUtil.length(requestGrouperTargetEntities) == 0) { + return; + } + + targetDaoRetrieveMembershipsRequest.setTargetMemberships(requestGrouperTargetEntities); + + TargetDaoRetrieveMembershipsResponse membershipsResponse = this.getGrouperProvisioner().retrieveGrouperProvisioningTargetDaoAdapter().retrieveMemberships(targetDaoRetrieveMembershipsRequest); + + List targetEntitiesWithMemberships = membershipsResponse.getTargetMemberships(); + + this.grouperProvisioner.retrieveGrouperProvisioningTranslator().idTargetEntities((List)(Object)targetEntitiesWithMemberships); + + for (Object provisioningEntityObject: GrouperUtil.nonNull(targetEntitiesWithMemberships)) { // because memberships are stored in group attributes, so we receive groups for memberships call + + ProvisioningEntity provisioningEntityFromTarget = (ProvisioningEntity) provisioningEntityObject; + + Set attributeValueSet = (Set)provisioningEntityFromTarget.retrieveAttributeValueSet(attributeForMemberships); + + ProvisioningEntityWrapper originalTargetEntityWrapper = this.getGrouperProvisioner().retrieveGrouperProvisioningDataIndex() + .getEntityMatchingIdToProvisioningEntityWrapper().get(provisioningEntityFromTarget.getMatchingId()); + + ProvisioningEntity originalTargetEntity = originalTargetEntityWrapper.getTargetProvisioningEntity(); + + for (Object value: GrouperUtil.nonNull(attributeValueSet)) { + + originalTargetEntity.addAttributeValue(attributeForMemberships, value); + + } + + } + + } else if (this.getGrouperProvisioner().retrieveGrouperProvisioningBehavior().getGrouperProvisioningBehaviorMembershipType() == GrouperProvisioningBehaviorMembershipType.membershipObjects) { + + List membershipsWithRecalc = new ArrayList(); + for (ProvisioningMembershipWrapper provisioningMembershipWrapper : this.getGrouperProvisioner().retrieveGrouperProvisioningData().getProvisioningMembershipWrappers()) { + + if (provisioningMembershipWrapper.isRecalc() && provisioningMembershipWrapper.getGrouperProvisioningMembership() != null) { + membershipsWithRecalc.add(provisioningMembershipWrapper.getGrouperTargetMembership()); + } + } + + if (GrouperUtil.length(membershipsWithRecalc) == 0) { + return; + } + + targetDaoRetrieveMembershipsRequest.setTargetMemberships((List)(Object)membershipsWithRecalc); + + TargetDaoRetrieveMembershipsResponse membershipsResponse = this.getGrouperProvisioner().retrieveGrouperProvisioningTargetDaoAdapter().retrieveMemberships(targetDaoRetrieveMembershipsRequest); + + List targetMemberships = membershipsResponse.getTargetMemberships(); + + this.grouperProvisioner.retrieveGrouperProvisioningTranslator().idTargetMemberships((List)(Object)targetMemberships); + + for (Object provisioningMembershipObject: GrouperUtil.nonNull(targetMemberships)) { + + ProvisioningMembership targetProvisioningMembership = (ProvisioningMembership) provisioningMembershipObject; + + ProvisioningMembershipWrapper originalTargetMembershipWrapper = this.getGrouperProvisioner().retrieveGrouperProvisioningDataIndex() + .getMembershipMatchingIdToProvisioningMembershipWrapper().get(targetProvisioningMembership.getMatchingId()); + + originalTargetMembershipWrapper.setTargetProvisioningMembership(targetProvisioningMembership); + + } + + } else { + throw new RuntimeException("Not expecting membership type: " + this.getGrouperProvisioner().retrieveGrouperProvisioningBehavior().getGrouperProvisioningBehaviorMembershipType()); } - } public void retrieveIncrementalTargetData() { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningObjectLogType.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningObjectLogType.java index 377d8d798482..f372912c7fd3 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningObjectLogType.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningObjectLogType.java @@ -295,7 +295,7 @@ void logState(GrouperProvisioningObjectLog grouperProvisioningObjectLog, } }, - retrieveTargetIncrementalMembershipsWithRecalcWhereGroupIsNotRecalc { + retrieveTargetIncrementalMembershipsWithRecalcWhereContainerIsNotRecalc { @Override void logState(GrouperProvisioningObjectLog grouperProvisioningObjectLog, diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningOutput.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningOutput.java index 537329f9ff28..5b8d21e58924 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningOutput.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningOutput.java @@ -548,6 +548,7 @@ public void copyToHib3LoaderLog() { hib3GrouperLoaderLog.setInsertCount(this.insert); hib3GrouperLoaderLog.setUpdateCount(this.update); hib3GrouperLoaderLog.setTotalCount(this.totalCount); + hib3GrouperLoaderLog.appendJobMessage(this.message); } public GrouperProvisioner getGrouperProvisioner() { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/targetDao/GrouperProvisionerTargetDaoBase.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/targetDao/GrouperProvisionerTargetDaoBase.java index e2d4863d0070..8bf4ccc4b1c9 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/targetDao/GrouperProvisionerTargetDaoBase.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/targetDao/GrouperProvisionerTargetDaoBase.java @@ -236,7 +236,7 @@ public TargetDaoRetrieveMembershipsByEntityResponse retrieveMembershipsByEntity( /** * bulk retrieve target provisioning Memberships, generally use the matching Ids in the targetMemberships - * @ptouperTargetMemberships + * @param targetDaoRetrieveMembershipsRequest * @return the target provisioning Memberships */ public TargetDaoRetrieveMembershipsResponse retrieveMemberships(TargetDaoRetrieveMembershipsRequest targetDaoRetrieveMembershipsRequest) { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java index 3a60df761088..8532bdbee75b 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningConfiguration.java @@ -265,7 +265,7 @@ public void configureSpecificSettings() { if (!StringUtils.isBlank(this.membershipTableName) && StringUtils.isBlank(this.getMembershipMatchingIdExpression())) { //setMembershipMatchingIdExpression("${new edu.internet2.middleware.grouperClient.collections.MultiKey(targetMembership.getProvisioningGroup().retrieveAttributeValueString('"+groupTableIdColumn+"'), targetMembership.getProvisioningEntity().retrieveAttributeValueString('"+entityTableIdColumn+"'))}"); - setMembershipMatchingIdExpression("${new('edu.internet2.middleware.grouperClient.collections.MultiKey', targetMembership.retrieveAttributeValueString('"+findMembershipGroupMatchingIdAttribute()+"'), targetMembership.retrieveAttributeValueString('"+findMembershipEntityMatchingIdAttribute()+"'))}"); + setMembershipMatchingIdExpression("${new('edu.internet2.middleware.grouperClient.collections.MultiKey', targetMembership.retrieveAttributeValueString('"+getMembershipGroupMatchingIdAttribute()+"'), targetMembership.retrieveAttributeValueString('"+getMembershipEntityMatchingIdAttribute()+"'))}"); } // this.groupAttributeTableForeignKeyToGroup = this.retrieveConfigString("groupAttributeTableForeignKeyToGroup", false); // this.groupAttributeTableIdColumn = this.retrieveConfigString("groupAttributeTableIdColumn", false); @@ -302,9 +302,17 @@ public void configureSpecificSettings() { * find the matching ID part for membership table that goes to the group * @return the column which is the matching ID in memberships for group */ - public String findMembershipGroupMatchingIdAttribute() { + public String getMembershipGroupMatchingIdAttribute() { + if (StringUtils.isBlank(this.membershipTableName)) { + return null; + } + if (!StringUtils.isBlank(membershipGroupMatchingIdAttribute)) { + return this.membershipGroupMatchingIdAttribute; + } + if (!StringUtils.isBlank(this.membershipGroupForeignKeyColumn)) { - return this.membershipGroupForeignKeyColumn; + membershipGroupMatchingIdAttribute = membershipGroupForeignKeyColumn; + return this.membershipGroupMatchingIdAttribute; } // "id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description" @@ -318,7 +326,8 @@ public String findMembershipGroupMatchingIdAttribute() { SqlGrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = (SqlGrouperProvisioningConfigurationAttribute) this.getTargetMembershipAttributeNameToConfig().get(name); if (StringUtils.equals(groupMapping, grouperProvisioningConfigurationAttribute.getTranslateFromGrouperProvisioningGroupField())) { - return name; + membershipGroupMatchingIdAttribute = name; + return this.membershipGroupMatchingIdAttribute; } } @@ -327,13 +336,25 @@ public String findMembershipGroupMatchingIdAttribute() { throw new RuntimeException("Cant find membership column to use for matching when it involves groups"); } + private String membershipEntityMatchingIdAttribute; + + private String membershipGroupMatchingIdAttribute; + /** * find the matching ID part for membership table that goes to the entity * @return the column which is the matching ID in memberships for entity */ - public String findMembershipEntityMatchingIdAttribute() { + public String getMembershipEntityMatchingIdAttribute() { + if (StringUtils.isBlank(this.membershipTableName)) { + return null; + } + if (!StringUtils.isBlank(membershipEntityMatchingIdAttribute)) { + return this.membershipEntityMatchingIdAttribute; + } + if (!StringUtils.isBlank(this.membershipEntityForeignKeyColumn)) { - return this.membershipEntityForeignKeyColumn; + membershipEntityMatchingIdAttribute = membershipEntityForeignKeyColumn; + return this.membershipEntityMatchingIdAttribute; } // "id", "email", "loginid", "memberId", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2" @@ -347,7 +368,8 @@ public String findMembershipEntityMatchingIdAttribute() { SqlGrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = (SqlGrouperProvisioningConfigurationAttribute) this.getTargetMembershipAttributeNameToConfig().get(name); if (StringUtils.equals(entityMapping, grouperProvisioningConfigurationAttribute.getTranslateFromGrouperProvisioningEntityField())) { - return name; + membershipEntityMatchingIdAttribute = name; + return this.membershipEntityMatchingIdAttribute; } } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningDao.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningDao.java index 8349452b8f72..769a54461b38 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningDao.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningDao.java @@ -43,11 +43,14 @@ import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoRetrieveGroupsResponse; import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoRetrieveMembershipsBulkRequest; import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoRetrieveMembershipsBulkResponse; +import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoRetrieveMembershipsRequest; +import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoRetrieveMembershipsResponse; import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoUpdateEntitiesRequest; import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoUpdateEntitiesResponse; import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoUpdateGroupsRequest; import edu.internet2.middleware.grouper.app.provisioning.targetDao.TargetDaoUpdateGroupsResponse; import edu.internet2.middleware.grouper.util.GrouperUtil; +import edu.internet2.middleware.grouperClient.collections.MultiKey; /** * @@ -93,6 +96,38 @@ public TargetDaoRetrieveAllMembershipsResponse retrieveAllMemberships(TargetDaoR return new TargetDaoRetrieveAllMembershipsResponse(result); } + /** + * bulk retrieve target provisioning Memberships, generally use the matching Ids in the targetMemberships + * @param targetDaoRetrieveMembershipsRequest + * @return the target provisioning Memberships + */ + public TargetDaoRetrieveMembershipsResponse retrieveMemberships(TargetDaoRetrieveMembershipsRequest targetDaoRetrieveMembershipsRequest) { + TargetDaoRetrieveMembershipsResponse targetDaoRetrieveMembershipsResponse = new TargetDaoRetrieveMembershipsResponse(); + if (GrouperUtil.length(targetDaoRetrieveMembershipsRequest.getTargetMemberships()) == 0) { + return targetDaoRetrieveMembershipsResponse; + } + + List grouperTargetGroups = new ArrayList(); + List grouperTargetEntities = new ArrayList(); + List grouperTargetMemberships = new ArrayList(); + + for (Object object : targetDaoRetrieveMembershipsRequest.getTargetMemberships()) { + if (object instanceof ProvisioningGroup) { + grouperTargetGroups.add((ProvisioningGroup)object); + } + if (object instanceof ProvisioningEntity) { + grouperTargetEntities.add((ProvisioningEntity)object); + } + if (object instanceof ProvisioningMembership) { + grouperTargetMemberships.add((ProvisioningMembership)object); + } + } + + List memberships = retrieveMemberships(grouperTargetGroups, grouperTargetEntities, (List)(Object)grouperTargetMemberships); + targetDaoRetrieveMembershipsResponse.setTargetMemberships((List)(Object)memberships); + return targetDaoRetrieveMembershipsResponse; + } + /** * * @param grouperTargetGroups @@ -107,9 +142,9 @@ public List retrieveMemberships(List String dbExternalSystemConfigId = sqlProvisioningConfiguration.getDbExternalSystemConfigId(); - String membershipGroupColumn = sqlProvisioningConfiguration.getMembershipGroupForeignKeyColumn(); - String membershipEntityColumn = sqlProvisioningConfiguration.getMembershipEntityForeignKeyColumn(); - + String membershipGroupColumn = sqlProvisioningConfiguration.getMembershipGroupMatchingIdAttribute(); + String membershipEntityColumn = sqlProvisioningConfiguration.getMembershipEntityMatchingIdAttribute(); + String entityTableIdColumn = sqlProvisioningConfiguration.getEntityTableIdColumn(); String groupTableIdColumn = sqlProvisioningConfiguration.getGroupTableIdColumn(); @@ -701,19 +736,18 @@ public TargetDaoDeleteMembershipsResponse deleteMemberships(TargetDaoDeleteMembe GrouperUtil.assertion(!StringUtils.isBlank(objectTableName), "Need membership table name"); - String entityIdForeignKeyColumn = sqlProvisioningConfiguration.getMembershipEntityForeignKeyColumn(); - String groupIdForeignKeyColumn = sqlProvisioningConfiguration.getMembershipGroupForeignKeyColumn(); + String groupIdColumn = sqlProvisioningConfiguration.getMembershipGroupMatchingIdAttribute(); + String entityIdColumn = sqlProvisioningConfiguration.getMembershipEntityMatchingIdAttribute(); List ownerIds = new ArrayList(); for (ProvisioningMembership targetMembership: targetMemberships) { - String groupIdValue = targetMembership.retrieveAttributeValueString(groupIdForeignKeyColumn); - String entityIdValue = targetMembership.retrieveAttributeValueString(entityIdForeignKeyColumn); - ownerIds.add(new Object[] {groupIdValue, entityIdValue}); + MultiKey membershipMatchingId = new MultiKey(targetMembership.retrieveAttributeValueString(groupIdColumn), targetMembership.retrieveAttributeValueString(entityIdColumn)); + ownerIds.add(membershipMatchingId.getKeys()); } SqlProvisionerCommands.deleteObjects(ownerIds, dbExternalSystemConfigId, objectTableName, - GrouperUtil.toList(groupIdForeignKeyColumn, entityIdForeignKeyColumn), null, null); + GrouperUtil.toList(groupIdColumn, entityIdColumn), null, null); for (ProvisioningMembership targetMembership: targetMemberships) { diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java index e271cc321e21..0c9c3f250620 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisioningStartWith.java @@ -619,40 +619,66 @@ public void populateProvisionerConfigurationValuesFromStartWith(Map Date: Wed, 25 May 2022 10:23:21 -0400 Subject: [PATCH 055/125] GRP-4054: show english if french is not there --- grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties index 258520bced30..74c08c090218 100644 --- a/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.fr.fr.base.properties @@ -13,7 +13,7 @@ # comma separated config files that override each other (files on the right override the left) # each should start with file: or classpath: # e.g. classpath:grouperText/grouper.text.en.us.base.properties, file:c:/temp/grouperText/grouper.text.en.us.properties -text.config.hierarchy=classpath:grouperText/grouper.textNg.fr.fr.base.properties, classpath:grouperText/grouper.text.fr.fr.properties, database:grouper +text.config.hierarchy=classpath:grouperText/grouper.textNg.en.us.base.properties, classpath:grouperText/grouper.textNg.fr.fr.base.properties, classpath:grouperText/grouper.text.fr.fr.properties, database:grouper # seconds between checking to see if the config files are updated text.config.secondsBetweenUpdateChecks=600 From c2d54186591850733933336091085bdcc4b17f39 Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Thu, 26 May 2022 17:46:33 -0400 Subject: [PATCH 056/125] GRP-4057: could not find membership on delete --- .../grouper/grouperUi/serviceLogic/UiV2Group.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java index 65e42d576f22..1420810bc896 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Group.java @@ -442,7 +442,11 @@ public void removeMembersForThisGroupsMemberships(HttpServletRequest request, Ht Subject groupSubject = group.toSubject(); for (String membershipId : membershipsIds) { try { - Membership membership = new MembershipFinder().addMembershipId(membershipId).findMembership(true); + Membership membership = new MembershipFinder().addMembershipId(membershipId).findMembership(false); + + if (membership == null) { + continue; + } Group ownerGroup = membership.getOwnerGroup(); //dont worry about if no change, thats a success ownerGroup.deleteMember(groupSubject, false); @@ -3026,8 +3030,11 @@ public void removeMembers(HttpServletRequest request, HttpServletResponse respon public Object callback(GrouperSession grouperSession2) throws GrouperSessionException { for (String membershipId : membershipsIds) { try { - Membership membership = new MembershipFinder().addMembershipId(membershipId).findMembership(true); - + Membership membership = new MembershipFinder().addMembershipId(membershipId).findMembership(false); + + if (membership == null) { + continue; + } Member member = membership.getMember(); group.deleteMember(member, false); From 9653c12d5953e97682578f615b2cd0ded9a7401b Mon Sep 17 00:00:00 2001 From: Chris Hyzer Date: Thu, 26 May 2022 18:07:19 -0400 Subject: [PATCH 057/125] temp commit on SQL provisioning test --- grouper/conf/grouper-loader.base.properties | 34 ++- .../grouper.textNg.en.us.base.properties | 8 +- .../GrouperProvisioningBehavior.java | 76 +++-- .../GrouperProvisioningConfiguration.java | 58 ++-- ...perProvisioningConfigurationAttribute.java | 45 --- .../GrouperProvisioningGrouperSyncDao.java | 8 +- .../GrouperProvisioningLinkLogic.java | 64 ++-- .../GrouperProvisioningTranslator.java | 278 ++++++++++++------ .../app/provisioning/ProvisioningEntity.java | 81 +++++ .../middleware/grouper/util/GrouperUtil.java | 2 + .../LdapProvisionerTestUtils.java | 4 +- .../sqlProvisioning/SqlProvisionerTest.java | 2 +- .../SqlProvisionerTestUtils.java | 212 +++++++++---- 13 files changed, 568 insertions(+), 304 deletions(-) diff --git a/grouper/conf/grouper-loader.base.properties b/grouper/conf/grouper-loader.base.properties index 878edc5915f9..2f6a3db13e16 100644 --- a/grouper/conf/grouper-loader.base.properties +++ b/grouper/conf/grouper-loader.base.properties @@ -3111,7 +3111,9 @@ grouper.provisioning.removeSyncLogRowsAfterDays = 7 # {valueType: "string", indent: 2, required: true, subSection: "entity2", showEl: "${operateOnGrouperEntities && entityAttributeValueCacheHas && entityAttributeValueCache3has && (entityAttributeValueCache3type == 'translationScript' || entityAttributeValueCache3type == 'subjectTranslationScript')}", order: 80608} # provisioner.genericProvisioner.entityAttributeValueCache3translationScript = - +# entity section 2 advanced options +# {valueType: "boolean", defaultValue: "false", order: 81000, subSection: "entity2", showEl: "${operateOnGrouperEntities}"} +# provisioner.genericProvisioner.entity2advanced = # Show provisioning diagnostics # {valueType: "boolean", order: 82000, defaultValue: "false", subSection: "provisioningDiagnostics"} @@ -3502,11 +3504,11 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.userTableName = # users table primary key column of user table -# {valueType: "string", order: 49020, subSection: "entity", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} +# {valueType: "string", order: 80995, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }", formElement: "dropdown", optionValuesFromClass: "edu.internet2.middleware.grouper.app.provisioning.ProvisioningEntityAttributeDropdownOptions"} # provisioner.someSqlProvisioner.userPrimaryKey = # if this is more complicated than just a simple select, put the query here optional, select * from users where ... -# {valueType: "string", order: 49040, subSection: "entity", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) }"} +# {valueType: "string", order: 81007, subSection: "entity2", showEl: "${operateOnGrouperEntities && (!customizeEntityCrud || selectEntities) && entity2Advanced}"} # provisioner.someSqlProvisioner.userSearchQuery = # memberships table where memberships go. include schema name if necessary @@ -3542,31 +3544,31 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.useSeparateTableForGroupAttributes = # table to store group attributes -# {valueType: "string", subSection: "group", order: 15042, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", indent: 1, subSection: "group", order: 15042, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesTableName = # column from group table which is the foreign key in the group attribute table. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79441, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", indent: 1, subSection: "group", order: 15043, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesGroupForeignKeyColumn = # name of the column in group attribute table that will store attribute names. Include schema name if necessary. -# {valueType: "string", subSection: "group2", defaultValue: "attribute_name", order: 79442, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", indent: 1, subSection: "group", defaultValue: "attribute_name", order: 15044, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeNameColumn = # name of the column in group attribute table that will store attribute values. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79443, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} +# {valueType: "string", indent: 1, subSection: "group", order: 15045, defaultValue: "attribute_value", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes}"} # provisioner.someSqlProvisioner.groupAttributesAttributeValueColumn = # if this is more complicated than just a simple select, put the query here optional, select * from groups where ... -# {valueType: "string", subSection: "group2", order: 79912, showEl: "${operateOnGrouperGroups && group2advanced }"} +# {valueType: "string", indent: 1, subSection: "group2", order: 79912, showEl: "${operateOnGrouperGroups && group2advanced }"} # provisioner.someSqlProvisioner.groupSearchQuery = # name of the column in group attribute table that will store last modified timestamp. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79913, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}"} +# {valueType: "string", indent: 1, subSection: "group2", order: 79913, showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}"} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumn = # type of the last modified column. Include schema name if necessary. -# {valueType: "string", subSection: "group2", order: 79914, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} +# {valueType: "string", indent: 1, subSection: "group2", order: 79914, defaultValue: "long", showEl: "${operateOnGrouperGroups && useSeparateTableForGroupAttributes && group2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} # provisioner.someSqlProvisioner.groupAttributesLastModifiedColumnType = # Storage type @@ -3579,27 +3581,27 @@ provisionerPropertiesToIgnore.GrouperBoxProvisioner.keySuffixes = debugLog,logAl # provisioner.someSqlProvisioner.useSeparateTableForEntityAttributes = # table to store entity attributes -# {valueType: "string", subSection: "entity", order: 49012, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} +# {valueType: "string", indent: 1, subSection: "entity", order: 49012, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} # provisioner.someSqlProvisioner.entityAttributesTableName = # column from entity table which is the foreign key in the entity attribute table. Include schema name if necessary. -# {valueType: "string", subSection: "entity", order: 49013, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} +# {valueType: "string", indent: 1, subSection: "entity", order: 49013, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} # provisioner.someSqlProvisioner.entityAttributesEntityForeignKeyColumn = # name of the column in entity attribute table that will store attribute names. Include schema name if necessary. -# {valueType: "string", subSection: "entity", defaultValue: "attribute_name", order: 49044, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} +# {valueType: "string", indent: 1, subSection: "entity", defaultValue: "attribute_name", order: 49014, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} # provisioner.someSqlProvisioner.entityAttributesAttributeNameColumn = # name of the column in entity attribute table that will store attribute values. Include schema name if necessary. -# {valueType: "string", subSection: "entity", order: 49045, defaultValue: "attribute_value", showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} +# {valueType: "string", indent: 1, subSection: "entity", order: 49015, defaultValue: "attribute_value", showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} # provisioner.someSqlProvisioner.entityAttributesAttributeValueColumn = # name of the column in entity attribute table that will store last modified timestamp. Include schema name if necessary. -# {valueType: "string", subSection: "entity", order: 49046, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}"} +# {valueType: "string", indent: 1, subSection: "entity2", order: 81011, showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes && entity2advanced}"} # provisioner.someSqlProvisioner.entityAttributesLastModifiedColumn = # type of the last modified column. Include schema name if necessary. -# {valueType: "string", subSection: "entity", order: 49047, defaultValue: "long", showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes}", formElement: "dropdown", optionValues: ["long", "timestamp"]} +# {valueType: "string", indent: 1, subSection: "entity2", order: 81012, defaultValue: "long", showEl: "${operateOnGrouperEntities && useSeparateTableForEntityAttributes && entity2advanced}", formElement: "dropdown", optionValues: ["long", "timestamp"]} # provisioner.someSqlProvisioner.entityAttributesLastModifiedColumnType = # Storage type diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 865f37d6e8c5..df24a5eb4aae 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -13334,6 +13334,9 @@ config.GenericConfiguration.attribute.groupSearchAttribute2name.description = Th config.GenericConfiguration.attribute.group2advanced.label = Advanced options config.GenericConfiguration.attribute.group2advanced.description = Advanced options for group section 2 +config.GenericConfiguration.attribute.entity2advanced.label = Advanced options +config.GenericConfiguration.attribute.entity2advanced.description = Advanced options for entity section 2 + config.GenericConfiguration.subSection.membership2.title = Membership configuration section 2 config.GenericConfiguration.subSection.membership2.description = Membership configuration after attributes configured for memberships / groups / entities config.GenericConfiguration.subSection.membership2.documentation = Some settings rely on configurations in the memberships / groups / entities sections so this second second section is below those @@ -14101,9 +14104,6 @@ config.GenericConfiguration.attribute.targetGroupAttribute.i.showAttributeValida config.GenericConfiguration.attribute.targetEntityAttribute.i.showAttributeValidation.label = __i+1__ - show validation settings config.GenericConfiguration.attribute.targetEntityAttribute.i.showAttributeValidation.description = If there is validation on this attribute (which is not built in), then customize there -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromGroupSyncField.label = __i+1__ - Group sync from field -config.GenericConfiguration.attribute.targetMembershipAttribute.i.translateFromGroupSyncField.description = If this is a membership attribute for entityAttributes provisioning, then the values can be copied from the group sync object from this field. - config.GenericConfiguration.attribute.targetMembershipAttribute.i.valueType.label = __i+1__ - value type config.GenericConfiguration.attribute.targetMembershipAttribute.i.valueType.description = Generally this is going to be a string (text). int means 4 byte signed integer (-2 billion to 2 billion). long is for large integers config.GenericConfiguration.attribute.targetMembershipAttribute.i.select.label = __i+1__ - select @@ -14322,8 +14322,6 @@ config.GenericConfiguration.attribute.targetEntityAttribute.i.maxlength.label = config.GenericConfiguration.attribute.targetEntityAttribute.i.maxlength.description = If there is a maximum length requirement for this field in the target, assign the integer of maximum number of characters. If this field value size is greater than the max length, then the Entity is invalid and will not be provisioned config.GenericConfiguration.attribute.targetEntityAttribute.i.validExpression.label = __i+1__ - validation expression config.GenericConfiguration.attribute.targetEntityAttribute.i.validExpression.description = If there is a complex validation by JEXL script enter that here. The available variables are "value" (each individual value), and "valueMultiple" (the set of multiple values if this attribute supports multiple values. Return true for valid or false for invalid. Example to see if numeric value is positive: ${value>0} -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGroupSyncField.label = __i+1__ - Group sync from field -config.GenericConfiguration.attribute.targetEntityAttribute.i.translateFromGroupSyncField.description = If this is a membership attribute for entityAttributes provisioning, then the values can be copied from the group sync object from this field. config.GenericConfiguration.subSection.metadata.title = Metadata config.GenericConfiguration.subSection.metadata.description = Metadata is extra information attached to folders, groups, entities, or memberships used in provisioning configuration diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java index f5b487f491cf..3e012a788bc7 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningBehavior.java @@ -2,6 +2,7 @@ import java.lang.reflect.Array; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -239,15 +240,11 @@ public boolean isHasTargetEntityLink() { if (this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().isHasTargetEntityLink()) { return true; } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (!StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - return true; + for (GrouperProvisioningConfigurationAttributeDbCache entityAttributeCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()) { + if (entityAttributeCache == null) { + continue; } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetEntityAttributeNameToConfig().values()) { - if (!StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + if (entityAttributeCache.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target) { return true; } } @@ -267,25 +264,25 @@ public void setHasTargetEntityLink(Boolean hasTargetEntityLink) { public boolean isHasSubjectLink() { if (hasSubjectLink == null) { GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[0]; boolean hasSubjectLinkEntityAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[1]; boolean hasSubjectLinkEntityAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[2]; boolean hasSubjectLinkEntityAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[3]; boolean hasSubjectLinkEntityAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript()); @@ -310,15 +307,11 @@ public boolean isHasTargetGroupLink() { if (this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().isHasTargetGroupLink()) { return true; } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (!StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - return true; + for (GrouperProvisioningConfigurationAttributeDbCache groupAttributeCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()) { + if (groupAttributeCache == null) { + continue; } - } - for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getTargetGroupAttributeNameToConfig().values()) { - if (!StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { + if (groupAttributeCache.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target) { return true; } } @@ -326,8 +319,51 @@ public boolean isHasTargetGroupLink() { return false; } + private Set groupAttributeNamesWithCache = null; + public boolean isGroupAttributeNameHasCache(String attributeName) { + + if (this.groupAttributeNamesWithCache == null) { + Set result = new HashSet(); + + for (GrouperProvisioningConfigurationAttributeDbCache groupAttributeCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()) { + if (groupAttributeCache == null) { + continue; + } + if (groupAttributeCache.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute + && !StringUtils.isBlank(groupAttributeCache.getAttributeName())) { + result.add(groupAttributeCache.getAttributeName()); + } + } + + this.groupAttributeNamesWithCache = result; + } + return this.groupAttributeNamesWithCache.contains(attributeName); + } + + private Set entityAttributeNamesWithCache; + public boolean isEntityAttributeNameHasCache(String attributeName) { + + if (this.entityAttributeNamesWithCache == null) { + Set result = new HashSet(); + + for (GrouperProvisioningConfigurationAttributeDbCache entityAttributeCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()) { + if (entityAttributeCache == null) { + continue; + } + if (entityAttributeCache.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute + && !StringUtils.isBlank(entityAttributeCache.getAttributeName())) { + result.add(entityAttributeCache.getAttributeName()); + } + } + + this.entityAttributeNamesWithCache = result; + } + return this.entityAttributeNamesWithCache.contains(attributeName); + } + + public void setHasTargetGroupLink(Boolean hasTargetGroupLink) { this.hasTargetGroupLink = hasTargetGroupLink; } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java index 653a011232b8..2a2c563bf649 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfiguration.java @@ -2112,16 +2112,6 @@ public void configureGenericSettings() { attributeConfig.setTranslateFromMemberSyncField(translateFromMemberSyncField); } - { - String translateToGroupSyncField = this.retrieveConfigString(objectType+"."+i+".translateToGroupSyncField" , false); - attributeConfig.setTranslateToGroupSyncField(translateToGroupSyncField); - } - - { - String translateToMemberSyncField = this.retrieveConfigString(objectType+"."+i+".translateToMemberSyncField" , false); - attributeConfig.setTranslateToMemberSyncField(translateToMemberSyncField); - } - { String translateGrouperToGroupSyncField = this.retrieveConfigString(objectType+"."+i+".translateGrouperToGroupSyncField" , false); attributeConfig.setTranslateGrouperToGroupSyncField(translateGrouperToGroupSyncField); @@ -2258,58 +2248,58 @@ public void configureGenericSettings() { this.groupAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupAttributeValueCacheHas", false), false); if (this.groupAttributeValueCacheHas) { - this.grouperProvisioningConfigurationGroupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; + this.groupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; for (int i=0;i<4;i++) { boolean theGroupAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupAttributeValueCache" + i + "has", false), false); if (!theGroupAttributeValueCacheHas) { continue; } - this.grouperProvisioningConfigurationGroupAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "group"); + this.groupAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "group"); String theGroupAttributeValueCache0source = this.retrieveConfigString("groupAttributeValueCache" + i + "source", true); - this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setSource( + this.groupAttributeDbCaches[i].setSource( GrouperProvisioningConfigurationAttributeDbCacheSource.valueOfIgnoreCase(theGroupAttributeValueCache0source, true)); String theGroupAttributeValueCache0type = this.retrieveConfigString("groupAttributeValueCache" + i + "type", true); - this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setType( + this.groupAttributeDbCaches[i].setType( GrouperProvisioningConfigurationAttributeDbCacheType.valueOfIgnoreCase(theGroupAttributeValueCache0type, true)); - if (this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { - this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("groupAttributeValueCache" + i + "groupAttribute", true)); - } else if (this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) { - this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("groupAttributeValueCache" + i + "translationScript", true)); + if (this.groupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + this.groupAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("groupAttributeValueCache" + i + "groupAttribute", true)); + } else if (this.groupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) { + this.groupAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("groupAttributeValueCache" + i + "translationScript", true)); } else { throw new RuntimeException("Invalid attribute cache type: " + "groupAttributeValueCache" + i + "type" + ", " - + this.grouperProvisioningConfigurationGroupAttributeDbCaches[i].getType()); + + this.groupAttributeDbCaches[i].getType()); } } } this.entityAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityAttributeValueCacheHas", false), false); if (this.entityAttributeValueCacheHas) { - this.grouperProvisioningConfigurationEntityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; + this.entityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; for (int i=0;i<4;i++) { boolean theEntityAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityAttributeValueCache" + i + "has", false), false); if (!theEntityAttributeValueCacheHas) { continue; } - this.grouperProvisioningConfigurationEntityAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "entity"); + this.entityAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "entity"); String theEntityAttributeValueCache0source = this.retrieveConfigString("entityAttributeValueCache" + i + "source", true); - this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setSource( + this.entityAttributeDbCaches[i].setSource( GrouperProvisioningConfigurationAttributeDbCacheSource.valueOfIgnoreCase(theEntityAttributeValueCache0source, true)); String theEntityAttributeValueCache0type = this.retrieveConfigString("entityAttributeValueCache" + i + "type", true); - this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setType( + this.entityAttributeDbCaches[i].setType( GrouperProvisioningConfigurationAttributeDbCacheType.valueOfIgnoreCase(theEntityAttributeValueCache0type, true)); - if (this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { - this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("entityAttributeValueCache" + i + "entityAttribute", true)); - } else if (this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) { - this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("entityAttributeValueCache" + i + "translationScript", true)); + if (this.entityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + this.entityAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("entityAttributeValueCache" + i + "entityAttribute", true)); + } else if (this.entityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) { + this.entityAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("entityAttributeValueCache" + i + "translationScript", true)); } else { throw new RuntimeException("Invalid attribute cache type: " + "entityAttributeValueCache" + i + "type" + ", " - + this.grouperProvisioningConfigurationEntityAttributeDbCaches[i].getType()); + + this.entityAttributeDbCaches[i].getType()); } } } @@ -2592,16 +2582,16 @@ public boolean isEntityAttributeValueCacheHas() { return entityAttributeValueCacheHas; } - private GrouperProvisioningConfigurationAttributeDbCache[] grouperProvisioningConfigurationGroupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; + private GrouperProvisioningConfigurationAttributeDbCache[] groupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; - public GrouperProvisioningConfigurationAttributeDbCache[] getGrouperProvisioningConfigurationGroupAttributeDbCaches() { - return grouperProvisioningConfigurationGroupAttributeDbCaches; + public GrouperProvisioningConfigurationAttributeDbCache[] getGroupAttributeDbCaches() { + return groupAttributeDbCaches; } - private GrouperProvisioningConfigurationAttributeDbCache[] grouperProvisioningConfigurationEntityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; + private GrouperProvisioningConfigurationAttributeDbCache[] entityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4]; - public GrouperProvisioningConfigurationAttributeDbCache[] getGrouperProvisioningConfigurationEntityAttributeDbCaches() { - return grouperProvisioningConfigurationEntityAttributeDbCaches; + public GrouperProvisioningConfigurationAttributeDbCache[] getEntityAttributeDbCaches() { + return entityAttributeDbCaches; } diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttribute.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttribute.java index e4081630aab9..39aa45dc8ff9 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttribute.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningConfigurationAttribute.java @@ -165,51 +165,6 @@ public String toString() { */ private String translateFromMemberSyncField; - /** - * take this value from target and copy into the sync field - */ - private String translateToGroupSyncField; - - - - /** - * take this value from target and copy into the sync field - * @return - */ - public String getTranslateToGroupSyncField() { - return translateToGroupSyncField; - } - - /** - * take this value from target and copy into the sync field - * @param translateToGroupSyncField - */ - public void setTranslateToGroupSyncField(String translateToGroupSyncField) { - this.translateToGroupSyncField = translateToGroupSyncField; - } - - /** - * take this value from target and copy into the sync field - */ - private String translateToMemberSyncField; - - - /** - * take this value from target and copy into the sync field - * @return - */ - public String getTranslateToMemberSyncField() { - return translateToMemberSyncField; - } - - /** - * take this value from target and copy into the sync field - * @param translateToEntitySyncField - */ - public void setTranslateToMemberSyncField(String translateToEntitySyncField) { - this.translateToMemberSyncField = translateToEntitySyncField; - } - /** * grouper provisioning entity field */ diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java index ec4c43fc5894..c380a608a25c 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningGrouperSyncDao.java @@ -473,28 +473,28 @@ public void updateSubjectLink( // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[0]; boolean hasSubjectLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[1]; boolean hasSubjectLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[2]; boolean hasSubjectLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[3]; boolean hasSubjectLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.grouper && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java index 5adaec53389e..5bdd0bb57468 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningLinkLogic.java @@ -53,22 +53,22 @@ public boolean groupLinkMissing(GcGrouperSyncGroup gcGrouperSyncGroup) { // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[0]; boolean hasGroupLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[1]; boolean hasGroupLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[2]; boolean hasGroupLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[3]; boolean hasGroupLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; @@ -93,22 +93,22 @@ public boolean entityLinkMissing(GcGrouperSyncMember gcGrouperSyncMember) { } GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[0]; boolean hasEntityLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[1]; boolean hasEntityLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[2]; boolean hasEntityLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[3]; boolean hasEntityLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; @@ -139,25 +139,25 @@ public void retrieveSubjectLink() { } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[0]; boolean hasSubjectLinkEntityAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[1]; boolean hasSubjectLinkEntityAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[2]; boolean hasSubjectLinkEntityAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[3]; boolean hasSubjectLinkEntityAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript()); @@ -208,26 +208,26 @@ public void updateGroupLink(Collection provisioningGro } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[0]; boolean hasGroupLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache0Attribute = grouperProvisioningConfigurationAttributeDbCache0 == null ? null : grouperProvisioningConfigurationAttributeDbCache0.retrieveAttribute(); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[1]; boolean hasGroupLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null; GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache1Attribute = grouperProvisioningConfigurationAttributeDbCache1 == null ? null : grouperProvisioningConfigurationAttributeDbCache1.retrieveAttribute(); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[2]; boolean hasGroupLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null; GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache2Attribute = grouperProvisioningConfigurationAttributeDbCache2 == null ? null : grouperProvisioningConfigurationAttributeDbCache2.retrieveAttribute(); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[3]; boolean hasGroupLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null; GrouperProvisioningConfigurationAttribute groupLinkGroupAttributeValueCache3Attribute = grouperProvisioningConfigurationAttributeDbCache3 == null ? null : grouperProvisioningConfigurationAttributeDbCache3.retrieveAttribute(); @@ -445,7 +445,7 @@ public void updateEntityLink(Collection provisioningE } // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[0]; boolean hasEntityLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache0Attribute = @@ -453,21 +453,21 @@ public void updateEntityLink(Collection provisioningE GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[1]; boolean hasEntityLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache1Attribute = grouperProvisioningConfigurationAttributeDbCache1 == null ? null : grouperProvisioningConfigurationAttributeDbCache1.retrieveAttribute(); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[2]; boolean hasEntityLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache2Attribute = grouperProvisioningConfigurationAttributeDbCache2 == null ? null : grouperProvisioningConfigurationAttributeDbCache2.retrieveAttribute(); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[3]; boolean hasEntityLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttribute entityLinkGroupAttributeValueCache3Attribute = @@ -618,25 +618,25 @@ public boolean subjectLinkMissing(GcGrouperSyncMember gcGrouperSyncMember) { // If using subject attributes and those are not in the member sync object, then resolve the subject, and put in the member sync object GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[0]; boolean hasSubjectLinkEntityAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache0.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[1]; boolean hasSubjectLinkEntityAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache1.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[2]; boolean hasSubjectLinkEntityAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache2.getTranslationScript()); GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationEntityAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()[3]; boolean hasSubjectLinkEntityAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript && !StringUtils.isBlank(grouperProvisioningConfigurationAttributeDbCache3.getTranslationScript()); @@ -668,22 +668,22 @@ public List retrieveIncrementalNonRecalcTargetEntitiesThatNe return grouperTargetEntities; } GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[0]; boolean hasEntityLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[1]; boolean hasEntityLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[2]; boolean hasEntityLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[3]; boolean hasEntityLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; @@ -754,22 +754,22 @@ public List retrieveIncrementalNonRecalcTargetGroupsThatNeedL } GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache0 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[0]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[0]; boolean hasGroupLinkAttributeValueCache0 = grouperProvisioningConfigurationAttributeDbCache0 != null && grouperProvisioningConfigurationAttributeDbCache0.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache1 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[1]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[1]; boolean hasGroupLinkAttributeValueCache1 = grouperProvisioningConfigurationAttributeDbCache1 != null && grouperProvisioningConfigurationAttributeDbCache1.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache2 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[2]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[2]; boolean hasGroupLinkAttributeValueCache2 = grouperProvisioningConfigurationAttributeDbCache2 != null && grouperProvisioningConfigurationAttributeDbCache2.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; GrouperProvisioningConfigurationAttributeDbCache grouperProvisioningConfigurationAttributeDbCache3 = - this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGrouperProvisioningConfigurationGroupAttributeDbCaches()[3]; + this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()[3]; boolean hasGroupLinkAttributeValueCache3 = grouperProvisioningConfigurationAttributeDbCache3 != null && grouperProvisioningConfigurationAttributeDbCache3.getSource() == GrouperProvisioningConfigurationAttributeDbCacheSource.target; diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java index 5d7e0400e003..9fd285cbcb4e 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/GrouperProvisioningTranslator.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClient.collections.MultiKey; @@ -361,7 +361,7 @@ public List translateGrouperToTargetEntities( String grouperProvisioningEntityField = getTranslateFromGrouperProvisioningEntityField(forCreate, grouperProvisioningConfigurationAttribute); if (!StringUtils.isBlank(expressionToUse) || !StringUtils.isBlank(staticValuesToUse) || !StringUtils.isBlank(grouperProvisioningEntityField) - || !StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { + || this.grouperProvisioner.retrieveGrouperProvisioningBehavior().isEntityAttributeNameHasCache(grouperProvisioningConfigurationAttribute.getName())) { Object result = attributeTranslation( grouperTargetEntity.retrieveAttributeValue(grouperProvisioningConfigurationAttribute.getName()), elVariableMap, forCreate, @@ -461,7 +461,7 @@ public List translateGrouperToTargetGroups(List elVa translate = true; } else if (provisioningGroupWrapper != null && provisioningGroupWrapper.getGrouperProvisioningGroup() != null && !StringUtils.isBlank(grouperProvisioningGroupField)) { - result = translateFromGrouperProvisioningGroupField(provisioningGroupWrapper.getGrouperProvisioningGroup(), + result = translateFromGrouperProvisioningGroupField(provisioningGroupWrapper, grouperProvisioningGroupField); translate = true; } else if (provisioningEntityWrapper != null && provisioningEntityWrapper.getGrouperProvisioningEntity() != null && !StringUtils.isBlank(grouperProvisioningEntityField)) { - result = translateFromGrouperProvisioningEntityField(provisioningEntityWrapper.getGrouperProvisioningEntity(), + result = translateFromGrouperProvisioningEntityField(provisioningEntityWrapper, grouperProvisioningEntityField); translate = true; } else if (provisioningGroupWrapper != null && provisioningGroupWrapper.getGcGrouperSyncGroup() != null && !StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateFromGroupSyncField())) { @@ -660,45 +708,59 @@ public Object attributeTranslation(Object currentValue, Map elVa result = translateFromMemberSyncField(provisioningEntityWrapper.getGcGrouperSyncMember(), grouperProvisioningConfigurationAttribute.getTranslateFromMemberSyncField()); translate = true; - } else if (provisioningGroupWrapper != null && provisioningGroupWrapper.getGcGrouperSyncGroup() != null && !StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField())) { - result = translateFromGroupSyncField(provisioningGroupWrapper.getGcGrouperSyncGroup(), - grouperProvisioningConfigurationAttribute.getTranslateToGroupSyncField()); - translate = true; - } else if (provisioningEntityWrapper != null && provisioningEntityWrapper.getGcGrouperSyncMember() != null && !StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - result = translateFromMemberSyncField(provisioningEntityWrapper.getGcGrouperSyncMember(), - grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField()); - translate = true; + } else { + if (provisioningGroupWrapper != null && provisioningGroupWrapper.getGcGrouperSyncGroup() != null) { + // look for grouper source first, then target + for (GrouperProvisioningConfigurationAttributeDbCache groupCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()) { + if (groupCache != null && StringUtils.equals(groupCache.getAttributeName(), grouperProvisioningConfigurationAttribute.getName()) + && groupCache.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + result = translateFromGrouperProvisioningGroupField(provisioningGroupWrapper, + "groupAttributeValueCache" + groupCache.getIndex()); + translate = true; + break; + } + } + } + if (provisioningEntityWrapper != null && provisioningEntityWrapper.getGcGrouperSyncMember() != null) { + // look for grouper source first, then target + for (GrouperProvisioningConfigurationAttributeDbCache entityCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()) { + if (entityCache != null && StringUtils.equals(entityCache.getAttributeName(), grouperProvisioningConfigurationAttribute.getName()) + && entityCache.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + result = translateFromGrouperProvisioningEntityField(provisioningEntityWrapper, + "entityAttributeValueCache" + entityCache.getIndex()); + translate = true; + break; + } + } + } } + // TODO still translate if in cache, maybe have both values? if (translate) { if (GrouperUtil.isBlank(result) && provisioningEntityWrapper != null && provisioningEntityWrapper.isDelete() && provisioningEntityWrapper.getGcGrouperSyncMember() != null) { - if (StringUtils.isNotBlank(grouperProvisioningConfigurationAttribute.getTranslateGrouperToMemberSyncField())) { - result = provisioningEntityWrapper.getGcGrouperSyncMember().retrieveField(grouperProvisioningConfigurationAttribute.getTranslateGrouperToMemberSyncField()); - } - - if (StringUtils.isNotBlank(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - result = provisioningEntityWrapper.getGcGrouperSyncMember().retrieveField(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField()); + + for (GrouperProvisioningConfigurationAttributeDbCache entityCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getEntityAttributeDbCaches()) { + if (entityCache != null && StringUtils.equals(entityCache.getAttributeName(), grouperProvisioningConfigurationAttribute.getName()) + && entityCache.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + result = translateFromGrouperProvisioningEntityField(provisioningEntityWrapper, + "entityAttributeValueCache" + entityCache.getIndex()); + break; + } } } if (GrouperUtil.isBlank(result) && provisioningGroupWrapper != null && provisioningGroupWrapper.isDelete() && provisioningGroupWrapper.getGcGrouperSyncGroup() != null) { - if (StringUtils.isNotBlank(grouperProvisioningConfigurationAttribute.getTranslateGrouperToMemberSyncField())) { - result = provisioningGroupWrapper.getGcGrouperSyncGroup().retrieveField(grouperProvisioningConfigurationAttribute.getTranslateGrouperToMemberSyncField()); - } - - if (StringUtils.isNotBlank(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField())) { - result = provisioningGroupWrapper.getGcGrouperSyncGroup().retrieveField(grouperProvisioningConfigurationAttribute.getTranslateToMemberSyncField()); + for (GrouperProvisioningConfigurationAttributeDbCache groupCache : this.grouperProvisioner.retrieveGrouperProvisioningConfiguration().getGroupAttributeDbCaches()) { + if (groupCache != null && StringUtils.equals(groupCache.getAttributeName(), grouperProvisioningConfigurationAttribute.getName()) + && groupCache.getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) { + result = translateFromGrouperProvisioningGroupField(provisioningGroupWrapper, + "groupAttributeValueCache" + groupCache.getIndex()); + break; + } } } - if (!StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateGrouperToGroupSyncField())) { - provisioningGroupWrapper.getGcGrouperSyncGroup().assignField(grouperProvisioningConfigurationAttribute.getTranslateGrouperToGroupSyncField(), result); - } - if (!StringUtils.isBlank(grouperProvisioningConfigurationAttribute.getTranslateGrouperToMemberSyncField())) { - provisioningEntityWrapper.getGcGrouperSyncMember().assignField(grouperProvisioningConfigurationAttribute.getTranslateGrouperToMemberSyncField(), result); - } - return result; } return currentValue; @@ -958,37 +1020,89 @@ public void matchingIdTargetObjects() { /** * translate from gc grouper sync group and field name to the value - * @param gcGrouperSyncGroup + * @param provisioningGroupWrapper * @param field * @return the value */ - public Object translateFromGrouperProvisioningGroupField(ProvisioningGroup provisioningGroup, String field) { + public Object translateFromGrouperProvisioningGroupField(ProvisioningGroupWrapper provisioningGroupWrapper, String field) { - if (StringUtils.equals("id", field)) { - return provisioningGroup.getId(); - } - if (StringUtils.equals("idIndex", field)) { - return provisioningGroup.getIdIndex(); - } - if (StringUtils.equals("idIndexString", field)) { - return GrouperUtil.stringValue(provisioningGroup.getIdIndex()); - } - if (StringUtils.equals("displayExtension", field)) { - return GrouperUtil.stringValue(provisioningGroup.getDisplayExtension()); - } - if (StringUtils.equals("displayName", field)) { - return GrouperUtil.stringValue(provisioningGroup.getDisplayName()); + // "id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description" + if (provisioningGroupWrapper == null) { + return null; } - if (StringUtils.equals("extension", field)) { - return GrouperUtil.stringValue(provisioningGroup.getExtension()); + + ProvisioningGroup provisioningGroup = provisioningGroupWrapper.getGrouperProvisioningGroup(); + + if (provisioningGroup != null) { + if (StringUtils.equals("id", field) && !StringUtils.isBlank(provisioningGroup.getId())) { + return provisioningGroup.getId(); + } + if (StringUtils.equals("idIndex", field) && provisioningGroup.getIdIndex() != null) { + return provisioningGroup.getIdIndex(); + } + if (StringUtils.equals("idIndexString", field) && provisioningGroup.getIdIndex() != null) { + return GrouperUtil.stringValue(provisioningGroup.getIdIndex()); + } + if (StringUtils.equals("displayExtension", field)) { + return GrouperUtil.stringValue(provisioningGroup.getDisplayExtension()); + } + if (StringUtils.equals("displayName", field)) { + return GrouperUtil.stringValue(provisioningGroup.getDisplayName()); + } + if (StringUtils.equals("extension", field) && !StringUtils.isBlank(provisioningGroup.getExtension())) { + return GrouperUtil.stringValue(provisioningGroup.getExtension()); + } + if (StringUtils.equals("name", field) && !StringUtils.isBlank(provisioningGroup.getName())) { + return GrouperUtil.stringValue(provisioningGroup.getName()); + } + if (StringUtils.equals("description", field)) { + return GrouperUtil.stringValue(provisioningGroup.retrieveAttributeValueString("description")); + } + } - if (StringUtils.equals("name", field)) { - return GrouperUtil.stringValue(provisioningGroup.getName()); + + GcGrouperSyncGroup gcGrouperSyncGroup = provisioningGroupWrapper.getGcGrouperSyncGroup(); + + if (gcGrouperSyncGroup != null) { + if (StringUtils.equals("id", field)) { + return gcGrouperSyncGroup.getGroupId(); + } + if (StringUtils.equals("idIndex", field)) { + return gcGrouperSyncGroup.getGroupIdIndex(); + } + if (StringUtils.equals("idIndexString", field)) { + return GrouperUtil.stringValue(gcGrouperSyncGroup.getGroupIdIndex()); + } + if (StringUtils.equals("extension", field)) { + return GrouperUtil.extensionFromName(gcGrouperSyncGroup.getGroupName()); + } + if (StringUtils.equals("name", field)) { + return gcGrouperSyncGroup.getGroupName(); + } + if (StringUtils.equals("groupAttributeValueCache0", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache0(); + } + if (StringUtils.equals("groupAttributeValueCache1", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache1(); + } + if (StringUtils.equals("groupAttributeValueCache2", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache2(); + } + if (StringUtils.equals("groupAttributeValueCache3", field)) { + return gcGrouperSyncGroup.getGroupAttributeValueCache3(); + } + } - if (StringUtils.equals("description", field)) { - return GrouperUtil.stringValue(provisioningGroup.retrieveAttributeValueString("description")); + + //if we couldnt find the data but the field was ok, its just null + if (StringUtils.equalsAny(field, "id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", + "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", + "name", "description")) { + return null; } + throw new RuntimeException("Not expecting grouperProvisioningGroupField: '" + field + "'"); + } private boolean translateGrouperToTargetAutomatically; diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntity.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntity.java index ba9b9071f9dc..9c2b58fdeed2 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntity.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningEntity.java @@ -15,6 +15,87 @@ */ public class ProvisioningEntity extends ProvisioningUpdatable { + /** + * + * @return subjectIdentifier0 + */ + public String getSubjectIdentifier0() { + return this.retrieveAttributeValueString("subjectIdentifier0"); + } + + /** + * + * @param subjectIdentifier0 + */ + public void setSubjectIdentifier0(String subjectIdentifier0) { + this.assignAttributeValue("subjectIdentifier0", subjectIdentifier0); + } + + /** + * + * @return subjectIdentifier1 + */ + public String getSubjectIdentifier1() { + return this.retrieveAttributeValueString("subjectIdentifier1"); + } + + /** + * + * @param subjectIdentifier1 + */ + public void setSubjectIdentifier1(String subjectIdentifier1) { + this.assignAttributeValue("subjectIdentifier1", subjectIdentifier1); + } + + /** + * + * @return subjectIdentifier2 + */ + public String getSubjectIdentifier2() { + return this.retrieveAttributeValueString("subjectIdentifier2"); + } + + /** + * + * @param subjectIdentifier2 + */ + public void setSubjectIdentifier2(String subjectIdentifier2) { + this.assignAttributeValue("subjectIdentifier2", subjectIdentifier2); + } + + + /** + * + * @return description + */ + public String getDescription() { + return this.retrieveAttributeValueString("description"); + } + + /** + * + * @param description + */ + public void setDescription(String description) { + this.assignAttributeValue("description", description); + } + + /** + * + * @return subject source id + */ + public String getSubjectSourceId() { + return this.retrieveAttributeValueString("subjectSourceId"); + } + + /** + * + * @param subjectSourceId + */ + public void setSubjectSourceId(String subjectSourceId) { + this.assignAttributeValue("subjectSourceId", subjectSourceId); + } + /** * * @return diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java b/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java index 326088ed9207..904b6a384b6d 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/util/GrouperUtil.java @@ -352,6 +352,8 @@ public static void main(String[] args) throws Exception { // // System.out.println(GrouperUtil.toStringForLog(listObjectArray)); + + } /** diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java index fc88d8d51643..d57138ffb0c3 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/ldapProvisioning/LdapProvisionerTestUtils.java @@ -23,8 +23,8 @@ public class LdapProvisionerTestUtils { public static void main(String args[]) throws Exception { GrouperSession.startRootSession(); - setupLdapExternalSystem(); - setupSubjectSource(); + stopAndRemoveLdapContainer(); + startLdapContainer(); } private static String dockerPath = null; diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java index 31dee3466d06..e3615983a54c 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTest.java @@ -126,7 +126,7 @@ public static void main(String[] args) { GrouperStartup.startup(); // testSimpleGroupLdapPa - TestRunner.run(new SqlProvisionerTest("testSimpleMembershipGroupNameSubjectId")); + TestRunner.run(new SqlProvisionerTest("testIncrementalSyncSqlProvisioner")); } diff --git a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java index 651924037d9d..ffc03a9f8aaa 100644 --- a/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java +++ b/grouper/src/test/edu/internet2/middleware/grouper/app/sqlProvisioning/SqlProvisionerTestUtils.java @@ -39,17 +39,14 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi if (!StringUtils.isBlank(provisioningTestConfigInput.getEntityDeleteType())) { configureProvisionerSuffix(provisioningTestConfigInput, "customizeEntityCrud", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "deleteEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, provisioningTestConfigInput.getEntityDeleteType(), "true"); } if (!StringUtils.isBlank(provisioningTestConfigInput.getGroupDeleteType())) { configureProvisionerSuffix(provisioningTestConfigInput, "customizeGroupCrud", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "deleteGroups", "true"); configureProvisionerSuffix(provisioningTestConfigInput, provisioningTestConfigInput.getGroupDeleteType(), "true"); } if (!StringUtils.isBlank(provisioningTestConfigInput.getMembershipDeleteType())) { configureProvisionerSuffix(provisioningTestConfigInput, "customizeMembershipCrud", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "deleteMemberships", "true"); configureProvisionerSuffix(provisioningTestConfigInput, provisioningTestConfigInput.getMembershipDeleteType(), "true"); } if (provisioningTestConfigInput.isEntityResolverGlobal()) { @@ -109,9 +106,11 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesAttributeNameColumn", "entity_attribute_name"); configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesAttributeValueColumn", "entity_attribute_value"); configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesEntityForeignKeyColumn", "entity_uuid"); + configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesTableName", "testgrouper_pro_dap_entity_attr"); + configureProvisionerSuffix(provisioningTestConfigInput, "entity2advanced", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesLastModifiedColumn", "last_modified"); configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesLastModifiedColumnType", "timestamp"); - configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributesTableName", "testgrouper_pro_dap_entity_attr"); + } // configureProvisionerSuffix(provisioningTestConfigInput, "showFailsafe", "true"); @@ -131,9 +130,10 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributesAttributeNameColumn", "attribute_name"); configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributesAttributeValueColumn", "attribute_value"); configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributesGroupForeignKeyColumn", "group_uuid"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributesTableName", "testgrouper_pro_ldap_group_attr"); + configureProvisionerSuffix(provisioningTestConfigInput, "group2advanced", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributesLastModifiedColumn", "last_modified"); configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributesLastModifiedColumnType", "timestamp"); - configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributesTableName", "testgrouper_pro_ldap_group_attr"); } if (!StringUtils.isBlank(provisioningTestConfigInput.getGroupTableIdColumn())) { configureProvisionerSuffix(provisioningTestConfigInput, "groupTableIdColumn", provisioningTestConfigInput.getGroupTableIdColumn()); @@ -183,18 +183,26 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.name", "dn"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateToMemberSyncField", "entityAttributeValueCache2"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "employeeID"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateFromGrouperProvisioningEntityField", "subjectId"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.searchAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.matchingId", "true"); + + configureProvisionerSuffix(provisioningTestConfigInput, "entityMatchingAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "entityMatchingAttribute0name", "employeeID"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.name", "entity_uuid"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.translateFromGrouperProvisioningEntityField", "id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.storageType", "entityTableColumn"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.storageType", "entityTableColumn"); + } @@ -203,32 +211,51 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "selectAllEntities", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.name", "uuid"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.storageType", "entityTableColumn"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.storageType", "entityTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateExpression", "${edu.internet2.middleware.grouper.internal.util.GrouperUuid.getUuid()}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.0.translateGrouperToMemberSyncField", "entityAttributeValueCache0"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.matchingId", "true"); + + configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributeValueCacheHas", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributeValueCache0has", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributeValueCache0source", "grouper"); + configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributeValueCache0type", "entityAttribute"); + configureProvisionerSuffix(provisioningTestConfigInput, "entityAttributeValueCache0entityAttribute", "uuid"); + + configureProvisionerSuffix(provisioningTestConfigInput, "entityMatchingAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "entityMatchingAttribute0name", "name"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.name", "name"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.searchAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.storageType", "entityTableColumn"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.storageType", "entityTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.1.translateFromGrouperProvisioningEntityField", "name"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.name", "subject_id_or_identifier"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.storageType", "entityTableColumn"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.storageType", "entityTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.2.translateFromGrouperProvisioningEntityField", "subjectId"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.3.name", "email"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.3.storageType", "entityTableColumn"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.3.storageType", "entityTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.3.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.3.translateFromGrouperProvisioningEntityField", "email"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.name", "description"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateExpressionType", "grouperProvisioningEntityField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.4.translateFromGrouperProvisioningEntityField", "description"); if (provisioningTestConfigInput.getEntityAttributeCount() == 6) { configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.5.name", "school"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.5.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isEntityAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.5.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.5.translateExpressionType", "translationScript"); configureProvisionerSuffix(provisioningTestConfigInput, "targetEntityAttribute.5.translateExpression", "${grouperProvisioningEntity.retrieveAttributeValueString('entityAttributeResolverLdap__givenname')}"); @@ -246,30 +273,41 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi } if (provisioningTestConfigInput.getGroupAttributeCount() == 1) { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "uuid"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "groupTableColumn"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.matchingId", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.searchAttribute", "true"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "groupTableColumn"); + } + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttribute0name", "uuid"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); } if (provisioningTestConfigInput.getGroupAttributeCount() == 3) { - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.matchingId", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttribute0name", "uuid"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "uuid"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.searchAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "groupTableColumn"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "groupTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.matchingId", "false"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.membershipAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.showAttributeValueSettings", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.multiValued", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "subjectId"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateFromMemberSyncField", "subjectId"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); + } + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMembershipAttributeName", "subjectId"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMembershipAttributeValue", "subjectId"); + + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.name", "groupName"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateFromGrouperProvisioningGroupField", "name"); @@ -278,25 +316,47 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi if (provisioningTestConfigInput.getGroupAttributeCount() == 4) { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "uuid"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "groupTableColumn"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "groupTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpression", "${edu.internet2.middleware.grouper.internal.util.GrouperUuid.getUuid()}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateGrouperToGroupSyncField", "groupAttributeValueCache0"); + + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCacheHas", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache0has", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache0source", "grouper"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache0type", "groupAttribute"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache0groupAttribute", "uuid"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "description"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateFromGrouperProvisioningGroupField", "description"); if (provisioningTestConfigInput.isPosixId()) { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.name", "name"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.searchAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "groupTableColumn"); + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttributeSameAsSearchAttribute", "false"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupSearchAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupSearchAttribute0name", "name"); + + + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "groupTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateFromGrouperProvisioningGroupField", "name"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.matchingId", "true"); + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttribute0name", "posix_id"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.name", "posix_id"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.storageType", "groupTableColumn"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.storageType", "groupTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.translateFromGrouperProvisioningGroupField", "idIndex"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.showAttributeValueSettings", "true"); @@ -304,51 +364,77 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi } else { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.name", "name"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.matchingId", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.searchAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "separateAttributesTable"); + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttribute0name", "name"); + + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateFromGrouperProvisioningGroupField", "name"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.membershipAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.showAttributeValueSettings", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.multiValued", "true"); + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMembershipAttributeName", "subjectId"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMembershipAttributeValue", "subjectId"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.name", "subjectId"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.storageType", "separateAttributesTable"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.translateFromMemberSyncField", "subjectId"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.storageType", "separateAttributesTable"); + } } } if (provisioningTestConfigInput.getGroupAttributeCount() == 6) { configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.name", "cn"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.0.translateFromGrouperProvisioningGroupField", "name"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.name", "dn"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateExpression", "${'cn=' + grouperProvisioningGroup.getName() + ',OU=Grouper,OU=365Groups,DC=one,DC=upenn,DC=edu'}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.1.translateGrouperToGroupSyncField", "groupAttributeValueCache2"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.matchingId", "true"); + + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCacheHas", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache2has", "true"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache2source", "grouper"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache2type", "groupAttribute"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupAttributeValueCache2entityAttribute", "dn"); + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttributeCount", "1"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMatchingAttribute0name", "gidNumber"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.name", "gidNumber"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.searchAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.2.translateFromGrouperProvisioningGroupField", "idIndex"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.showAttributeValueSettings", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.multiValued", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.name", "objectClass"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.storageType", "separateAttributesTable"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.storageType", "separateAttributesTable"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.translateExpression", "${grouperUtil.toSet('group')}"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.3.translateExpressionType", "translationScript"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.membershipAttribute", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.showAttributeValueSettings", "true"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.multiValued", "true"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.name", "member"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.storageType", "separateAttributesTable"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.translateFromMemberSyncField", "entityAttributeValueCache2"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.4.storageType", "separateAttributesTable"); + } + + configureProvisionerSuffix(provisioningTestConfigInput, "groupMembershipAttributeName", "member"); + configureProvisionerSuffix(provisioningTestConfigInput, "groupMembershipAttributeValue", "entityAttributeValueCache2"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.name", "uuid"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.storageType", "groupTableColumn"); + if (provisioningTestConfigInput.isGroupAttributesTable()) { + configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.storageType", "groupTableColumn"); + } configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.translateExpressionType", "grouperProvisioningGroupField"); configureProvisionerSuffix(provisioningTestConfigInput, "targetGroupAttribute.5.translateFromGrouperProvisioningGroupField", "name"); @@ -383,10 +469,10 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.translateExpressionType", "translationScript"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.name", "group_uuid"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateExpressionType", "groupSyncField"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateFromGroupSyncField", "groupAttributeValueCache0"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateFromGrouperProvisioningGroupField", "groupAttributeValueCache0"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.name", "entity_uuid"); configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.translateExpressionType", "memberSyncField"); - configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.translateFromMemberSyncField", "entityAttributeValueCache0"); + configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.2.translateFromGrouperProvisioningEntityField", "entityAttributeValueCache0"); } configureProvisionerSuffix(provisioningTestConfigInput, "logAllObjectsVerbose", "true"); @@ -414,11 +500,11 @@ public static void configureSqlProvisioner(SqlProvisionerTestConfigInput provisi } new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.class").value("edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningFullSyncJob").store(); - new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.quartzCron").value("0 0 4 * * 2099").store(); + new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.quartzCron").value("9 59 23 31 12 ? 2099").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("otherJob.sqlProvisionerFull.provisionerConfigId").value("sqlProvTest").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("changeLog.consumer.sqlProvisionerIncremental.class").value("edu.internet2.middleware.grouper.changeLog.esb.consumer.EsbConsumer").store(); - new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("changeLog.consumer.sqlProvisionerIncremental.quartzCron").value("0 0 5 * * 2099").store(); + new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("changeLog.consumer.sqlProvisionerIncremental.quartzCron").value("9 59 23 31 12 ? 2099").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("changeLog.consumer.sqlProvisionerIncremental.provisionerConfigId").value("sqlProvTest").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("changeLog.consumer.sqlProvisionerIncremental.publisher.class").value("edu.internet2.middleware.grouper.app.provisioning.ProvisioningConsumer").store(); new GrouperDbConfig().configFileName("grouper-loader.properties").propertyName("changeLog.consumer.sqlProvisionerIncremental.publisher.debug").value("true").store(); From b18cd8ee2a138d18ac2569955404255d45cfd246 Mon Sep 17 00:00:00 2001 From: Vivek Sachdeva Date: Thu, 26 May 2022 22:08:57 -0700 Subject: [PATCH 058/125] Randomize cron expression for provisioner daemons, scroll to the top going from start with screen, alphabetize list of grouper external systems, and show button label as Continue on start with screen --- .../UiV2ProvisionerConfiguration.java | 3 ++- .../provisionerConfigAdd.jsp | 27 ++++++++++++++----- .../grouper.textNg.en.us.base.properties | 2 ++ .../externalSystem/GrouperExternalSystem.java | 20 +++++++------- .../ProvisioningConfiguration.java | 9 +++++-- 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java index 411bb800d8d7..8738782d9a8e 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2ProvisionerConfiguration.java @@ -1099,6 +1099,8 @@ public void addProvisionerConfigurationSubmit(final HttpServletRequest request, guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#grouperMainContentDivId", "/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp")); + guiResponseJs.addAction(GuiScreenAction.newScript("guiScrollTop()")); + return; } @@ -1144,7 +1146,6 @@ public void addProvisionerConfigurationSubmit(final HttpServletRequest request, } messageBuilder.append(TextContainer.retrieveFromRequest().getText().get("provisionerConfigAddEditSuccess")); guiResponseJs.addAction(GuiScreenAction.newMessageAppend(GuiMessageType.success, messageBuilder.toString())); - } finally { diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp index dff694b145bf..e8b65bf26ac7 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/provisionerConfigs/provisionerConfigAdd.jsp @@ -44,7 +44,6 @@ - @@ -67,7 +66,6 @@ -
    + + + + + + ${textContainer.text['groupRemoveSelectedMembersButton'] } @@ -30,8 +35,8 @@ ${textContainer.text['groupViewDetailsHeaderMembership']}${textContainer.text['headerChooseAction']} ${textContainer.text['headerChooseAction']}
    ${guiPITMembershipView.getStartTimeLabel()} ${guiPITMembershipView.getEndTimeLabel()} + +
    <%@ include file="provisionerConfigAddHelper.jsp" %> @@ -79,17 +77,32 @@ - diff --git a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties index 865f37d6e8c5..7ebda67d2a13 100644 --- a/grouper/conf/grouperText/grouper.textNg.en.us.base.properties +++ b/grouper/conf/grouperText/grouper.textNg.en.us.base.properties @@ -11800,6 +11800,8 @@ miscellaneousProvisionerConfigEditBreadcrumb = Edit provisioner configuration # provisioner config add form submit button label provisionerConfigAddFormSubmitButton = Submit +provisionerConfigAddFormContinueButton = Continue + # provisioner config edit form submit button label provisionerConfigEditFormSubmitButton = Submit diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/externalSystem/GrouperExternalSystem.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/externalSystem/GrouperExternalSystem.java index e6b428b41b1f..291af820e3ae 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/externalSystem/GrouperExternalSystem.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/externalSystem/GrouperExternalSystem.java @@ -71,23 +71,23 @@ public String propertiesApiProperyValue(String attributeName) { public final static Set externalTypeClassNames = new LinkedHashSet(); static { + externalTypeClassNames.add("edu.internet2.middleware.grouperMessagingActiveMQ.ActiveMqGrouperExternalSystem"); externalTypeClassNames.add(AzureGrouperExternalSystem.class.getName()); - externalTypeClassNames.add(LdapGrouperExternalSystem.class.getName()); - externalTypeClassNames.add(GoogleGrouperExternalSystem.class.getName()); - externalTypeClassNames.add("edu.internet2.middleware.grouper.o365.Office365GrouperExternalSystem"); externalTypeClassNames.add("edu.internet2.middleware.grouperBox.BoxGrouperExternalSystem"); + externalTypeClassNames.add("edu.internet2.middleware.grouper.app.loader.db.DatabaseGrouperExternalSystem"); externalTypeClassNames.add("edu.internet2.middleware.grouperDuo.DuoGrouperExternalSystem"); - externalTypeClassNames.add("edu.internet2.middleware.grouperMessagingActiveMQ.ActiveMqGrouperExternalSystem"); - externalTypeClassNames.add("edu.internet2.middleware.grouperMessagingRabbitmq.RabbitMqGrouperExternalSystem"); - externalTypeClassNames.add("edu.internet2.middleware.grouperMessagingAWS.SqsGrouperExternalSystem"); - externalTypeClassNames.add("edu.internet2.middleware.grouper.app.file.SftpGrouperExternalSystem"); - externalTypeClassNames.add(SmtpGrouperExternalSystem.class.getName()); + externalTypeClassNames.add(GoogleGrouperExternalSystem.class.getName()); externalTypeClassNames.add(GrouperInternalMessagingExternalSystem.class.getName()); - externalTypeClassNames.add("edu.internet2.middleware.grouper.app.loader.db.DatabaseGrouperExternalSystem"); + externalTypeClassNames.add(LdapGrouperExternalSystem.class.getName()); + externalTypeClassNames.add("edu.internet2.middleware.grouper.o365.Office365GrouperExternalSystem"); + externalTypeClassNames.add(OidcGrouperExternalSystem.class.getName()); + externalTypeClassNames.add("edu.internet2.middleware.grouperMessagingRabbitmq.RabbitMqGrouperExternalSystem"); externalTypeClassNames.add("edu.internet2.middleware.grouper.app.remedy.RemedyGrouperExternalSystem"); externalTypeClassNames.add("edu.internet2.middleware.grouper.app.remedy.RemedyDigitalMarketplaceGrouperExternalSystem"); + externalTypeClassNames.add("edu.internet2.middleware.grouper.app.file.SftpGrouperExternalSystem"); + externalTypeClassNames.add(SmtpGrouperExternalSystem.class.getName()); + externalTypeClassNames.add("edu.internet2.middleware.grouperMessagingAWS.SqsGrouperExternalSystem"); externalTypeClassNames.add(WsBearerTokenExternalSystem.class.getName()); - externalTypeClassNames.add(OidcGrouperExternalSystem.class.getName()); } /** diff --git a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java index cb13d77f55d7..086d26af4318 100644 --- a/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java +++ b/grouper/src/grouper/edu/internet2/middleware/grouper/app/provisioning/ProvisioningConfiguration.java @@ -8,6 +8,7 @@ import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.RandomUtils; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; @@ -412,8 +413,12 @@ public void insertConfig(boolean fromUi, StringBuilder message, attributes.get("class").setValue("edu.internet2.middleware.grouper.app.provisioning.GrouperProvisioningFullSyncJob"); attributes.get("provisionerConfigId").setValue(this.getConfigId()); - //TODO what should be the cron expression - attributes.get("quartzCron").setValue("0 0 4 * * ?"); + int hour = RandomUtils.nextInt(3, 8); + int minute = RandomUtils.nextInt(0, 60); + + String cronExpression = "0 "+minute + " " + hour + " * * ?"; + + attributes.get("quartzCron").setValue(cronExpression); fullSyncConfig.insertConfig(true, message, errorsToDisplay, validationErrorsToDisplay, new ArrayList()); From 23a5ad09bd74ad27bbab16e25e8de62bfc3863b5 Mon Sep 17 00:00:00 2001 From: Shilen Patel Date: Fri, 27 May 2022 13:31:50 -0400 Subject: [PATCH 059/125] GRP-4049: Trace memberships audit data (commit 3) --- .../beans/ui/MembershipGuiContainer.java | 44 ++++++ .../serviceLogic/UiV2Membership.java | 135 ++++++++++-------- .../grouperUi2/membership/traceMembership.jsp | 47 +++++- .../grouper.textNg.en.us.base.properties | 3 + 4 files changed, 163 insertions(+), 66 deletions(-) diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java index 986ad998fc18..de78536f5aec 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/beans/ui/MembershipGuiContainer.java @@ -248,6 +248,50 @@ public boolean isTraceMembershipFromSubject() { public void setTraceMembershipFromSubject(boolean traceMembershipFromSubject1) { this.traceMembershipFromSubject = traceMembershipFromSubject1; } + + /** + * if should show user audit + */ + private boolean traceMembershipTimelineShowUserAudit = true; + + /** + * if should show pit audit + */ + private boolean traceMembershipTimelineShowPITAudit = true; + + /** + * if should show user audit + * @return traceMembershipTimelineShowUserAudit + */ + public boolean isTraceMembershipTimelineShowUserAudit() { + return traceMembershipTimelineShowUserAudit; + } + + /** + * if should show user audit + * @param traceMembershipTimelineShowUserAudit + */ + public void setTraceMembershipTimelineShowUserAudit( + boolean traceMembershipTimelineShowUserAudit) { + this.traceMembershipTimelineShowUserAudit = traceMembershipTimelineShowUserAudit; + } + + /** + * if should show pit audit + * @return traceMembershipTimelineShowPITAudit + */ + public boolean isTraceMembershipTimelineShowPITAudit() { + return traceMembershipTimelineShowPITAudit; + } + + /** + * if should show pit audit + * @param traceMembershipTimelineShowPITAudit + */ + public void setTraceMembershipTimelineShowPITAudit( + boolean traceMembershipTimelineShowPITAudit) { + this.traceMembershipTimelineShowPITAudit = traceMembershipTimelineShowPITAudit; + } /** * line number of trace starting with 0 diff --git a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java index 6bfa5d3a71e3..ac2e80823449 100644 --- a/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java +++ b/grouper-ui/java/src/edu/internet2/middleware/grouper/grouperUi/serviceLogic/UiV2Membership.java @@ -222,6 +222,9 @@ public void traceMembership(HttpServletRequest request, HttpServletResponse resp if (StringUtils.equalsIgnoreCase(request.getParameter("backTo"), "membership")) { membershipGuiContainer.setTraceMembershipFromMembership(true); } + + membershipGuiContainer.setTraceMembershipTimelineShowUserAudit(GrouperUtil.booleanValue(request.getParameter("showUserAudit"), true)); + membershipGuiContainer.setTraceMembershipTimelineShowPITAudit(GrouperUtil.booleanValue(request.getParameter("showPITAudit"), true)); //this is a subobject grouperRequestContainer.getGroupContainer().getGuiGroup().setShowBreadcrumbLink(true); @@ -246,7 +249,9 @@ public void traceMembership(HttpServletRequest request, HttpServletResponse resp traceMembershipsHelperFormer(pitGroup, pitMember, pitField, memberIdsForTimelineAuditQuery, pitGroupsForTimelineStates); } - traceMembershipsHelperTimeline(pitMember, pitField, memberIdsForTimelineAuditQuery, pitGroupsForTimelineStates); + if (GrouperUtil.booleanValue(request.getParameter("showTimeline"), false)) { + traceMembershipsHelperTimeline(pitMember, pitField, memberIdsForTimelineAuditQuery, pitGroupsForTimelineStates); + } } guiResponseJs.addAction(GuiScreenAction.newInnerHtmlFromJsp("#grouperMainContentDivId", @@ -410,6 +415,9 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx private void traceMembershipsHelperTimeline(PITMember pitMember, PITField pitField, Set memberIdsForTimelineAuditQuery, Set pitGroupsForTimelineStates) { + GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); + MembershipGuiContainer membershipGuiContainer = grouperRequestContainer.getMembershipGuiContainer(); + GrouperSession loggedInGrouperSession = GrouperSession.staticGrouperSession(); AuditType addGroupMembershipAuditType = AuditTypeFinder.find("membership", "addGroupMembership", true); @@ -465,7 +473,7 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx int count = 0; for (int i = 0; i < preliminaryMomentsOfInterestDescList.size(); i++) { - if (count > 50) { + if (count > 10) { break; } @@ -504,76 +512,80 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx Timestamp fromDate = new Timestamp(fromLong); Timestamp toDate = new Timestamp(toLong); - UserAuditQuery userAuditQuery = new UserAuditQuery(); - userAuditQuery.setQueryOptions(new QueryOptions().sortAsc("lastUpdatedDb")); - userAuditQuery.setFromDate(fromDate); - userAuditQuery.setToDate(toDate); - - List memberIdCriterions = new ArrayList(); - - for (AuditType auditType : GrouperUtil.toList(addGroupMembershipAuditType, updateGroupMembershipAuditType, deleteGroupMembershipAuditType)) { - Criterion auditTypeCriterion = Restrictions.eq(AuditEntry.FIELD_AUDIT_TYPE_ID, auditType.getId()); - String auditEntryField = auditType.retrieveAuditEntryFieldForLabel("memberId"); - Criterion auditEntryFieldCriterion = Restrictions.in(auditEntryField, memberIdsForTimelineAuditQuery); - Criterion andCriterion = HibUtils.listCrit(auditTypeCriterion, auditEntryFieldCriterion); - memberIdCriterions.add(andCriterion); - } - - userAuditQuery.setExtraCriterion(HibUtils.listCritOr(memberIdCriterions)); - - List userAuditEntries = userAuditQuery.execute(); - for (AuditEntry userAudit : userAuditEntries) { - - GuiAuditEntry guiUserAudit = new GuiAuditEntry(userAudit); - guiUserAudit.internal_setupMember(); - guiUserAudit.internal_setupGroup(); - - if (guiUserAudit.getGuiGroup().getGroup() == null) { - continue; - } + if (membershipGuiContainer.isTraceMembershipTimelineShowUserAudit()) { + UserAuditQuery userAuditQuery = new UserAuditQuery(); + userAuditQuery.setQueryOptions(new QueryOptions().sortAsc("lastUpdatedDb")); + userAuditQuery.setFromDate(fromDate); + userAuditQuery.setToDate(toDate); + + List memberIdCriterions = new ArrayList(); - if (!isWheelOrRoot && !guiUserAudit.getGuiGroup().getGroup().canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { - // no access so return - continue; + for (AuditType auditType : GrouperUtil.toList(addGroupMembershipAuditType, updateGroupMembershipAuditType, deleteGroupMembershipAuditType)) { + Criterion auditTypeCriterion = Restrictions.eq(AuditEntry.FIELD_AUDIT_TYPE_ID, auditType.getId()); + String auditEntryField = auditType.retrieveAuditEntryFieldForLabel("memberId"); + Criterion auditEntryFieldCriterion = Restrictions.in(auditEntryField, memberIdsForTimelineAuditQuery); + Criterion andCriterion = HibUtils.listCrit(auditTypeCriterion, auditEntryFieldCriterion); + memberIdCriterions.add(andCriterion); } - - eventsUserAudits.get(momentOfInterestTimestamp).add(guiUserAudit); - } - - Set pitMembershipsStarted = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITMemberAndPITFieldAndStartTimeRange(pitMember.getId(), pitField.getId(), fromDate, toDate); - for (PITMembershipView pitMembershipStarted : pitMembershipsStarted) { - PITGroup currentPITGroup = GrouperDAOFactory.getFactory().getPITGroup().findById(pitMembershipStarted.getOwnerGroupId(), true); - - if (!isWheelOrRoot) { - Group currentGroup = GrouperDAOFactory.getFactory().getGroup().findByUuid(currentPITGroup.getSourceId(), false); - - if (currentGroup == null || !currentGroup.canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { + userAuditQuery.setExtraCriterion(HibUtils.listCritOr(memberIdCriterions)); + + List userAuditEntries = userAuditQuery.execute(); + for (AuditEntry userAudit : userAuditEntries) { + + GuiAuditEntry guiUserAudit = new GuiAuditEntry(userAudit); + guiUserAudit.internal_setupMember(); + guiUserAudit.internal_setupGroup(); + + if (guiUserAudit.getGuiGroup().getGroup() == null) { + continue; + } + + if (!isWheelOrRoot && !guiUserAudit.getGuiGroup().getGroup().canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { // no access so return continue; } + + eventsUserAudits.get(momentOfInterestTimestamp).add(guiUserAudit); } - - eventsPITAddMembership.get(momentOfInterestTimestamp).add(pitMembershipStarted); - eventsPITAddMembershipGroup.get(momentOfInterestTimestamp).add(currentPITGroup); } - Set pitMembershipsEnded = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITMemberAndPITFieldAndEndTimeRange(pitMember.getId(), pitField.getId(), fromDate, toDate); - for (PITMembershipView pitMembershipEnded : pitMembershipsEnded) { - - PITGroup currentPITGroup = GrouperDAOFactory.getFactory().getPITGroup().findById(pitMembershipEnded.getOwnerGroupId(), true); - - if (!isWheelOrRoot) { - Group currentGroup = GrouperDAOFactory.getFactory().getGroup().findByUuid(currentPITGroup.getSourceId(), false); - - if (currentGroup == null || !currentGroup.canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { - // no access so return - continue; + if (membershipGuiContainer.isTraceMembershipTimelineShowPITAudit()) { + Set pitMembershipsStarted = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITMemberAndPITFieldAndStartTimeRange(pitMember.getId(), pitField.getId(), fromDate, toDate); + for (PITMembershipView pitMembershipStarted : pitMembershipsStarted) { + + PITGroup currentPITGroup = GrouperDAOFactory.getFactory().getPITGroup().findById(pitMembershipStarted.getOwnerGroupId(), true); + + if (!isWheelOrRoot) { + Group currentGroup = GrouperDAOFactory.getFactory().getGroup().findByUuid(currentPITGroup.getSourceId(), false); + + if (currentGroup == null || !currentGroup.canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { + // no access so return + continue; + } } + + eventsPITAddMembership.get(momentOfInterestTimestamp).add(pitMembershipStarted); + eventsPITAddMembershipGroup.get(momentOfInterestTimestamp).add(currentPITGroup); } - eventsPITDeleteMembership.get(momentOfInterestTimestamp).add(pitMembershipEnded); - eventsPITDeleteMembershipGroup.get(momentOfInterestTimestamp).add(currentPITGroup); + Set pitMembershipsEnded = GrouperDAOFactory.getFactory().getPITMembershipView().findAllByPITMemberAndPITFieldAndEndTimeRange(pitMember.getId(), pitField.getId(), fromDate, toDate); + for (PITMembershipView pitMembershipEnded : pitMembershipsEnded) { + + PITGroup currentPITGroup = GrouperDAOFactory.getFactory().getPITGroup().findById(pitMembershipEnded.getOwnerGroupId(), true); + + if (!isWheelOrRoot) { + Group currentGroup = GrouperDAOFactory.getFactory().getGroup().findByUuid(currentPITGroup.getSourceId(), false); + + if (currentGroup == null || !currentGroup.canHavePrivilege(loggedInGrouperSession.getSubject(), "read", false)) { + // no access so return + continue; + } + } + + eventsPITDeleteMembership.get(momentOfInterestTimestamp).add(pitMembershipEnded); + eventsPITDeleteMembershipGroup.get(momentOfInterestTimestamp).add(currentPITGroup); + } } for (PITGroup pitGroupForState : pitGroupsForTimelineStates) { @@ -595,9 +607,6 @@ public Object callback(GrouperSession theGrouperSession) throws GrouperSessionEx return; } - GrouperRequestContainer grouperRequestContainer = GrouperRequestContainer.retrieveFromRequestOrCreate(); - MembershipGuiContainer membershipGuiContainer = grouperRequestContainer.getMembershipGuiContainer(); - StringBuilder result = new StringBuilder(); result.append("
      \n"); diff --git a/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp b/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp index b6b099e88b8b..de7a707d54f2 100644 --- a/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp +++ b/grouper-ui/webapp/WEB-INF/grouperUi2/membership/traceMembership.jsp @@ -3,6 +3,15 @@ <%-- for the new group or new stem button --%> +
    - + + + + + + + + + + + + + +   ${textContainer.text['provisionerConfigAddFormCancelButton'] }