View Javadoc
1   package edu.internet2.middleware.grouper.app.provisioning;
2   
3   import java.lang.reflect.Array;
4   import java.util.ArrayList;
5   import java.util.Collection;
6   import java.util.HashMap;
7   import java.util.HashSet;
8   import java.util.LinkedHashMap;
9   import java.util.List;
10  import java.util.Map;
11  import java.util.Set;
12  import java.util.TreeMap;
13  import java.util.TreeSet;
14  
15  import org.apache.commons.lang.StringUtils;
16  
17  import edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig;
18  import edu.internet2.middleware.grouper.cfg.text.GrouperTextContainer;
19  import edu.internet2.middleware.grouper.util.GrouperUtil;
20  import edu.internet2.middleware.grouperClient.collections.MultiKey;
21  import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSync;
22  import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncDao;
23  import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncJob;
24  import edu.internet2.middleware.grouperClient.jdbc.tableSync.GcGrouperSyncLogState;
25  import edu.internet2.middleware.grouperClient.util.GrouperClientUtils;
26  import edu.internet2.middleware.subject.provider.SourceManager;
27  
28  /**
29   * 
30   * @author mchyzer
31   *
32   */
33  public abstract class GrouperProvisioningConfiguration {
34    
35    /**
36     * Number of messages (not change log) to process on each incremental run (in grouper_message table).  
37     * Note this cannot be larger than grouper.properties grouper.builtin.messaging.maxPageSize
38     */
39    private int numberOfMessagesToProcessEachIncremental = 5000;
40    
41  
42    /**
43     * Number of messages (not change log) to process on each incremental run (in grouper_message table).  
44     * Note this cannot be larger than grouper.properties grouper.builtin.messaging.maxPageSize
45     * @return
46     */
47    public int getNumberOfMessagesToProcessEachIncremental() {
48      return numberOfMessagesToProcessEachIncremental;
49    }
50  
51    /**
52     * Number of messages (not change log) to process on each incremental run (in grouper_message table).  
53     * Note this cannot be larger than grouper.properties grouper.builtin.messaging.maxPageSize
54     * @param numberOfMessagesToProcessEachIncremental
55     */
56    public void setNumberOfMessagesToProcessEachIncremental(
57        int numberOfMessagesToProcessEachIncremental) {
58      this.numberOfMessagesToProcessEachIncremental = numberOfMessagesToProcessEachIncremental;
59    }
60  
61    /**
62     * thread pool size
63     */
64    private int threadPoolSize = 5;
65  
66    /**
67     * log information about these subject ids (comma separated less than 10)
68     */
69    private Set<String> logAllObjectsVerboseForTheseSubjectIds = new HashSet<String>();
70    
71    /**
72     * log information about these subject ids (comma separated less than 10)
73     * @return
74     */
75    public Set<String> getLogAllObjectsVerboseForTheseSubjectIds() {
76      return logAllObjectsVerboseForTheseSubjectIds;
77    }
78  
79    /**
80     * log information about these group names (comma separated less than 10)
81     * @return
82     */
83    public Set<String> getLogAllObjectsVerboseForTheseGroupNames() {
84      return logAllObjectsVerboseForTheseGroupNames;
85    }
86  
87    /**
88     * if there are subject ids or group names then log certain objects
89     */
90    private boolean logCertainObjects;
91    
92    /**
93     * if there are subject ids or group names then log certain objects
94     * @return
95     */
96    public boolean isLogCertainObjects() {
97      return logCertainObjects;
98    }
99  
100   /**
101    * if there are subject ids or group names then log certain objects
102    * @param logCertainObjects
103    */
104   public void setLogCertainObjects(boolean logCertainObjects) {
105     this.logCertainObjects = logCertainObjects;
106   }
107 
108   /**
109    * log information about these groups are in these group attributes
110    */
111   private Set<String> logAllObjectsVerboseGroupAttributes = new HashSet<String>();
112 
113   /**
114    * log information about these entities are in these entity attributes
115    */
116   private Set<String> logAllObjectsVerboseEntityAttributes = new HashSet<String>();
117   
118   /**
119    * log information about these groups are in these group attributes
120    * @return
121    */
122   public Set<String> getLogAllObjectsVerboseGroupAttributes() {
123     return logAllObjectsVerboseGroupAttributes;
124   }
125 
126   /**
127    * log information about these entities are in these entity attributes
128    * @return
129    */
130   public Set<String> getLogAllObjectsVerboseEntityAttributes() {
131     return logAllObjectsVerboseEntityAttributes;
132   }
133 
134   /**
135    * log information about these group names (comma separated less than 10)
136    */
137   private Set<String> logAllObjectsVerboseForTheseGroupNames = new HashSet<String>();
138   
139   /**
140    * thread pool size
141    * @return thread pool size
142    */
143   public int getThreadPoolSize() {
144     return this.threadPoolSize;
145   }
146 
147   private boolean customizeEntityCrud;
148   
149   public boolean isCustomizeEntityCrud() {
150     return customizeEntityCrud;
151   }
152 
153   public void setCustomizeEntityCrud(boolean customizeEntityCrud) {
154     this.customizeEntityCrud = customizeEntityCrud;
155   }
156 
157   /**
158    * # If the full or incremental provisioner should have a ERROR if there is an error in a group / entity / membership
159    * # {valueType: "boolean", order: 130010, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
160    * # provisioner.genericProvisioner.errorHandlingProvisionerDaemonShouldFailOnObjectError =
161    */
162   private boolean errorHandlingProvisionerDaemonShouldFailOnObjectError = true;
163 
164   /**
165    * # If the full or incremental provisioner should have a ERROR if there is an error in a group / entity / membership
166    * # {valueType: "boolean", order: 130010, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
167    * # provisioner.genericProvisioner.errorHandlingProvisionerDaemonShouldFailOnObjectError =
168    * @return
169    */
170   public boolean isErrorHandlingProvisionerDaemonShouldFailOnObjectError() {
171     return errorHandlingProvisionerDaemonShouldFailOnObjectError;
172   }
173 
174   /**
175    * # If the full or incremental provisioner should have a ERROR if there is an error in a group / entity / membership
176    * # {valueType: "boolean", order: 130010, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
177    * # provisioner.genericProvisioner.errorHandlingProvisionerDaemonShouldFailOnObjectError =
178    * @param errorHandlingProvisionerDaemonShouldFailOnObjectError
179    */
180   public void setErrorHandlingProvisionerDaemonShouldFailOnObjectError(
181       boolean errorHandlingProvisionerDaemonShouldFailOnObjectError) {
182     this.errorHandlingProvisionerDaemonShouldFailOnObjectError = errorHandlingProvisionerDaemonShouldFailOnObjectError;
183   }
184 
185   /**
186    * Level 1 error handling percent.  This is the percent chance that the incremental will process errors.
187    */
188   private float errorHandlingPercentLevel1 = 1;
189   
190   /**
191    * Level 1 error handling minutes.  This is how many minutes in the past that error will be retried (+20 seconds).
192    */
193   private float errorHandlingMinutesLevel1 = 180;
194   
195   /**
196    * Level 2 error handling percent.  This is the percent chance that the incremental will process errors.  Note, this does not include the level 1, so it actually occurs level2% - level1% of the time.
197    */
198   private float errorHandlingPercentLevel2 = 5;
199 
200   /**
201    * Level 2 error handling minutes.  This is how many minutes in the past that error will be retried (+20 seconds).
202    */
203   private float errorHandlingMinutesLevel2 = 120;
204 
205   /**
206    * Level 3 error handling percent.  This is the percent chance that the incremental will process errors.  Note, this does not include the level 1+2, so it actually occurs level3% - level1+2% of the time.
207    */
208   private float errorHandlingPercentLevel3 = 10;
209 
210   /**
211    * Level 3 error handling minutes.  This is how many minutes in the past that error will be retried (+20 seconds).
212    */
213   private float errorHandlingMinutesLevel3 = 12;
214 
215   /**
216    * Level 4 error handling percent.  This is the percent chance that the incremental will process errors.  Note, this does not include the level 1+2+3, so it actually occurs level4% - level1+2+3% of the time.  If 100 then do this all the time.
217    */
218   private float errorHandlingPercentLevel4 = 100;
219 
220   /**
221    * Level 4 error handling minutes.  This is how many minutes in the past that error will be retried (+20 seconds).
222    */
223   private float errorHandlingMinutesLevel4 = 3;
224 
225   
226   public float getErrorHandlingPercentLevel1() {
227     return errorHandlingPercentLevel1;
228   }
229 
230   
231   public float getErrorHandlingMinutesLevel1() {
232     return errorHandlingMinutesLevel1;
233   }
234 
235   
236   public float getErrorHandlingPercentLevel2() {
237     return errorHandlingPercentLevel2;
238   }
239 
240   
241   public float getErrorHandlingMinutesLevel2() {
242     return errorHandlingMinutesLevel2;
243   }
244 
245   
246   public float getErrorHandlingPercentLevel3() {
247     return errorHandlingPercentLevel3;
248   }
249 
250   
251   public float getErrorHandlingMinutesLevel3() {
252     return errorHandlingMinutesLevel3;
253   }
254 
255   
256   public float getErrorHandlingPercentLevel4() {
257     return errorHandlingPercentLevel4;
258   }
259 
260   
261   public float getErrorHandlingMinutesLevel4() {
262     return errorHandlingMinutesLevel4;
263   }
264 
265   /**
266    * # Object errors will be logged, at least a handful of each type
267    * # {valueType: "boolean", order: 130020, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
268    * # provisioner.genericProvisioner.errorHandlingLogErrors =
269    */
270   private boolean errorHandlingLogErrors = true;
271 
272   /**
273    * # Object errors will be logged, at least a handful of each type
274    * # {valueType: "boolean", order: 130020, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
275    * # provisioner.genericProvisioner.errorHandlingLogErrors =
276    * @return
277    */
278   public boolean isErrorHandlingLogErrors() {
279     return errorHandlingLogErrors;
280   }
281 
282   /**
283    * # Object errors will be logged, at least a handful of each type
284    * # {valueType: "boolean", order: 130020, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
285    * # provisioner.genericProvisioner.errorHandlingLogErrors =
286    * @param errorHandlingLogErrors
287    */
288   public void setErrorHandlingLogErrors(boolean errorHandlingLogErrors) {
289     this.errorHandlingLogErrors = errorHandlingLogErrors;
290   }
291 
292   /**
293    * # Object errors will be logged, at least a handful of each type
294    * # {valueType: "integer", order: 130030, defaultValue: "5", subSection: "errorHandling", showEl: "${errorHandlingShow && errorHandlingLogErrors}"}
295    * # provisioner.genericProvisioner.errorHandlingLogCountPerType = 
296    */
297   private int errorHandlingLogCountPerType = 5;
298 
299   /**
300    * # Object errors will be logged, at least a handful of each type
301    * # {valueType: "integer", order: 130030, defaultValue: "5", subSection: "errorHandling", showEl: "${errorHandlingShow && errorHandlingLogErrors}"}
302    * # provisioner.genericProvisioner.errorHandlingLogCountPerType = 
303    * @return
304    */
305   public int getErrorHandlingLogCountPerType() {
306     return errorHandlingLogCountPerType;
307   }
308 
309   /**
310    * # Object errors will be logged, at least a handful of each type
311    * # {valueType: "integer", order: 130030, defaultValue: "5", subSection: "errorHandling", showEl: "${errorHandlingShow && errorHandlingLogErrors}"}
312    * # provisioner.genericProvisioner.errorHandlingLogCountPerType = 
313    * @param errorHandlingLogCountPerType1
314    */
315   public void setErrorHandlingLogCountPerType(int errorHandlingLogCountPerType1) {
316     this.errorHandlingLogCountPerType = errorHandlingLogCountPerType1;
317   }
318 
319   /**
320    * # If invalid data counts as an error.  Data is invalid if it is the wrong type or fails a validation
321    * # {valueType: "boolean", order: 130040, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
322    * # provisioner.genericProvisioner.errorHandlingInvalidDataIsAnError = 
323    */
324   private boolean errorHandlingInvalidDataIsAnError = true;
325 
326   /**
327    * # If invalid data counts as an error.  Data is invalid if it is the wrong type or fails a validation
328    * # {valueType: "boolean", order: 130040, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
329    * # provisioner.genericProvisioner.errorHandlingInvalidDataIsAnError = 
330    * @return
331    */
332   public boolean isErrorHandlingInvalidDataIsAnError() {
333     return errorHandlingInvalidDataIsAnError;
334   }
335 
336   /**
337    * # If invalid data counts as an error.  Data is invalid if it is the wrong type or fails a validation
338    * # {valueType: "boolean", order: 130040, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
339    * # provisioner.genericProvisioner.errorHandlingInvalidDataIsAnError = 
340    * @param errorHandlingInvalidDataIsAnError
341    */
342   public void setErrorHandlingInvalidDataIsAnError(boolean errorHandlingInvalidDataIsAnError) {
343     this.errorHandlingInvalidDataIsAnError = errorHandlingInvalidDataIsAnError;
344   }
345 
346   /**
347    * # If attribute length validation counts as an error.  This happens when there is a max length on an attribute and the data is too long
348    * # {valueType: "boolean", order: 130050, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
349    * # provisioner.genericProvisioner.errorHandlingLengthValidationIsAnError = 
350    */
351   private boolean errorHandlingLengthValidationIsAnError = true;
352 
353   /**
354    * # If attribute length validation counts as an error.  This happens when there is a max length on an attribute and the data is too long
355    * # {valueType: "boolean", order: 130050, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
356    * # provisioner.genericProvisioner.errorHandlingLengthValidationIsAnError = 
357    * @return
358    */
359   public boolean isErrorHandlingLengthValidationIsAnError() {
360     return errorHandlingLengthValidationIsAnError;
361   }
362 
363   /**
364    * # If attribute length validation counts as an error.  This happens when there is a max length on an attribute and the data is too long
365    * # {valueType: "boolean", order: 130050, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
366    * # provisioner.genericProvisioner.errorHandlingLengthValidationIsAnError = 
367    * @param errorHandlingLengthValidationIsAnError
368    */
369   public void setErrorHandlingLengthValidationIsAnError(boolean errorHandlingLengthValidationIsAnError) {
370     this.errorHandlingLengthValidationIsAnError = errorHandlingLengthValidationIsAnError;
371   }
372 
373   /**
374    * # If the grouper translated objects match to multiple target objects on the same attribute, then this problem happens
375    * # {valueType: "boolean", order: 130065, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
376    * # provisioner.genericProvisioner.errorHandlingMatchingValidationIsAnError = 
377    */
378   private boolean errorHandlingMatchingValidationIsAnError = true;
379 
380   /**
381    * # If the grouper translated objects match to multiple target objects on the same attribute, then this problem happens
382    * # {valueType: "boolean", order: 130065, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
383    * # provisioner.genericProvisioner.errorHandlingMatchingValidationIsAnError = 
384    * @return true if so
385    */
386   public boolean isErrorHandlingMatchingValidationIsAnError() {
387     return this.errorHandlingMatchingValidationIsAnError;
388   }
389 
390   /**
391    * # If the grouper translated objects match to multiple target objects on the same attribute, then this problem happens
392    * # {valueType: "boolean", order: 130065, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
393    * # provisioner.genericProvisioner.errorHandlingMatchingValidationIsAnError = 
394    * @param errorHandlingMatchingValidationIsAnError1
395    */
396   public void setErrorHandlingMatchingValidationIsAnError(boolean errorHandlingMatchingValidationIsAnError1) {
397     this.errorHandlingMatchingValidationIsAnError = errorHandlingMatchingValidationIsAnError1;
398   }
399 
400   /**
401    * # If required but missing attributes count as an error.  Attribute can be marked as required, if they are blank then this problem happens
402    * # {valueType: "boolean", order: 130060, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
403    * # provisioner.genericProvisioner.errorHandlingRequiredValidationIsAnError = 
404    */
405   private boolean errorHandlingRequiredValidationIsAnError = true;
406 
407   /**
408    * # If required but missing attributes count as an error.  Attribute can be marked as required, if they are blank then this problem happens
409    * # {valueType: "boolean", order: 130060, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
410    * # provisioner.genericProvisioner.errorHandlingRequiredValidationIsAnError = 
411    * @return
412    */
413   public boolean isErrorHandlingRequiredValidationIsAnError() {
414     return errorHandlingRequiredValidationIsAnError;
415   }
416   
417   /**
418    * # If required but missing attributes count as an error.  Attribute can be marked as required, if they are blank then this problem happens
419    * # {valueType: "boolean", order: 130060, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
420    * # provisioner.genericProvisioner.errorHandlingRequiredValidationIsAnError = 
421    * @param errorHandlingRequiredValidationIsAnError
422    */
423   public void setErrorHandlingRequiredValidationIsAnError(boolean errorHandlingRequiredValidationIsAnError) {
424     this.errorHandlingRequiredValidationIsAnError = errorHandlingRequiredValidationIsAnError;
425   }
426 
427   /**
428    * # If missing object in target counts as an error.  If the object is missing from the target and cannot be created this this problem happens
429    * # {valueType: "boolean", order: 130070, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
430    * # provisioner.genericProvisioner.errorHandlingTargetObjectDoesNotExistIsAnError = 
431    */
432   private boolean errorHandlingTargetObjectDoesNotExistIsAnError = true;
433 
434   /**
435    * # If missing object in target counts as an error.  If the object is missing from the target and cannot be created this this problem happens
436    * # {valueType: "boolean", order: 130070, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
437    * # provisioner.genericProvisioner.errorHandlingTargetObjectDoesNotExistIsAnError = 
438    * @return
439    */
440   public boolean isErrorHandlingTargetObjectDoesNotExistIsAnError() {
441     return errorHandlingTargetObjectDoesNotExistIsAnError;
442   }
443 
444   /**
445    * # If missing object in target counts as an error.  If the object is missing from the target and cannot be created this this problem happens
446    * # {valueType: "boolean", order: 130070, defaultValue: "true", subSection: "errorHandling", showEl: "${errorHandlingShow}"}
447    * # provisioner.genericProvisioner.errorHandlingTargetObjectDoesNotExistIsAnError = 
448    * @param errorHandlingTargetObjectDoesNotExistIsAnError
449    */
450   public void setErrorHandlingTargetObjectDoesNotExistIsAnError(boolean errorHandlingTargetObjectDoesNotExistIsAnError) {
451     this.errorHandlingTargetObjectDoesNotExistIsAnError = errorHandlingTargetObjectDoesNotExistIsAnError;
452   }
453 
454   
455   
456   private boolean makeChangesToEntities;
457   
458   
459 
460   public boolean isMakeChangesToEntities() {
461     return makeChangesToEntities;
462   }
463 
464   public void setMakeChangesToEntities(boolean makeChangesToEntities) {
465     this.makeChangesToEntities = makeChangesToEntities;
466   }
467 
468   private boolean customizeMembershipCrud;
469 
470   public boolean isCustomizeMembershipCrud() {
471     return customizeMembershipCrud;
472   }
473 
474 
475 
476   private String subjectIdentifierForMemberSyncTable;
477   
478   
479 
480 
481   public String getSubjectIdentifierForMemberSyncTable() {
482     return subjectIdentifierForMemberSyncTable;
483   }
484 
485   public void setCustomizeMembershipCrud(boolean customizeMembershipCrud) {
486     this.customizeMembershipCrud = customizeMembershipCrud;
487   }
488   
489   private boolean onlyAddMembershipsIfUserExistsInTarget;
490   
491   
492 
493   
494   public boolean isOnlyAddMembershipsIfUserExistsInTarget() {
495     return onlyAddMembershipsIfUserExistsInTarget;
496   }
497 
498   private boolean customizeGroupCrud;
499 
500   public boolean isCustomizeGroupCrud() {
501     return customizeGroupCrud;
502   }
503 
504 
505 
506 
507 
508 
509   public void setCustomizeGroupCrud(boolean customizeGroupCrud) {
510     this.customizeGroupCrud = customizeGroupCrud;
511   }
512 
513 
514   private boolean groupsRequireMembers;
515   
516   private boolean hasEntityAttributes;
517   
518   private boolean resolveAttributesWithSql;
519 
520   private boolean resolveAttributesWithLdap;
521 
522   private boolean useGlobalSqlResolver;
523   private boolean useGlobalLdapResolver;
524 
525   private String globalSqlResolver;
526 
527   private String globalLdapResolver;
528   
529   private boolean selectAllSqlOnFull = true;
530   private boolean filterAllLDAPOnFull = true;
531   
532   private boolean loadEntitiesToGrouperTable;
533 
534 
535   private String entityAttributesSqlExternalSystem;
536   private String entityAttributesTableViewName;
537   private String entityAttributesColumnNames;
538   private String entityAttributesSubjectSourceIdColumn;
539   private String entityAttributesSubjectSearchMatchingColumn;
540   private String entityAttributesSqlMappingType;
541   private String entityAttributesSqlMappingEntityAttribute;
542   private String entityAttributesSqlMappingExpression;
543   private String entityAttributesLastUpdatedColumn;
544   private String entityAttributesLastUpdatedType;
545   
546   private String entityAttributesLdapExternalSystem;
547   private String entityAttributesLdapBaseDn;
548   private String entityAttributesLdapSubjectSource;
549   private String entityAttributesLdapSearchScope;
550   private String entityAttributesLdapFilterPart;
551   private String entityAttributesLdapAttributes;
552   private String entityAttributesLdapMutliValuedAttributes;
553   private String entityAttributesLdapMatchingSearchAttribute;
554   private String entityAttributesLdapMappingType;
555   private String entityAttributesLdapMappingEntityAttribute;
556   private String entityAttributesLdapMatchingExpression;
557   private String entityAttributesLdapLastUpdatedAttribute;
558   private String entityAttributesLdapLastUpdatedAttributeFormat;
559   
560   private String searchAttributeNameToRetrieveEntities;
561   
562   
563   public String getSearchAttributeNameToRetrieveEntities() {
564     return searchAttributeNameToRetrieveEntities;
565   }
566 
567   
568   public void setSearchAttributeNameToRetrieveEntities(
569       String searchAttributeNameToRetrieveEntities) {
570     this.searchAttributeNameToRetrieveEntities = searchAttributeNameToRetrieveEntities;
571   }
572 
573   public boolean isFilterAllLDAPOnFull() {
574     return filterAllLDAPOnFull;
575   }
576 
577 
578 
579 
580 
581   
582   public String getEntityAttributesLdapExternalSystem() {
583     return entityAttributesLdapExternalSystem;
584   }
585 
586 
587 
588 
589 
590   
591   public String getEntityAttributesLdapBaseDn() {
592     return entityAttributesLdapBaseDn;
593   }
594 
595 
596 
597 
598 
599   
600   public String getEntityAttributesLdapSearchScope() {
601     return entityAttributesLdapSearchScope;
602   }
603 
604 
605 
606 
607 
608   
609   public String getEntityAttributesLdapFilterPart() {
610     return entityAttributesLdapFilterPart;
611   }
612 
613 
614 
615 
616 
617   
618   public String getEntityAttributesLdapAttributes() {
619     return entityAttributesLdapAttributes;
620   }
621 
622 
623 
624 
625 
626   
627   public String getEntityAttributesLdapMutliValuedAttributes() {
628     return entityAttributesLdapMutliValuedAttributes;
629   }
630 
631 
632 
633 
634 
635   
636   public String getEntityAttributesLdapMatchingSearchAttribute() {
637     return entityAttributesLdapMatchingSearchAttribute;
638   }
639 
640 
641 
642 
643 
644   
645   public String getEntityAttributesLdapMappingType() {
646     return entityAttributesLdapMappingType;
647   }
648 
649 
650 
651 
652 
653   
654   public String getEntityAttributesLdapMappingEntityAttribute() {
655     return entityAttributesLdapMappingEntityAttribute;
656   }
657 
658 
659 
660 
661 
662   
663   public String getEntityAttributesLdapMatchingExpression() {
664     return entityAttributesLdapMatchingExpression;
665   }
666 
667 
668 
669 
670 
671   
672   public String getEntityAttributesLdapLastUpdatedAttribute() {
673     return entityAttributesLdapLastUpdatedAttribute;
674   }
675 
676 
677 
678 
679 
680   
681   public String getEntityAttributesLdapLastUpdatedAttributeFormat() {
682     return entityAttributesLdapLastUpdatedAttributeFormat;
683   }
684 
685 
686 
687 
688 
689   public boolean isUseGlobalLdapResolver() {
690     return useGlobalLdapResolver;
691   }
692 
693 
694 
695 
696   
697   public String getGlobalLdapResolver() {
698     return globalLdapResolver;
699   }
700 
701 
702 
703 
704   public String getEntityAttributesSqlExternalSystem() {
705     return entityAttributesSqlExternalSystem;
706   }
707 
708 
709 
710   
711   public String getEntityAttributesTableViewName() {
712     return entityAttributesTableViewName;
713   }
714 
715 
716   
717   
718   public String getEntityAttributesColumnNames() {
719     return entityAttributesColumnNames;
720   }
721 
722 
723 
724 
725 
726   public String getEntityAttributesSubjectSourceIdColumn() {
727     return entityAttributesSubjectSourceIdColumn;
728   }
729 
730 
731 
732   
733   public String getEntityAttributesSubjectSearchMatchingColumn() {
734     return entityAttributesSubjectSearchMatchingColumn;
735   }
736 
737 
738 
739   
740   public String getEntityAttributesSqlMappingType() {
741     return entityAttributesSqlMappingType;
742   }
743 
744 
745 
746   
747   public String getEntityAttributesSqlMappingEntityAttribute() {
748     return entityAttributesSqlMappingEntityAttribute;
749   }
750 
751 
752 
753   
754   public String getEntityAttributesSqlMappingExpression() {
755     return entityAttributesSqlMappingExpression;
756   }
757 
758 
759 
760   
761   public String getEntityAttributesLastUpdatedColumn() {
762     return entityAttributesLastUpdatedColumn;
763   }
764 
765 
766 
767   
768   public String getEntityAttributesLastUpdatedType() {
769     return entityAttributesLastUpdatedType;
770   }
771 
772 
773 
774   public boolean isHasEntityAttributes() {
775     return hasEntityAttributes;
776   }
777 
778 
779   
780   public boolean isResolveAttributesWithSql() {
781     return resolveAttributesWithSql;
782   }
783 
784   
785   public boolean isResolveAttributesWithLdap() {
786     return resolveAttributesWithLdap;
787   }
788 
789   
790   public boolean isUseGlobalSqlResolver() {
791     return useGlobalSqlResolver;
792   }
793 
794   
795   
796   public String getGlobalSqlResolver() {
797     return globalSqlResolver;
798   }
799 
800   
801   
802   public boolean isSelectAllSqlOnFull() {
803     return selectAllSqlOnFull;
804   }
805   
806   
807   public boolean isLoadEntitiesToGrouperTable() {
808     return loadEntitiesToGrouperTable;
809   }
810 
811   /**
812    * group of users to exclude from provisioning
813    */
814   private String groupIdOfUsersNotToProvision;
815 
816   /**
817    * group of users to exclude from provisioning
818    * @return
819    */
820   public String getGroupIdOfUsersNotToProvision() {
821     return groupIdOfUsersNotToProvision;
822   }
823 
824   /**
825    * group of users to exclude from provisioning
826    * @param groupIdOfUsersNotToProvision
827    */
828   public void setGroupIdOfUsersNotToProvision(String groupIdOfUsersNotToProvision) {
829     this.groupIdOfUsersNotToProvision = groupIdOfUsersNotToProvision;
830   }
831 
832   /**
833    * if set then only provision users who are in this group
834    */
835   private String groupIdOfUsersToProvision;
836   
837   /**
838    * if set then only provision users who are in this group
839    * @return group id
840    */
841   public String getGroupIdOfUsersToProvision() {
842     return groupIdOfUsersToProvision;
843   }
844 
845   /**
846    * if create group in target during diagnostics
847    */
848   private Boolean createGroupDuringDiagnostics;
849 
850   /**
851    * if create group in target during diagnostics
852    * @return if create
853    */
854   public boolean isCreateGroupDuringDiagnostics() {
855     return GrouperUtil.booleanValue(createGroupDuringDiagnostics, false);
856   }
857   
858   /**
859    * if delete group from target during diagnostics
860    */
861   private Boolean deleteGroupDuringDiagnostics;
862 
863   /**
864    * if delete group from target during diagnostics
865    * @return if delete
866    */
867   public boolean isDeleteGroupDuringDiagnostics() {
868     return GrouperUtil.booleanValue(deleteGroupDuringDiagnostics, false);
869   }
870 
871   /**
872    * if create membership in target during diagnostics
873    */
874   private Boolean createMembershipDuringDiagnostics;
875 
876   /**
877    * if delete membership in target during diagnostics
878    */
879   private Boolean deleteMembershipDuringDiagnostics;
880 
881   public boolean isCreateMembershipDuringDiagnostics() {
882     return GrouperUtil.booleanValue(createMembershipDuringDiagnostics, false);
883   }
884 
885   public boolean isDeleteMembershipDuringDiagnostics() {
886     return GrouperUtil.booleanValue(deleteMembershipDuringDiagnostics, false);
887   }
888 
889   
890   public void setCreateMembershipDuringDiagnostics(
891       Boolean createMembershipDuringDiagnostics) {
892     this.createMembershipDuringDiagnostics = createMembershipDuringDiagnostics;
893   }
894 
895 
896   
897   public void setDeleteMembershipDuringDiagnostics(
898       Boolean deleteMembershipDuringDiagnostics) {
899     this.deleteMembershipDuringDiagnostics = deleteMembershipDuringDiagnostics;
900   }
901 
902   /**
903    * if create entity in target during diagnostics
904    */
905   private Boolean createEntityDuringDiagnostics;
906 
907   /**
908    * if create entity in target during diagnostics
909    * @return if create
910    */
911   public boolean isCreateEntityDuringDiagnostics() {
912     return GrouperUtil.booleanValue(createEntityDuringDiagnostics, false);
913   }
914   
915   /**
916    * if delete entity from target during diagnostics
917    */
918   private Boolean deleteEntityDuringDiagnostics;
919 
920   /**
921    * if delete entity from target during diagnostics
922    * @return if delete
923    */
924   public boolean isDeleteEntityDuringDiagnostics() {
925     return GrouperUtil.booleanValue(deleteEntityDuringDiagnostics, false);
926   }
927 
928   /**
929    * if select all groups during diagnostics (default false)
930    */
931   private Boolean diagnosticsGroupsAllSelect;
932 
933   /**
934    * if select all groups during diagnostics
935    * @return true if so
936    */
937   public boolean isDiagnosticsGroupsAllSelect() {
938     if (this.diagnosticsGroupsAllSelect != null) {
939       return this.diagnosticsGroupsAllSelect;
940     }
941     return false;
942   }
943   
944   /**
945    * if select all entities during diagnostics (default false)
946    */
947   private Boolean diagnosticsEntitiesAllSelect;
948 
949   /**
950    * if select all entities during diagnostics
951    * @return true if so
952    */
953   public boolean isDiagnosticsEntitiesAllSelect() {
954     if (this.diagnosticsEntitiesAllSelect != null) {
955       return this.diagnosticsEntitiesAllSelect;
956     }
957     return false;
958   }
959   
960   /**
961    * group name of group to use for diagnostics
962    */
963   private String diagnosticsGroupName;
964 
965   /**
966    * group name of group to use for diagnostics
967    * @return the group name
968    */
969   public String getDiagnosticsGroupName() {
970     return diagnosticsGroupName;
971   }
972   
973   /**
974    * subject id or identifier of entity to use for diagnostics
975    */
976   private String diagnosticsSubjectIdOrIdentifier;
977 
978   /**
979    * subject id or identifier of entity to use for diagnostics
980    * @return the subject id or identifier
981    */
982   public String getDiagnosticsSubjectIdOrIdentifier() {
983     return diagnosticsSubjectIdOrIdentifier;
984   }
985   
986   /**
987    * if select all memberships during diagnostics (default false)
988    */
989   private Boolean diagnosticsMembershipsAllSelect;
990 
991   /**
992    * if select all memberships during diagnostics
993    * @return true if so
994    */
995   public boolean isDiagnosticsMembershipsAllSelect() {
996     if (this.diagnosticsMembershipsAllSelect != null) {
997       return this.diagnosticsMembershipsAllSelect;
998     }
999     return false;
1000   }
1001   
1002   /**
1003    * Only provision policy groups
1004    */
1005   private Boolean onlyProvisionPolicyGroups;
1006   
1007   /**
1008    * Only provision policy groups, default false
1009    * @return 
1010    */
1011   public boolean isOnlyProvisionPolicyGroups() {
1012     if (this.onlyProvisionPolicyGroups != null) {
1013       return this.onlyProvisionPolicyGroups;
1014     }
1015     return false;
1016   }
1017   
1018   /**
1019    * If you want a metadata item on folders for specifying if provision only policy groups
1020    */
1021   private Boolean allowPolicyGroupOverride;
1022   
1023   /**
1024    * If you want a metadata item on folders for specifying if provision only policy groups
1025    * @return
1026    */
1027   public boolean isAllowPolicyGroupOverride() {
1028     if (this.allowPolicyGroupOverride != null) {
1029       return this.allowPolicyGroupOverride;
1030     }
1031     return true;
1032   }
1033   
1034   /**
1035    * If you want to filter for groups in a provisionable folder by a regex on its name, specify here.  If the regex matches then the group in the folder is provisionable.  e.g. folderExtension matches ^.*_someExtension   folderName matches ^.*_someExtension   groupExtension matches ^.*_someExtension   groupName matches ^.*_someExtension$
1036    */
1037   private String provisionableRegex;
1038 
1039   /**
1040    * If you want to filter for groups in a provisionable folder by a regex on its name, specify here.  If the regex matches then the group in the folder is provisionable.  e.g. folderExtension matches ^.*_someExtension   folderName matches ^.*_someExtension   groupExtension matches ^.*_someExtension   groupName matches ^.*_someExtension$
1041    * @return
1042    */
1043   public String getProvisionableRegex() {
1044     return this.provisionableRegex;
1045   }
1046   
1047   /**
1048    * If you want a metadata item on folders for specifying regex of names of objects to provision
1049    */
1050   private Boolean allowProvisionableRegexOverride;
1051   
1052   /**
1053    * If you want a metadata item on folders for specifying regex of names of objects to provision
1054    * @return
1055    */
1056   public boolean isAllowProvisionableRegexOverride() {
1057     if (this.allowProvisionableRegexOverride != null) {
1058       return this.allowProvisionableRegexOverride;
1059     }
1060     return true;
1061   }
1062   
1063   private boolean runLogicInIncrementalDaemon = true;
1064   
1065   private boolean runLogicInFullDaemon = true;
1066   
1067   private boolean logCompareCalculations = false;
1068   
1069   
1070   
1071   
1072   public boolean isLogCompareCalculations() {
1073     return logCompareCalculations;
1074   }
1075 
1076   
1077   public void setLogCompareCalculations(boolean logCompareCalculations) {
1078     this.logCompareCalculations = logCompareCalculations;
1079   }
1080 
1081   public boolean isRunLogicInIncrementalDaemon() {
1082     return runLogicInIncrementalDaemon;
1083   }
1084 
1085   
1086   public void setRunLogicInIncrementalDaemon(boolean runLogicInIncrementalDaemon) {
1087     this.runLogicInIncrementalDaemon = runLogicInIncrementalDaemon;
1088   }
1089 
1090   
1091   public boolean isRunLogicInFullDaemon() {
1092     return runLogicInFullDaemon;
1093   }
1094 
1095   
1096   public void setRunLogicInFullDaemon(boolean runLogicInFullDaemon) {
1097     this.runLogicInFullDaemon = runLogicInFullDaemon;
1098   }
1099 
1100   private boolean readOnly;
1101   
1102   
1103   public boolean isReadOnly() {
1104     return readOnly;
1105   }
1106 
1107   /** if the target should be checked before sending actions.  e.g. if an addMember is made to a provisionable group, then check the target to see if the entity is already a member first. */
1108   private boolean recalculateAllOperations;
1109 
1110   /**
1111    * attribute name to config
1112    */
1113   private Map<String, GrouperProvisioningConfigurationAttribute> targetGroupAttributeNameToConfig = new LinkedHashMap<String, GrouperProvisioningConfigurationAttribute>();
1114   
1115   /**
1116    * metadata name to metadata item
1117    */
1118   private Map<String, GrouperProvisioningObjectMetadataItem> metadataNameToMetadataItem = new TreeMap<String, GrouperProvisioningObjectMetadataItem>();
1119   
1120   /**
1121    * metadata name to metadata item
1122    * @return
1123    */
1124   public Map<String, GrouperProvisioningObjectMetadataItem> getMetadataNameToMetadataItem() {
1125     return metadataNameToMetadataItem;
1126   }
1127 
1128   /**
1129    * metadata name to metadata item
1130    * @param metadataNameToMetadataItem
1131    */
1132   public void setMetadataNameToMetadataItem(
1133       Map<String, GrouperProvisioningObjectMetadataItem> metadataNameToMetadataItem) {
1134     this.metadataNameToMetadataItem = metadataNameToMetadataItem;
1135   }
1136 
1137   /**
1138    * 
1139    * @return map
1140    */
1141   public Map<String, GrouperProvisioningConfigurationAttribute> getTargetGroupAttributeNameToConfig() {
1142     return targetGroupAttributeNameToConfig;
1143   }
1144 
1145   /**
1146    * expression to get the membership id from the target group
1147    */
1148   private String membershipMatchingIdExpression;
1149 
1150   public String getMembershipMatchingIdExpression() {
1151     return membershipMatchingIdExpression;
1152   }
1153 
1154 
1155   
1156   public void setMembershipMatchingIdExpression(String membershipMatchingIdExpression) {
1157     this.membershipMatchingIdExpression = membershipMatchingIdExpression;
1158   }
1159   
1160   
1161   private boolean unresolvableSubjectsInsert = false;
1162 
1163   public boolean isUnresolvableSubjectsInsert() {
1164     return unresolvableSubjectsInsert;
1165   }
1166 
1167   
1168   public void setUnresolvableSubjectsInsert(boolean unresolvableSubjectsInsert) {
1169     this.unresolvableSubjectsInsert = unresolvableSubjectsInsert;
1170   }
1171 
1172   private boolean unresolvableSubjectsRemove = false;
1173 
1174   public boolean isUnresolvableSubjectsRemove() {
1175     return unresolvableSubjectsRemove;
1176   }
1177 
1178   public void setUnresolvableSubjectsRemove(boolean unresolvableSubjectsRemove) {
1179     this.unresolvableSubjectsRemove = unresolvableSubjectsRemove;
1180   }
1181   
1182   private boolean removeAccentedChars;
1183   
1184   public boolean isRemoveAccentedChars() {
1185     return removeAccentedChars;
1186   }
1187 
1188   public void setRemoveAccentedChars(boolean removeAccentedChars) {
1189     this.removeAccentedChars = removeAccentedChars;
1190   }
1191 
1192   private boolean logCommandsAlways = false;
1193 
1194   
1195   
1196   
1197   public boolean isLogCommandsAlways() {
1198     return logCommandsAlways;
1199   }
1200 
1201   
1202   public void setLogCommandsAlways(boolean logCommandsAlways) {
1203     this.logCommandsAlways = logCommandsAlways;
1204   }
1205 
1206   private int logAllObjectsVerboseCount;
1207   
1208   public int getLogAllObjectsVerboseCount() {
1209     return logAllObjectsVerboseCount;
1210   }
1211 
1212   
1213   public void setLogAllObjectsVerboseCount(int logAllObjectsVerboseCount) {
1214     this.logAllObjectsVerboseCount = logAllObjectsVerboseCount;
1215   }
1216 
1217   private int logMaxErrorsPerType;
1218   
1219   public int getLogMaxErrorsPerType() {
1220     return logMaxErrorsPerType;
1221   }
1222 
1223   public void setLogMaxErrorsPerType(int logMaxErrorsPerType) {
1224     this.logMaxErrorsPerType = logMaxErrorsPerType;
1225   }
1226 
1227   public boolean isLogCommandsOnError() {
1228     return logCommandsOnError;
1229   }
1230 
1231   
1232   public void setLogCommandsOnError(boolean logCommandsOnError) {
1233     this.logCommandsOnError = logCommandsOnError;
1234   }
1235 
1236   private boolean logCommandsOnError = false;
1237   
1238   private boolean logAllObjectsVerbose = false;
1239   
1240   private boolean logAllObjectsVerboseToLogFile = false;
1241 
1242   private boolean logAllObjectsVerboseToDaemonDbLog = false;
1243   
1244   
1245   
1246   public boolean isLogAllObjectsVerboseToLogFile() {
1247     return logAllObjectsVerboseToLogFile;
1248   }
1249 
1250   public void setLogAllObjectsVerboseToLogFile(boolean logAllObjectsVerboseToLogFile) {
1251     this.logAllObjectsVerboseToLogFile = logAllObjectsVerboseToLogFile;
1252   }
1253 
1254   public boolean isLogAllObjectsVerboseToDaemonDbLog() {
1255     return logAllObjectsVerboseToDaemonDbLog;
1256   }
1257 
1258   public void setLogAllObjectsVerboseToDaemonDbLog(boolean logAllObjectsVerboseToDaemonDbLog) {
1259     this.logAllObjectsVerboseToDaemonDbLog = logAllObjectsVerboseToDaemonDbLog;
1260   }
1261 
1262   public boolean isLogAllObjectsVerbose() {
1263     return logAllObjectsVerbose;
1264   }
1265 
1266   
1267   public void setLogAllObjectsVerbose(boolean logAllObjectsVerbose) {
1268     this.logAllObjectsVerbose = logAllObjectsVerbose;
1269   }
1270 
1271   private boolean debugLog = false;
1272   
1273   
1274   
1275   
1276   public boolean isDebugLog() {
1277     return debugLog;
1278   }
1279 
1280 
1281 
1282   
1283   public void setDebugLog(boolean debugLog) {
1284     this.debugLog = debugLog;
1285   }
1286 
1287   /**
1288    * reference back up to the provisioner
1289    */
1290   private GrouperProvisioner grouperProvisioner = null;
1291 
1292   /**
1293    * reference back up to the provisioner
1294    * @return the provisioner
1295    */
1296   public GrouperProvisioner getGrouperProvisioner() {
1297     return this.grouperProvisioner;
1298   }
1299 
1300   /**
1301    * reference back up to the provisioner
1302    * @param grouperProvisioner1
1303    */
1304   public void setGrouperProvisioner(GrouperProvisioner grouperProvisioner1) {
1305     this.grouperProvisioner = grouperProvisioner1;
1306   }
1307 
1308   private String configId;
1309 
1310   public void setConfigId(String configId) {
1311     this.configId = configId;
1312   }
1313   public String getConfigId() {
1314     return configId;
1315   }
1316   
1317   /**
1318    * key is groupEntity or membership
1319    */
1320   private Map<String, List<String>> grouperProvisioningToTargetTranslation = new HashMap<String, List<String>>();
1321   
1322   
1323   public Map<String, List<String>> getGrouperProvisioningToTargetTranslation() {
1324     return grouperProvisioningToTargetTranslation;
1325   }
1326   
1327   /**
1328    * In incremental processing, each provisionable group/entity to sync memberships to sync counts as 10, each provisionable membership to sync counts as 1.  
1329    * If the total score is more than this number, it will convert the incrementals to a a full sync.  e.g. 10000 individual memberships 
1330    * to sync (and not more than 500 in a single group), or 1000 groups to sync, or a combination.  -1 means do not convert to full sync
1331    */
1332   private int scoreConvertToFullSyncThreshold;
1333   
1334   /**
1335    * In incremental processing, each provisionable group/entity to sync memberships to sync counts as 10, each provisionable membership to sync counts as 1.  
1336    * If the total score is more than this number, it will convert the incrementals to a a full sync.  e.g. 10000 individual memberships 
1337    * to sync (and not more than 500 in a single group), or 1000 groups to sync, or a combination.  -1 means do not convert to full sync
1338    * @return
1339    */
1340   public int getScoreConvertToFullSyncThreshold() {
1341     return scoreConvertToFullSyncThreshold;
1342   }
1343 
1344   /**
1345    * In incremental processing, each provisionable group/entity to sync memberships to sync counts as 10, each provisionable membership to sync counts as 1.  
1346    * If the total score is more than this number, it will convert the incrementals to a a full sync.  e.g. 10000 individual memberships 
1347    * to sync (and not more than 500 in a single group), or 1000 groups to sync, or a combination.  -1 means do not convert to full sync
1348    * @param scoreConvertToFullSyncThreshold1
1349    */
1350   public void setScoreConvertToFullSyncThreshold(int scoreConvertToFullSyncThreshold1) {
1351     this.scoreConvertToFullSyncThreshold = scoreConvertToFullSyncThreshold1;
1352   }
1353 
1354   /**
1355    * If there are this number of memberships or more for a single provisionable group, then perform a "group sync" instead of the individual operations instead, for efficiency
1356    * default to provisionerDefault.membershipsConvertToGroupSyncThreshold which is 500.
1357    * -1 to not use this feature
1358    */
1359   private int membershipsConvertToGroupSyncThreshold;
1360   
1361   /**
1362    * If there are this number of memberships or more for a single provisionable group, then perform a "group sync" instead of the individual operations instead, for efficiency
1363    * default to provisionerDefault.membershipsConvertToGroupSyncThreshold which is 500
1364    * -1 to not use this feature
1365    * @return threshold
1366    */
1367   public int getMembershipsConvertToGroupSyncThreshold() {
1368     return membershipsConvertToGroupSyncThreshold;
1369   }
1370 
1371   /**
1372    * If there are this number of memberships or more for a single provisionable group, then perform a "group sync" instead of the individual operations instead, for efficiency
1373    * default to provisionerDefault.membershipsConvertToGroupSyncThreshold which is 500
1374    * -1 to not use this feature
1375    * @param membershipsConvertToGroupSyncThreshold
1376    */
1377   public void setMembershipsConvertToGroupSyncThreshold(
1378       int membershipsConvertToGroupSyncThreshold) {
1379     this.membershipsConvertToGroupSyncThreshold = membershipsConvertToGroupSyncThreshold;
1380   }
1381 
1382   /**
1383    * get a config name for this or dependency
1384    * @param configName
1385    * @param required 
1386    * @return the config
1387    */
1388   public Boolean retrieveConfigBoolean(String configName, boolean required) {
1389     String configValueString = retrieveConfigString(configName, required);
1390     return GrouperClientUtils.booleanObjectValue(configValueString);
1391   }
1392 
1393   /**
1394    * get a config name for this or dependency
1395    * @param configName
1396    * @param required 
1397    * @return the config
1398    */
1399   public Double retrieveConfigDouble(String configName, boolean required) {
1400     String configValueString = retrieveConfigString(configName, required);
1401     return GrouperClientUtils.doubleObjectValue(configValueString);
1402   }
1403 
1404   /**
1405    * get a config name for this or dependency
1406    * @param configName
1407    * @param required 
1408    * @return the config
1409    */
1410   public Integer retrieveConfigInt(String configName, boolean required) {
1411     String configValueString = retrieveConfigString(configName, required);
1412     return GrouperClientUtils.intObjectValue(configValueString, true);
1413   }
1414 
1415   /**
1416    * get a config name for this or dependency
1417    * @param configSuffix
1418    * @param required 
1419    * @return the config
1420    */
1421   public String retrieveConfigString(String configSuffix, boolean required) {
1422     
1423     String value = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisioner." + this.getConfigId() + "." + configSuffix);
1424     if (!StringUtils.isBlank(value)) {
1425       return value;
1426     }
1427     value = GrouperLoaderConfig.retrieveConfig().propertyValueString("provisionerDefault." + configSuffix);
1428     if (!StringUtils.isBlank(value)) {
1429       return value;
1430     }
1431     if (required) {
1432       throw new RuntimeException("Cant find config for provisioning: provisioner." + this.getConfigId() + "." + configSuffix);
1433     }
1434     return null;
1435   
1436   }
1437 
1438   private Map<String, Object> debugMap = null;
1439 
1440   public void preConfigure() {
1441     // must have key
1442     if (StringUtils.isBlank(this.grouperProvisioner.getConfigId())) {
1443       throw new RuntimeException("Why is config id blank?");
1444     }
1445 
1446     // must have provisioning type
1447     if (this.getGrouperProvisioner().retrieveGrouperProvisioningBehavior().getGrouperProvisioningType() == null) {
1448       throw new RuntimeException("Why is provisioning type blank?");
1449     }
1450 
1451     this.setConfigId(this.grouperProvisioner.getConfigId());
1452 
1453     if (this.grouperProvisioner.getGcGrouperSync() == null) {
1454       this.grouperProvisioner.setGcGrouperSync(GcGrouperSyncDao.retrieveOrCreateByProvisionerName(null, this.getConfigId()));
1455     }
1456     
1457     if (StringUtils.isBlank(this.grouperProvisioner.getGcGrouperSync().getSyncEngine())) {
1458       this.grouperProvisioner.getGcGrouperSync().setSyncEngine(GcGrouperSync.PROVISIONING);
1459       this.grouperProvisioner.getGcGrouperSync().getGcGrouperSyncDao().store();
1460     }
1461     
1462     if (!GrouperClientUtils.equals(GcGrouperSync.PROVISIONING, this.grouperProvisioner.getGcGrouperSync().getSyncEngine())) {
1463       throw new RuntimeException("Why is sync engine not 'provisioning'?  " + this.getConfigId() + ", " + this.grouperProvisioner.getGcGrouperSync().getSyncEngine());
1464     }
1465 
1466     GcGrouperSyncJob gcGrouperSyncJob = this.grouperProvisioner.getGcGrouperSyncJob();
1467     if (gcGrouperSyncJob == null) {
1468       gcGrouperSyncJob = this.grouperProvisioner.getGcGrouperSync().getGcGrouperSyncJobDao()
1469           .jobRetrieveOrCreateBySyncType(this.getGrouperProvisioner().retrieveGrouperProvisioningBehavior().getGrouperProvisioningType().name());
1470       this.grouperProvisioner.setGcGrouperSyncJob(gcGrouperSyncJob);
1471     }
1472     if (GrouperLoaderConfig.retrieveConfig().propertyValueBoolean("provisioner." + this.getConfigId() + ".debugConfig", false)) {
1473       
1474       debugMap = this.grouperProvisioner.getDebugMap();
1475     } else {
1476       debugMap = new LinkedHashMap<String, Object>();
1477     }
1478   }
1479 
1480   /**
1481    * If groups need to be resolved in the target before provisioning
1482    */
1483   private boolean hasTargetGroupLink = false;
1484 
1485   /**
1486    * If users need to be resolved in the target before provisioning
1487    */
1488   private boolean hasTargetEntityLink = false;
1489 
1490   /**
1491    * subject sources to provision  optional, defaults to all except g:gsa, grouperExternal, g:isa, localEntities. comma separated list. checkboxes. 
1492    */
1493   private Set<String> subjectSourcesToProvision = null;
1494 
1495 
1496   /**
1497    * attributes to use when searching
1498    */
1499   private List<GrouperProvisioningConfigurationAttribute> entitySearchAttributes = null;
1500 
1501   /**
1502    * attributes to use when searching
1503    */
1504   private List<GrouperProvisioningConfigurationAttribute> groupSearchAttributes = null;
1505 
1506   /** 
1507    * attributes to use when selecting from target
1508    */
1509   private Set<String> groupSelectAttributes = null;
1510 
1511   /**
1512    * attributes to use when selecting from target
1513    * @return
1514    */
1515   public Set<String> getGroupSelectAttributes() {
1516     return groupSelectAttributes;
1517   }
1518 
1519   /**
1520    * attributes to use when selecting from target
1521    * @param groupSelectAttributes
1522    */
1523   public void setGroupSelectAttributes(Set<String> groupSelectAttributes) {
1524     this.groupSelectAttributes = groupSelectAttributes;
1525   }
1526 
1527   /**
1528    * attributes to use when selecting from target
1529    * @return
1530    */
1531   public Set<String> getEntitySelectAttributes() {
1532     return entitySelectAttributes;
1533   }
1534 
1535  /**
1536   * attributes to use when selecting from target
1537   * @param entitySelectAttributes
1538   */
1539  public void setEntitySelectAttributes(Set<String> entitySelectAttributes) {
1540    this.entitySelectAttributes = entitySelectAttributes;
1541  }
1542 
1543  /**
1544   * attributes to use when selecting from target
1545   */
1546  private Set<String> entitySelectAttributes = null;
1547 
1548   /**
1549    * attributes to use when matching
1550    */
1551   private List<GrouperProvisioningConfigurationAttribute> entityMatchingAttributes = null;
1552   
1553   public List<GrouperProvisioningConfigurationAttribute> getEntityMatchingAttributes() {
1554     return entityMatchingAttributes;
1555   }
1556 
1557   /**
1558    * attributes to use when searching
1559    */
1560   private List<GrouperProvisioningConfigurationAttribute> groupMatchingAttributes = null;
1561   
1562   public List<GrouperProvisioningConfigurationAttribute> getGroupMatchingAttributes() {
1563     return groupMatchingAttributes;
1564   }
1565 
1566   /**
1567    * someAttr  everything is assumed to be single valued except objectclass and the provisionedAttributeName optional
1568    */
1569   private Set<String> entityAttributesMultivalued = null;
1570   
1571   /**
1572    * someAttr  everything is assumed to be single valued except objectclass and the provisionedAttributeName optional
1573    */
1574   private Set<String> groupAttributesMultivalued = null;
1575 
1576   /**
1577    * if there are fewer than this many subjects to process, just resolve them
1578    */
1579   private int refreshSubjectLinkIfLessThanAmount;
1580   
1581   /**
1582    * if there are fewer than this many groups to process, just resolve them
1583    */
1584   private int refreshGroupLinkIfLessThanAmount;
1585   
1586   /**
1587    * if there are fewer than this many entities to process, just resolve them
1588    */
1589   private int refreshEntityLinkIfLessThanAmount;
1590   
1591   /**
1592    * if there are fewer than this many groups to process, just resolve them
1593    * @return
1594    */
1595   public int getRefreshGroupLinkIfLessThanAmount() {
1596     return refreshGroupLinkIfLessThanAmount;
1597   }
1598 
1599 
1600 
1601   /**
1602    * if there are fewer than this many groups to process, just resolve them
1603    * @param refreshGroupLinkIfLessThanAmount
1604    */
1605   public void setRefreshGroupLinkIfLessThanAmount(int refreshGroupLinkIfLessThanAmount) {
1606     this.refreshGroupLinkIfLessThanAmount = refreshGroupLinkIfLessThanAmount;
1607   }
1608 
1609 
1610 
1611   /**
1612    * if there are fewer than this many entities to process, just resolve them
1613    * @return
1614    */
1615   public int getRefreshEntityLinkIfLessThanAmount() {
1616     return refreshEntityLinkIfLessThanAmount;
1617   }
1618 
1619 
1620 
1621   /**
1622    * if there are fewer than this many entities to process, just resolve them
1623    * @param refreshEntityLinkIfLessThanAmount
1624    */
1625   public void setRefreshEntityLinkIfLessThanAmount(int refreshEntityLinkIfLessThanAmount) {
1626     this.refreshEntityLinkIfLessThanAmount = refreshEntityLinkIfLessThanAmount;
1627   }
1628 
1629 
1630 
1631   /**
1632    * if there are fewer than this many subjects to process, just resolve them
1633    * @return
1634    */
1635   public int getRefreshSubjectLinkIfLessThanAmount() {
1636     return refreshSubjectLinkIfLessThanAmount;
1637   }
1638 
1639   /**
1640    * if there are fewer than this many subjects to process, just resolve them
1641    * @param refreshSubjectLinkIfLessThanAmount
1642    */
1643   public void setRefreshSubjectLinkIfLessThanAmount(
1644       int refreshSubjectLinkIfLessThanAmount) {
1645     this.refreshSubjectLinkIfLessThanAmount = refreshSubjectLinkIfLessThanAmount;
1646   }
1647   
1648   /**
1649    * if entities should be inserted in target 
1650    */
1651   private boolean insertEntities = false;
1652 
1653   /**
1654    * if memberships should be replaced in target
1655    */
1656   private boolean replaceMemberships = false;
1657   
1658   /**
1659    * if memberships should be replaced in target
1660    * @return
1661    */
1662   public boolean isReplaceMemberships() {
1663     return replaceMemberships;
1664   }
1665   
1666   /**
1667    * if memberships should be replaced in target
1668    * @return
1669    */
1670   public void setReplaceMemberships(boolean replaceMemberships) {
1671     this.replaceMemberships = replaceMemberships;
1672   }
1673 
1674   /**
1675    * if memberships should be inserted in target
1676    * @return
1677    */
1678   public boolean isInsertMemberships() {
1679     return insertMemberships;
1680   }
1681 
1682   /**
1683    * if memberships should be inserted in target
1684    * @param insertMemberships
1685    */
1686   public void setInsertMemberships(boolean insertMemberships) {
1687     this.insertMemberships = insertMemberships;
1688   }
1689 
1690   /**
1691    * if memberships should be deleted in target
1692    * @return
1693    */
1694   public boolean isDeleteMemberships() {
1695     return deleteMemberships;
1696   }
1697 
1698   /**
1699    * if memberships should be deleted in target
1700    * @param deleteMemberships
1701    */
1702   public void setDeleteMemberships(boolean deleteMemberships) {
1703     this.deleteMemberships = deleteMemberships;
1704   }
1705 
1706   /**
1707    * update groups
1708    */
1709   private boolean updateGroups = true;
1710 
1711   /**
1712    * update entities
1713    */
1714   private boolean updateEntities = false;
1715 
1716   /**
1717    * update groups
1718    * @return
1719    */
1720   public boolean isUpdateGroups() {
1721     return updateGroups;
1722   }
1723 
1724   /**
1725    * update groups
1726    * @param updateGroups
1727    */
1728   public void setUpdateGroups(boolean updateGroups) {
1729     this.updateGroups = updateGroups;
1730   }
1731 
1732   /**
1733    * update entities
1734    * @return
1735    */
1736   public boolean isUpdateEntities() {
1737     return updateEntities;
1738   }
1739 
1740   /**
1741    * update entities
1742    * @param updateEntities
1743    */
1744   public void setUpdateEntities(boolean updateEntities) {
1745     this.updateEntities = updateEntities;
1746   }
1747 
1748   /**
1749    * delete groups
1750    */
1751   private boolean deleteGroups = true;
1752 
1753   /**
1754    * delete groups
1755    * @return
1756    */
1757   public boolean isDeleteGroups() {
1758     return deleteGroups;
1759   }
1760 
1761   /**
1762    * delete groups
1763    * @param deleteGroups
1764    */
1765   public void setDeleteGroups(boolean deleteGroups) {
1766     this.deleteGroups = deleteGroups;
1767   }
1768 
1769   /**
1770    * delete entities if grouper deleted them
1771    */
1772   private boolean deleteEntitiesIfGrouperDeleted = false;
1773 
1774   /**
1775    * delete entities if not exist in grouper
1776    */
1777   private boolean deleteEntitiesIfNotExistInGrouper = false;
1778   
1779   /**
1780    * delete entities
1781    */
1782   private boolean deleteEntities = false;
1783 
1784   /**
1785    * select entities
1786    */
1787   private boolean selectEntities = true;
1788   
1789   /**
1790    * should the provisioner select all entities from the target
1791    */
1792   private boolean selectAllEntities = true;
1793   
1794   /**
1795    * should the provisioner select all groups from the target
1796    */
1797   private boolean selectAllGroups = true;
1798   
1799   
1800   public boolean isSelectAllGroups() {
1801     return selectAllGroups;
1802   }
1803 
1804   public void setSelectAllGroups(boolean selectAllGroups) {
1805     this.selectAllGroups = selectAllGroups;
1806   }
1807 
1808   /**
1809    * delete entities if grouper deleted them
1810    * @return
1811    */
1812   public boolean isDeleteEntitiesIfGrouperDeleted() {
1813     return deleteEntitiesIfGrouperDeleted;
1814   }
1815 
1816   /**
1817    * delete entities if grouper deleted them
1818    * @param deleteEntitiesIfGrouperDeleted
1819    */
1820   public void setDeleteEntitiesIfGrouperDeleted(boolean deleteEntitiesIfGrouperDeleted) {
1821     this.deleteEntitiesIfGrouperDeleted = deleteEntitiesIfGrouperDeleted;
1822   }
1823 
1824   /**
1825    * delete entities if not exist in grouper
1826    * @return
1827    */
1828   public boolean isDeleteEntitiesIfNotExistInGrouper() {
1829     return deleteEntitiesIfNotExistInGrouper;
1830   }
1831 
1832   /**
1833    * delete entities if not exist in grouper
1834    * @param deleteEntitiesIfNotExistInGrouper
1835    */
1836   public void setDeleteEntitiesIfNotExistInGrouper(
1837       boolean deleteEntitiesIfNotExistInGrouper) {
1838     this.deleteEntitiesIfNotExistInGrouper = deleteEntitiesIfNotExistInGrouper;
1839   }
1840 
1841   /**
1842    * delete memberships if grouper deleted them
1843    * @return
1844    */
1845   public boolean isDeleteMembershipsIfGrouperDeleted() {
1846     return deleteMembershipsIfGrouperDeleted;
1847   }
1848 
1849   /**
1850    * delete memberships if grouper deleted them
1851    * @param deleteMembershipsIfGrouperDeleted
1852    */
1853   public void setDeleteMembershipsIfGrouperDeleted(
1854       boolean deleteMembershipsIfGrouperDeleted) {
1855     this.deleteMembershipsIfGrouperDeleted = deleteMembershipsIfGrouperDeleted;
1856   }
1857 
1858   /**
1859    * delete memberships if not exist in grouper
1860    * @return
1861    */
1862   public boolean isDeleteMembershipsIfNotExistInGrouper() {
1863     return deleteMembershipsIfNotExistInGrouper;
1864   }
1865 
1866   /**
1867    * delete memberships if not exist in grouper
1868    * @param deleteMembershipsIfNotExistInGrouper
1869    */
1870   public void setDeleteMembershipsIfNotExistInGrouper(
1871       boolean deleteMembershipsIfNotExistInGrouper) {
1872     this.deleteMembershipsIfNotExistInGrouper = deleteMembershipsIfNotExistInGrouper;
1873   }
1874   
1875   
1876   public boolean isDeleteValueIfManagedByGrouper() {
1877     return deleteValueIfManagedByGrouper;
1878   }
1879   
1880   public void setDeleteValueIfManagedByGrouper(boolean deleteValueIfManagedByGrouper) {
1881     this.deleteValueIfManagedByGrouper = deleteValueIfManagedByGrouper;
1882   }
1883 
1884   public boolean isDeleteMembershipsOnlyInTrackedGroups() {
1885     return deleteMembershipsOnlyInTrackedGroups;
1886   }
1887 
1888   
1889   public void setDeleteMembershipsOnlyInTrackedGroups(
1890       boolean deleteMembershipsOnlyInTrackedGroups) {
1891     this.deleteMembershipsOnlyInTrackedGroups = deleteMembershipsOnlyInTrackedGroups;
1892   }
1893 
1894   /**
1895    * delete entities
1896    * @return
1897    */
1898   public boolean isDeleteEntities() {
1899     return deleteEntities;
1900   }
1901 
1902   /**
1903    * delete entities
1904    * @param deleteEntities
1905    */
1906   public void setDeleteEntities(boolean deleteEntities) {
1907     this.deleteEntities = deleteEntities;
1908   }
1909 
1910   /**
1911    * select entities
1912    * @return
1913    */
1914   public boolean isSelectEntities() {
1915     return selectEntities;
1916   }
1917 
1918   /**
1919    * select entities
1920    * @param selectEntities
1921    */
1922   public void setSelectEntities(boolean selectEntities) {
1923     this.selectEntities = selectEntities;
1924   }
1925   
1926   /**
1927    * should the provisioner select all entities from the target
1928    * @return
1929    */
1930   public boolean isSelectAllEntities() {
1931     return selectAllEntities;
1932   }
1933 
1934   /**
1935    * should the provisioner select all entities from the target
1936    * @param selectAllEntities
1937    */
1938   public void setSelectAllEntities(boolean selectAllEntities) {
1939     this.selectAllEntities = selectAllEntities;
1940   }
1941 
1942   /**
1943    * select memberships
1944    * @return
1945    */
1946   public boolean isSelectMemberships() {
1947     return selectMemberships;
1948   }
1949 
1950   /**
1951    * select memberships
1952    * @param selectMemberships
1953    */
1954   public void setSelectMemberships(boolean selectMemberships) {
1955     this.selectMemberships = selectMemberships;
1956   }
1957 
1958   /**
1959    * if memberships should be inserted in target
1960    */
1961   private boolean insertMemberships = true;
1962 
1963   
1964   /**
1965    * if memberships should be deleted in target
1966    */
1967   private boolean deleteMemberships = true;
1968 
1969   /**
1970    * 
1971    */
1972   private boolean deleteMembershipsIfGrouperCreated = true;
1973   
1974   /**
1975    * delete memberships if grouper deleted them
1976    */
1977   private boolean deleteMembershipsIfGrouperDeleted = false;
1978 
1979   /**
1980    * delete memberships if not exist in grouper
1981    */
1982   private boolean deleteMembershipsIfNotExistInGrouper = false;
1983   
1984   /**
1985    * delete value if managed by grouper
1986    */
1987   private boolean deleteValueIfManagedByGrouper = false;
1988   
1989   /**
1990    * delete memberships for unprovisionable users  
1991    */
1992   private boolean deleteMembershipsForUnprovisionableUsers = false;
1993   
1994   /**
1995    * delete memberships only in tracked groups
1996    */
1997   private boolean deleteMembershipsOnlyInTrackedGroups = true;
1998 
1999   /**
2000    * select memberships
2001    */
2002   private boolean selectMemberships = true;
2003 
2004 
2005   /**
2006    * if groups should be inserted in target
2007    */
2008   private boolean insertGroups = true;
2009   
2010   /**
2011    * if groups should be selected from target
2012    */
2013   private boolean selectGroups = true;
2014   
2015   /**
2016    * if groups should be selected from target
2017    * @return
2018    */
2019   public boolean isSelectGroups() {
2020     return selectGroups;
2021   }
2022 
2023   /**
2024    * if groups should be selected from target
2025    * @param selectGroups
2026    */
2027   public void setSelectGroups(boolean selectGroups) {
2028     this.selectGroups = selectGroups;
2029   }
2030 
2031   private String entitySearchAllFilter;
2032 
2033   /**
2034    * search filter to look up all entities
2035    * @return
2036    */
2037   public String getEntitySearchAllFilter() {
2038     return entitySearchAllFilter;
2039   }
2040 
2041   /**
2042    * search filter to look up all entities
2043    * @param userSearchAllFilter
2044    */
2045   public void setEntitySearchAllFilter(String userSearchAllFilter) {
2046     this.entitySearchAllFilter = userSearchAllFilter;
2047   }
2048   
2049   protected Class<? extends GrouperProvisioningConfigurationAttribute> grouperProvisioningConfigurationAttributeClass() {
2050     return GrouperProvisioningConfigurationAttribute.class;
2051   }  
2052   
2053   
2054   @Override
2055   public String toString() {
2056     
2057     StringBuilder result = new StringBuilder();
2058     
2059     GrouperProvisioningConfiguration provisionerConfiguration = this.grouperProvisioner.retrieveGrouperProvisioningConfiguration();
2060     Set<String> fieldNames = GrouperUtil.fieldNames(provisionerConfiguration.getClass(), 
2061         GrouperProvisioningConfiguration.class, null, true, false, false);
2062     
2063     // assume configurations cache stuff in fields.  We can make this more flexible / customizable at some point
2064     fieldNames.remove("configId");
2065     fieldNames.remove("debugLog");
2066     fieldNames.remove("debugMap");
2067     fieldNames.remove("grouperProvisioner");
2068     fieldNames.remove("targetEntityAttributeNameToConfig");
2069     fieldNames.remove("targetEntityFieldNameToConfig");
2070     fieldNames.remove("targetGroupAttributeNameToConfig");
2071     fieldNames.remove("targetGroupFieldNameToConfig");
2072     fieldNames.remove("targetMembershipAttributeNameToConfig");
2073     fieldNames.remove("targetMembershipFieldNameToConfig");
2074     fieldNames.remove("grouperProvisioningToTargetTranslation");
2075     fieldNames.remove("metadataNameToMetadataItem");
2076     fieldNames.remove("entityMatchingAttributes");
2077     fieldNames.remove("groupMatchingAttributes");
2078     fieldNames.remove("entitySearchAttributes");
2079     fieldNames.remove("groupSearchAttributes");
2080     fieldNames.remove("searchedForEmailCache");
2081     fieldNames.remove("searchedForIdCache");
2082     
2083     fieldNames = new TreeSet<String>(fieldNames);
2084     boolean firstField = true;
2085     for (String fieldName : fieldNames) {
2086       
2087       Object value = GrouperUtil.propertyValue(provisionerConfiguration, fieldName);
2088       if (!GrouperUtil.isBlank(value)) {
2089         
2090         if ((value instanceof Collection) && ((Collection)value).size() == 0) {
2091           continue;
2092         }
2093         if ((value instanceof Map) && ((Map)value).size() == 0) {
2094           continue;
2095         }
2096         if ((value.getClass().isArray()) && Array.getLength(value) == 0) {
2097           continue;
2098         }
2099         if (!firstField) {
2100           result.append(", ");
2101         }
2102         firstField = false;
2103         result.append(fieldName).append(" = '").append(GrouperUtil.toStringForLog(value, false)).append("'");
2104       }
2105     }
2106     if (GrouperUtil.length(this.groupMatchingAttributes) > 0) {
2107       result.append(", groupMatchingAttributes: ");
2108       boolean first = true;
2109       for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.groupMatchingAttributes) {
2110         if (!first) {
2111           result.append(", ");
2112         }
2113         first = false;
2114         result.append(grouperProvisioningConfigurationAttribute.getName());
2115       }
2116     }
2117     if (GrouperUtil.length(this.groupSearchAttributes) > 0) {
2118       result.append(", groupSearchAttributes: ");
2119       boolean first = true;
2120       for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.groupSearchAttributes) {
2121         if (!first) {
2122           result.append(", ");
2123         }
2124         first = false;
2125         result.append(grouperProvisioningConfigurationAttribute.getName());
2126       }
2127     }
2128     if (GrouperUtil.length(this.entityMatchingAttributes) > 0) {
2129       result.append(", entityMatchingAttributes: ");
2130       boolean first = true;
2131       for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.entityMatchingAttributes) {
2132         if (!first) {
2133           result.append(", ");
2134         }
2135         first = false;
2136         result.append(grouperProvisioningConfigurationAttribute.getName());
2137       }
2138     }
2139     if (GrouperUtil.length(this.entitySearchAttributes) > 0) {
2140       result.append(", entitySearchAttributes: ");
2141       boolean first = true;
2142       for (GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute : this.entitySearchAttributes) {
2143         if (!first) {
2144           result.append(", ");
2145         }
2146         first = false;
2147         result.append(grouperProvisioningConfigurationAttribute.getName());
2148       }
2149     }
2150     for (String key : new TreeSet<String>(this.metadataNameToMetadataItem.keySet())) {
2151       if (result.charAt(result.length()-1) != '\n') {
2152         result.append("\n");
2153       }
2154       GrouperProvisioningObjectMetadataItem grouperProvisioningObjectMetadataItem = this.metadataNameToMetadataItem.get(key);
2155       result.append(" - metadata item: " + key + ": " + grouperProvisioningObjectMetadataItem.toString());
2156     }
2157     for (String key : new TreeSet<String>(this.grouperProvisioningToTargetTranslation.keySet())) {
2158       List<String> translations = this.grouperProvisioningToTargetTranslation.get(key);
2159       for (int i=0;i<translations.size();i++) {
2160         if (result.charAt(result.length()-1) != '\n') {
2161           result.append("\n");
2162         }
2163         result.append(" - grouperProvisioningToTargetTranslation").append(key).append(".").append(i).append(".script = '").append(translations.get(i)).append("'");
2164       }
2165     }
2166     for (String key : new TreeSet<String>(this.targetGroupAttributeNameToConfig.keySet())) {
2167       if (result.charAt(result.length()-1) != '\n') {
2168         result.append("\n");
2169       }
2170       GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = this.targetGroupAttributeNameToConfig.get(key);
2171       result.append(" - target group attribute config: " + key + ": " + grouperProvisioningConfigurationAttribute.toString());
2172     }
2173     for (String key : new TreeSet<String>(this.targetEntityAttributeNameToConfig.keySet())) {
2174       if (result.charAt(result.length()-1) != '\n') {
2175         result.append("\n");
2176       }
2177       GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = this.targetEntityAttributeNameToConfig.get(key);
2178       result.append(" - target entity attribute config: " + key + ": " + grouperProvisioningConfigurationAttribute.toString());
2179     }
2180     for (String key : new TreeSet<String>(this.targetMembershipAttributeNameToConfig.keySet())) {
2181       if (result.charAt(result.length()-1) != '\n') {
2182         result.append("\n");
2183       }
2184       GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = this.targetMembershipAttributeNameToConfig.get(key);
2185       result.append(" - target membership attribute config: " + key + ": " + grouperProvisioningConfigurationAttribute.toString());
2186     }
2187     
2188     return result.toString();
2189   }
2190 
2191   /**
2192    * search filter to look up group if cannot just use the matchingId
2193    */
2194   private String groupSearchFilter = null;
2195   
2196   
2197   
2198   /**
2199    * search filter to look up group if cannot just use the matchingId
2200    * @return
2201    */
2202   public String getGroupSearchFilter() {
2203     return groupSearchFilter;
2204   }
2205 
2206 
2207 
2208   /**
2209    * search filter to look up group if cannot just use the matchingId
2210    * @param groupSearchFilter
2211    */
2212   public void setGroupSearchFilter(String groupSearchFilter) {
2213     this.groupSearchFilter = groupSearchFilter;
2214   }
2215   
2216   private String groupSearchAllFilter;
2217 
2218   /**
2219    * search filter to look up all groups
2220    * @return
2221    */
2222   public String getGroupSearchAllFilter() {
2223     return groupSearchAllFilter;
2224   }
2225 
2226   /**
2227    * search filter to look up all groups
2228    * @param groupSearchAllFilter
2229    */
2230   public void setGroupSearchAllFilter(String groupSearchAllFilter) {
2231     this.groupSearchAllFilter = groupSearchAllFilter;
2232   }
2233   
2234   /**
2235    * 
2236    */
2237   private boolean deleteEntitiesIfGrouperCreated = false;
2238   
2239   /**
2240    * 
2241    */
2242   private boolean deleteGroupsIfGrouperCreated = true;
2243 
2244   private boolean deleteGroupsIfUnmarkedProvisionable = true;
2245 
2246   private boolean deleteMembershipsIfGroupUnmarkedProvisionable = true;
2247 
2248   /**
2249    * 
2250    * @return
2251    */
2252   public boolean isDeleteEntitiesIfGrouperCreated() {
2253     return deleteEntitiesIfGrouperCreated;
2254   }
2255 
2256   /**
2257    * 
2258    * @param deleteEntitiesIfGrouperCreated
2259    */
2260   public void setDeleteEntitiesIfGrouperCreated(boolean deleteEntitiesIfGrouperCreated) {
2261     this.deleteEntitiesIfGrouperCreated = deleteEntitiesIfGrouperCreated;
2262   }
2263 
2264   /**
2265    * 
2266    * @return
2267    */
2268   public boolean isDeleteGroupsIfGrouperCreated() {
2269     return deleteGroupsIfGrouperCreated;
2270   }
2271 
2272   
2273   public void setDeleteGroupsIfGrouperCreated(boolean deleteGroupsIfGrouperCreated) {
2274     this.deleteGroupsIfGrouperCreated = deleteGroupsIfGrouperCreated;
2275   }
2276   
2277   
2278   public boolean isDeleteGroupsIfUnmarkedProvisionable() {
2279     return deleteGroupsIfUnmarkedProvisionable;
2280   }
2281   
2282   public void setDeleteGroupsIfUnmarkedProvisionable(
2283       boolean deleteGroupsIfUnmarkedProvisionable) {
2284     this.deleteGroupsIfUnmarkedProvisionable = deleteGroupsIfUnmarkedProvisionable;
2285   }
2286   
2287   public boolean isDeleteMembershipsIfGroupUnmarkedProvisionable() {
2288     return deleteMembershipsIfGroupUnmarkedProvisionable;
2289   }
2290   
2291   public void setDeleteMembershipsIfGroupUnmarkedProvisionable(
2292       boolean deleteMembershipsIfGroupUnmarkedProvisionable) {
2293     this.deleteMembershipsIfGroupUnmarkedProvisionable = deleteMembershipsIfGroupUnmarkedProvisionable;
2294   }
2295 
2296   public boolean isDeleteMembershipsIfGrouperCreated() {
2297     return deleteMembershipsIfGrouperCreated;
2298   }
2299 
2300   
2301   public void setDeleteMembershipsIfGrouperCreated(
2302       boolean deleteMembershipsIfGrouperCreated) {
2303     this.deleteMembershipsIfGrouperCreated = deleteMembershipsIfGrouperCreated;
2304   }
2305 
2306   /**
2307    * true or false if groups in full sync should be deleted if in group all filter and not in grouper
2308    * or for attributes delete other attribute not provisioned by grouper default to false
2309    */
2310   private boolean deleteGroupsIfNotExistInGrouper = false;
2311 
2312   /**
2313    * true or false if groups that were created in grouper were deleted should it be deleted in ldap?
2314    * or for attributes, delete attribute value if deleted in grouper default to true
2315    */
2316   private boolean deleteGroupsIfGrouperDeleted = false;
2317 
2318   /**
2319    * if provisioning normal memberships or privileges  default to "members" for normal memberships, otherwise which privileges
2320    */
2321   private GrouperProvisioningMembershipFieldType grouperProvisioningMembershipFieldType = null;
2322 
2323   /**
2324    * attribute name in a group/entity object that refers to memberships (if applicable)
2325    */
2326   private String attributeNameForMemberships;
2327 
2328   /**
2329    * attribute name in a group/entity object that refers to memberships (if applicable)
2330    * @return
2331    */
2332   public String getAttributeNameForMemberships() {
2333     return attributeNameForMemberships;
2334   }
2335 
2336   /**
2337    * attribute name in a group/entity object that refers to memberships (if applicable)
2338    * @param attributeNameForMemberships
2339    */
2340   public void setAttributeNameForMemberships(String attributeNameForMemberships) {
2341     this.attributeNameForMemberships = attributeNameForMemberships;
2342   }
2343 
2344   /**
2345    * 
2346    */
2347   public abstract void configureSpecificSettings();
2348 
2349   private GrouperProvisioningBehaviorMembershipType grouperProvisioningBehaviorMembershipType;
2350 
2351   /**
2352    * number of metadata
2353    */
2354   private int numberOfMetadata;
2355 
2356   private String groupMembershipAttributeName;
2357 
2358   public String getGroupMembershipAttributeName() {
2359     return groupMembershipAttributeName;
2360   }
2361 
2362   public String getGroupMembershipAttributeValue() {
2363     return groupMembershipAttributeValue;
2364   }
2365 
2366   private String groupMembershipAttributeValue;
2367 
2368   /**
2369    * attribute name in a user object that refers to memberships (if applicable)
2370    */
2371   private String entityMembershipAttributeName;
2372 
2373   public String getEntityMembershipAttributeName() {
2374     return entityMembershipAttributeName;
2375   }
2376 
2377   public String getEntityMembershipAttributeValue() {
2378     return entityMembershipAttributeValue;
2379   }
2380 
2381   private String entityMembershipAttributeValue;
2382 
2383   private boolean hasGroupAttributes;
2384 
2385   private boolean resolveGroupAttributesWithSql;
2386 
2387   private String groupAttributesSqlExternalSystem;
2388 
2389   private String groupAttributesTableViewName;
2390 
2391   private String groupAttributesColumnNames;
2392 
2393   private String groupAttributesTableStructure;
2394 
2395   private String groupAttributesAttributeNameColumnName;
2396 
2397   private String groupAttributesAttributeValueColumnName;
2398 
2399   private String groupAttributesGroupMatchingColumn;
2400 
2401   private String groupAttributesLastUpdatedColumn;
2402 
2403   private String groupAttributesLastUpdatedType;
2404 
2405   private boolean groupAttributesRecalcMembershipsOnIncremental;
2406 
2407   private boolean groupAttributesSelectAllSqlOnFull;
2408 
2409   private int sleepBeforeSelectAfterInsertMillis;  
2410   
2411   
2412   public int getSleepBeforeSelectAfterInsertMillis() {
2413     return sleepBeforeSelectAfterInsertMillis;
2414   }
2415 
2416   
2417   public void setSleepBeforeSelectAfterInsertMillis(
2418       int sleepBeforeSelectAfterInsertMillis) {
2419     this.sleepBeforeSelectAfterInsertMillis = sleepBeforeSelectAfterInsertMillis;
2420   }
2421 
2422   /**
2423    * number of metadata
2424    * @return
2425    */
2426   public int getNumberOfMetadata() {
2427     return numberOfMetadata;
2428   }
2429 
2430   /**
2431    * number of metadata
2432    * @param numberOfMetadata
2433    */
2434   public void setNumberOfMetadata(int numberOfMetadata) {
2435     this.numberOfMetadata = numberOfMetadata;
2436   }
2437 
2438   public GrouperProvisioningBehaviorMembershipType getGrouperProvisioningBehaviorMembershipType() {
2439     return grouperProvisioningBehaviorMembershipType;
2440   }
2441 
2442   
2443   public void setGrouperProvisioningBehaviorMembershipType(
2444       GrouperProvisioningBehaviorMembershipType grouperProvisioningBehaviorMembershipType) {
2445     this.grouperProvisioningBehaviorMembershipType = grouperProvisioningBehaviorMembershipType;
2446   }
2447   
2448   public void configureProvisionableSettings() {
2449     if (this.getConfigId() == null) {
2450       this.setConfigId(this.grouperProvisioner.getConfigId());
2451     }
2452     
2453     this.onlyProvisionPolicyGroups = this.retrieveConfigBoolean("onlyProvisionPolicyGroups", false);
2454 
2455     this.allowPolicyGroupOverride = this.retrieveConfigBoolean("allowPolicyGroupOverride", false);
2456 
2457     this.allowProvisionableRegexOverride = this.retrieveConfigBoolean("allowProvisionableRegexOverride", false);
2458 
2459     this.provisionableRegex = this.retrieveConfigString("provisionableRegex", false);
2460   }
2461 
2462   public void configureGenericSettings() {
2463     configureProvisionableSettings();
2464     
2465     {
2466       Boolean operateOnGrouperMemberships = this.retrieveConfigBoolean("operateOnGrouperMemberships", false);
2467       if (operateOnGrouperMemberships == null) {
2468         operateOnGrouperMemberships = false;
2469       }
2470       
2471       if (operateOnGrouperMemberships) {
2472         String provisioningTypeString = this.retrieveConfigString("provisioningType", true);
2473         this.grouperProvisioningBehaviorMembershipType = GrouperProvisioningBehaviorMembershipType.valueOf(provisioningTypeString);
2474       }
2475       
2476     }
2477 
2478     this.sleepBeforeSelectAfterInsertMillis = GrouperUtil.intValue(this.retrieveConfigInt("sleepBeforeSelectAfterInsertMillis", false), 0);
2479 
2480     this.numberOfMessagesToProcessEachIncremental = GrouperUtil.intValue(this.retrieveConfigInt("numberOfMessagesToProcessEachIncremental", false), 5000);
2481 
2482     this.numberOfMetadata = GrouperUtil.intValue(this.retrieveConfigInt("numberOfMetadata", false), 0);
2483     
2484     for (int i=0;i<this.numberOfMetadata;i++) {
2485       
2486       GrouperProvisioningObjectMetadataItemtem.html#GrouperProvisioningObjectMetadataItem">GrouperProvisioningObjectMetadataItem grouperProvisioningObjectMetadataItem = new GrouperProvisioningObjectMetadataItem();
2487       {
2488         String name = this.retrieveConfigString("metadata."+i+".name", false);
2489         if (!name.startsWith("md_")) {
2490           //TODO validate this
2491           this.debugMap.put("invalid_metadataName_" + name, true);
2492           continue;
2493         }
2494         grouperProvisioningObjectMetadataItem.setName(name);
2495         if (this.metadataNameToMetadataItem.containsKey(name)) {
2496           throw new RuntimeException("Conflicting metadata names! " + name);
2497         }
2498         this.metadataNameToMetadataItem.put(name, grouperProvisioningObjectMetadataItem);
2499       }
2500       
2501       grouperProvisioningObjectMetadataItem.setLabelKey(grouperProvisioningObjectMetadataItem.getName() + "_" + this.getGrouperProvisioner().getConfigId() + "_label");
2502       grouperProvisioningObjectMetadataItem.setDescriptionKey(grouperProvisioningObjectMetadataItem.getName() + "_" + this.getGrouperProvisioner().getConfigId() + "_description");
2503       
2504       {
2505         boolean showForFolder = GrouperUtil.booleanValue(this.retrieveConfigBoolean("metadata."+i+".showForFolder", false), false);
2506         grouperProvisioningObjectMetadataItem.setShowForFolder(showForFolder);
2507       }
2508       
2509       {
2510         boolean showForGroup = GrouperUtil.booleanValue(this.retrieveConfigBoolean("metadata."+i+".showForGroup", false), false);
2511         grouperProvisioningObjectMetadataItem.setShowForGroup(showForGroup);
2512       }
2513       
2514       {
2515         boolean showForMember = GrouperUtil.booleanValue(this.retrieveConfigBoolean("metadata."+i+".showForMember", false), false);
2516         grouperProvisioningObjectMetadataItem.setShowForMember(showForMember);
2517       }
2518       
2519       {
2520         boolean showForMembership = GrouperUtil.booleanValue(this.retrieveConfigBoolean("metadata."+i+".showForMembership", false), false);
2521         grouperProvisioningObjectMetadataItem.setShowForMembership(showForMembership);
2522       }
2523       
2524       {
2525         boolean canChange = GrouperUtil.booleanValue(this.retrieveConfigBoolean("metadata."+i+".canChange", false), true);
2526         grouperProvisioningObjectMetadataItem.setCanChange(canChange);
2527       }
2528 
2529       {
2530         boolean canUpdate = GrouperUtil.booleanValue(this.retrieveConfigBoolean("metadata."+i+".canUpdate", false), true);
2531         grouperProvisioningObjectMetadataItem.setCanUpdate(canUpdate);
2532       }
2533       
2534       {
2535         String valueType = this.retrieveConfigString("metadata."+i+".valueType", false);
2536         GrouperProvisioningObjectMetadataItemValueType grouperProvisioningObjectMetadataItemValueType = 
2537             StringUtils.isBlank(valueType) ? GrouperProvisioningObjectMetadataItemValueType.STRING 
2538                 : GrouperProvisioningObjectMetadataItemValueType.valueOfIgnoreCase(valueType, true);
2539         grouperProvisioningObjectMetadataItem.setValueType(grouperProvisioningObjectMetadataItemValueType);
2540         
2541         if (grouperProvisioningObjectMetadataItemValueType == GrouperProvisioningObjectMetadataItemValueType.BOOLEAN) {
2542           grouperProvisioningObjectMetadataItem.setFormElementType(GrouperProvisioningObjectMetadataItemFormElementType.RADIOBUTTON);
2543          
2544           String trueLabel = GrouperTextContainer.textOrNull("config.defaultTrueLabel");
2545           String falseLabel = GrouperTextContainer.textOrNull("config.defaultFalseLabel");
2546           
2547           String defaultValue = this.retrieveConfigString("metadata."+i+".defaultValue", false);
2548           
2549           List<MultiKey> keysAndLabels = new ArrayList<MultiKey>();
2550           
2551           if (StringUtils.isNotBlank(defaultValue)) {
2552             
2553             Boolean booleanObjectValue = GrouperUtil.booleanObjectValue(defaultValue);
2554             if (booleanObjectValue != null) {
2555               String defaultValueStr = booleanObjectValue ? "("+trueLabel+")" : "("+falseLabel+")"; 
2556               keysAndLabels.add(new MultiKey("", GrouperTextContainer.textOrNull("config.defaultValueLabel")+" " + defaultValueStr ));
2557             }
2558           }
2559           
2560           keysAndLabels.add(new MultiKey("true", trueLabel));
2561           keysAndLabels.add(new MultiKey("false", falseLabel));
2562           grouperProvisioningObjectMetadataItem.setKeysAndLabelsForDropdown(keysAndLabels);
2563         } else {
2564           String formElementType = this.retrieveConfigString("metadata."+i+".formElementType", false);
2565           GrouperProvisioningObjectMetadataItemFormElementType grouperProvisioningObjectMetadataItemFormElementType =
2566               StringUtils.isBlank(formElementType) ? GrouperProvisioningObjectMetadataItemFormElementType.TEXT 
2567                   : GrouperProvisioningObjectMetadataItemFormElementType.valueOfIgnoreCase(formElementType, true);
2568           grouperProvisioningObjectMetadataItem.setFormElementType(grouperProvisioningObjectMetadataItemFormElementType);
2569         }
2570       }
2571       
2572       {
2573         String defaultValue = this.retrieveConfigString("metadata."+i+".defaultValue", false);
2574         grouperProvisioningObjectMetadataItem.setDefaultValue(defaultValue);
2575       }
2576       
2577       {
2578         String dropdownValues = this.retrieveConfigString("metadata."+i+".dropdownValues", false);
2579         if (!StringUtils.isBlank(dropdownValues)) {
2580           String[] dropdownValuesArray = GrouperUtil.splitTrim(dropdownValues, ",");
2581           List<MultiKey> keysAndLabels = new ArrayList<MultiKey>();
2582           keysAndLabels.add(new MultiKey("", ""));
2583           for (String dropdownValue : dropdownValuesArray) {
2584             dropdownValue = GrouperUtil.replace(dropdownValue, "&#x2c;", ",");
2585             MultiKey keyAndLabel = new MultiKey(dropdownValue, dropdownValue);
2586             keysAndLabels.add(keyAndLabel);
2587           }
2588           grouperProvisioningObjectMetadataItem.setKeysAndLabelsForDropdown(keysAndLabels);
2589         }
2590       }
2591       
2592       {
2593         boolean required = GrouperUtil.booleanValue(this.retrieveConfigBoolean("metadata."+i+".required", false), false);
2594         grouperProvisioningObjectMetadataItem.setRequired(required);
2595       }
2596 
2597       {
2598         String groupIdThatCanView = this.retrieveConfigString("metadata."+i+".groupIdThatCanView", false);
2599         grouperProvisioningObjectMetadataItem.setGroupIdThatCanView(groupIdThatCanView);
2600       }
2601       {
2602         String groupIdThatCanUpdate = this.retrieveConfigString("metadata."+i+".groupIdThatCanUpdate", false);
2603         grouperProvisioningObjectMetadataItem.setGroupIdThatCanUpdate(groupIdThatCanUpdate);
2604       }
2605       
2606     }
2607     
2608     this.groupMembershipAttributeName = this.retrieveConfigString("groupMembershipAttributeName", false);
2609     this.groupMembershipAttributeValue = this.retrieveConfigString("groupMembershipAttributeValue", false);
2610     
2611     this.entityMembershipAttributeName = this.retrieveConfigString("entityMembershipAttributeName", false);
2612     this.entityMembershipAttributeValue = this.retrieveConfigString("entityMembershipAttributeValue", false);
2613     
2614 
2615     for (String objectType: new String[] {"targetGroupAttribute", "targetEntityAttribute", "targetMembershipAttribute"}) {
2616       
2617       boolean foundMatchingId = false;
2618       String foundMatchingIdName = null;
2619       
2620       boolean foundMembershipAttribute = false;
2621       String foundMembershipAttributeName = null;
2622       
2623       for (int i=0; i< 20; i++) {
2624   
2625         
2626         GrouperProvisioningConfigurationAttribute attributeConfig = GrouperUtil.newInstance(this.grouperProvisioningConfigurationAttributeClass());
2627         
2628         attributeConfig.setGrouperProvisioner(grouperProvisioner);
2629         attributeConfig.setConfigIndex(i);
2630         
2631         if (StringUtils.equals("targetGroupAttribute", objectType)) {
2632           attributeConfig.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.group);
2633         } else if (StringUtils.equals("targetEntityAttribute", objectType)) {
2634           attributeConfig.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
2635         } else if (StringUtils.equals("targetMembershipAttribute", objectType)) {
2636           attributeConfig.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.membership);
2637         } else {
2638           throw new RuntimeException("Cant find object type: " + objectType);
2639         }
2640 
2641         String name = this.retrieveConfigString(objectType + "."+i+ ".name" , false);
2642         if (StringUtils.isBlank(name)) {
2643           break;
2644         }
2645         attributeConfig.setName(name);
2646         
2647         {
2648           boolean showAttributeValidation = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".showAttributeValidation" , false), false);
2649           if (showAttributeValidation) {
2650             {
2651               Integer maxlength = this.retrieveConfigInt(objectType + "."+i+".maxlength", false);
2652               attributeConfig.setMaxlength(maxlength);
2653             }
2654             
2655             {
2656               String validExpression = this.retrieveConfigString(objectType + "."+i+".validExpression", false);
2657               attributeConfig.setValidExpression(validExpression);
2658             }
2659             
2660             {
2661               boolean required = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".required" , false), false);
2662               attributeConfig.setRequired(required);
2663             }
2664             
2665           }
2666         }
2667   
2668         {
2669           String translateExpressionType = this.retrieveConfigString(objectType + "."+i+".translateExpressionType" , false);
2670           attributeConfig.setTranslateExpressionType(GrouperProvisioningConfigurationAttributeTranslationType.valueOfIgnoreCase(translateExpressionType, false));
2671         }
2672         
2673         {
2674           String translateExpressionType = this.retrieveConfigString(objectType + "."+i+".translateExpressionTypeCreateOnly" , false);
2675           attributeConfig.setTranslateExpressionTypeCreateOnly(GrouperProvisioningConfigurationAttributeTranslationType.valueOfIgnoreCase(translateExpressionType, false));
2676         }
2677         
2678         {
2679           String translateExpression = this.retrieveConfigString(objectType + "."+i+".translateExpression" , false);
2680           attributeConfig.setTranslateExpression(translateExpression);
2681         }
2682         
2683         {
2684           boolean nullChecksInScript = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".nullChecksInScript" , false), false);
2685           attributeConfig.setCheckForNullsInScript(nullChecksInScript);
2686         }
2687         
2688         {
2689           boolean unprovisionableIfNull = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".unprovisionableIfNull" , false), false);
2690           attributeConfig.setUnprovisionableIfNull(unprovisionableIfNull);
2691         }
2692         
2693         {
2694           String translationContinueCondition = this.retrieveConfigString(objectType + "."+i+".translationContinueCondition" , false);
2695           attributeConfig.setTranslationContinueCondition(translationContinueCondition);
2696         }
2697         
2698         {
2699           String translateExpressionCreateOnly = this.retrieveConfigString(objectType+"."+i+".translateExpressionCreateOnly" , false);
2700           attributeConfig.setTranslateExpressionCreateOnly(translateExpressionCreateOnly);
2701         }
2702         
2703         {
2704           String translateFromStaticValues = this.retrieveConfigString(objectType + "."+i+".translateFromStaticValues" , false);
2705           attributeConfig.setTranslateFromStaticValues(translateFromStaticValues);
2706         }
2707         
2708         {
2709           String translateFromStaticValuesCreateOnly = this.retrieveConfigString(objectType+"."+i+".translateFromStaticValuesCreateOnly" , false);
2710           attributeConfig.setTranslateFromStaticValuesCreateOnly(translateFromStaticValuesCreateOnly);
2711         }
2712         
2713         {
2714           String translateFromGrouperProvisioningGroupField = this.retrieveConfigString(objectType+"."+i+".translateFromGrouperProvisioningGroupField" , false);
2715           attributeConfig.setTranslateFromGrouperProvisioningGroupField(translateFromGrouperProvisioningGroupField);
2716         }
2717         
2718         {
2719           String translateFromGrouperProvisioningEntityField = this.retrieveConfigString(objectType+"."+i+".translateFromGrouperProvisioningEntityField" , false);
2720           attributeConfig.setTranslateFromGrouperProvisioningEntityField(translateFromGrouperProvisioningEntityField);
2721         }
2722         
2723         {
2724           String translateFromGrouperTargetGroupField = this.retrieveConfigString(objectType+"."+i+".translateFromGrouperTargetGroupField" , false);
2725           attributeConfig.setTranslateFromGrouperTargetGroupField(translateFromGrouperTargetGroupField);
2726         }
2727         
2728         {
2729           String translateFromGrouperTargetEntityField = this.retrieveConfigString(objectType+"."+i+".translateFromGrouperTargetEntityField" , false);
2730           attributeConfig.setTranslateFromGrouperTargetEntityField(translateFromGrouperTargetEntityField);
2731         }
2732         
2733         {
2734           String translateFromGrouperProvisioningGroupFieldCreateOnly = this.retrieveConfigString(objectType+"."+i+".translateFromGrouperProvisioningGroupFieldCreateOnly" , false);
2735           attributeConfig.setTranslateFromGrouperProvisioningGroupFieldCreateOnly(translateFromGrouperProvisioningGroupFieldCreateOnly);
2736         }
2737         
2738         {
2739           String translateFromGrouperProvisioningEntityFieldCreateOnly = this.retrieveConfigString(objectType+"."+i+".translateFromGrouperProvisioningEntityFieldCreateOnly" , false);
2740           attributeConfig.setTranslateFromGrouperProvisioningEntityFieldCreateOnly(translateFromGrouperProvisioningEntityFieldCreateOnly);
2741         }
2742         
2743         {
2744           boolean showAttributeCrud = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".showAttributeCrud" , false), false);
2745           if (showAttributeCrud) {
2746 
2747             {
2748               boolean insert = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".insert" , false), true);
2749               attributeConfig.setInsert(insert);
2750             }
2751     
2752             {
2753               boolean update = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType+"."+i+".update" , false), true);
2754               attributeConfig.setUpdate(update);
2755             }
2756             {
2757               boolean select = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".select" , false), true);
2758               attributeConfig.setSelect(select);
2759             }
2760           }
2761         }
2762 
2763         {
2764           boolean showAttributeValueSettings = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".showAttributeValueSettings" , false), false);
2765           Boolean multiValued = null;
2766           if (showAttributeValueSettings) {
2767             multiValued = this.retrieveConfigBoolean(objectType + "."+i+".multiValued" , false);
2768           }
2769           // default multivalued to true for membership attribute if nothing set already
2770           if (multiValued == null) {
2771             if (StringUtils.equals(objectType, "targetGroupAttribute") && !StringUtils.isBlank(this.groupMembershipAttributeName)
2772                 && StringUtils.equals(this.groupMembershipAttributeName, name)) {
2773               multiValued = true;
2774             }
2775             if (StringUtils.equals(objectType, "targetEntityAttribute") && !StringUtils.isBlank(this.entityMembershipAttributeName)
2776                 && StringUtils.equals(this.entityMembershipAttributeName, name)) {
2777               multiValued = true;
2778             }
2779           }
2780           attributeConfig.setMultiValued(multiValued == null ? false: multiValued);
2781           
2782           if (showAttributeValueSettings) {
2783             {
2784               String defaultValue = this.retrieveConfigString(objectType + "."+i+".defaultValue" , false);
2785               attributeConfig.setDefaultValue(defaultValue);
2786             }
2787             
2788     
2789             {
2790               GrouperProvisioningConfigurationAttributeValueType valueType = 
2791                   GrouperProvisioningConfigurationAttributeValueType.valueOfIgnoreCase(
2792                       this.retrieveConfigString(objectType+ "."+i+".valueType" , false), false);
2793               if (valueType == null) {
2794                 valueType = GrouperProvisioningConfigurationAttributeValueType.STRING;
2795               }
2796               attributeConfig.setValueType(valueType);
2797             }
2798             
2799             {
2800               String ignoreIfMatchesValuesRaw = this.retrieveConfigString(objectType + "."+i+".ignoreIfMatchesValue" , false);
2801               if (!StringUtils.isBlank(ignoreIfMatchesValuesRaw)) {
2802                 GrouperProvisioningConfigurationAttributeValueType valueType = GrouperUtil.defaultIfNull(attributeConfig.getValueType(), 
2803                     GrouperProvisioningConfigurationAttributeValueType.STRING);
2804                 
2805                 for (String ignoreIfMatchesValueRaw : GrouperUtil.splitTrim(ignoreIfMatchesValuesRaw, ",")) {
2806                   ignoreIfMatchesValueRaw = StringUtils.replace(ignoreIfMatchesValueRaw, "U+002C", ",");
2807                   Object ignoreIfMatchesValue = valueType.convert(ignoreIfMatchesValueRaw);
2808                   attributeConfig.getIgnoreIfMatchesValues().add(ignoreIfMatchesValue);
2809                 }
2810               }
2811             }
2812             
2813             {
2814              
2815               Boolean caseSensitiveCompare = GrouperUtil.booleanValue(this.retrieveConfigBoolean(objectType + "."+i+".caseSensitiveCompare" , false), true);
2816               attributeConfig.setCaseSensitiveCompare(caseSensitiveCompare);
2817             }
2818             
2819           }
2820         }
2821 
2822         if ("targetGroupAttribute".equals(objectType)) {
2823           if (targetGroupAttributeNameToConfig.containsKey(name)) {
2824             throw new RuntimeException("Multiple configurations for " + objectType + " attribute: " + name);
2825           }
2826         
2827           targetGroupAttributeNameToConfig.put(name, attributeConfig);
2828           
2829         } else if ("targetEntityAttribute".equals(objectType)) {
2830           if (targetEntityAttributeNameToConfig.containsKey(name)) {
2831             throw new RuntimeException("Multiple configurations for " + objectType + " attribute: " + name);
2832           }
2833           targetEntityAttributeNameToConfig.put(name, attributeConfig);
2834           
2835         } else if ("targetMembershipAttribute".equals(objectType)) {
2836           if (targetMembershipAttributeNameToConfig.containsKey(name)) {
2837             throw new RuntimeException("Multiple configurations for " + objectType + " attribute: " + name);
2838           }
2839           targetMembershipAttributeNameToConfig.put(name, attributeConfig);
2840           
2841         } else {
2842           throw new RuntimeException("Invalid object type: '" + objectType + "'");
2843         }
2844       }
2845     }
2846     
2847     this.hasTargetGroupLink = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("hasTargetGroupLink", false), false);
2848     if (this.hasTargetGroupLink) {
2849       this.debugMap.put("hasTargetGroupLink", this.hasTargetGroupLink);
2850     }
2851 
2852     this.hasTargetEntityLink = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("hasTargetEntityLink", false), false);
2853     if (this.hasTargetEntityLink) {
2854       this.debugMap.put("hasTargetEntityLink", this.hasTargetEntityLink);
2855     }
2856     
2857     if (GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("group2advanced", false), false)) {
2858       this.groupsRequireMembers = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("groupsRequireMembers", false), false);
2859     }
2860     
2861     this.groupSearchFilter = this.retrieveConfigString("groupSearchFilter", false);
2862 
2863     this.membershipMatchingIdExpression = this.retrieveConfigString("membershipMatchingIdExpression", false);
2864 
2865     this.unresolvableSubjectsInsert = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("unresolvableSubjectsInsert", false), false);
2866 
2867     this.unresolvableSubjectsRemove = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("unresolvableSubjectsRemove", false), false);
2868 
2869     this.removeAccentedChars = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("removeAccentedChars", false), false);
2870 
2871     this.logAllObjectsVerbose = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("logAllObjectsVerbose", false), false);
2872 
2873     this.logAllObjectsVerboseForTheseGroupNames = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(this.retrieveConfigString("logAllObjectsVerboseForTheseGroupNames", false), ","));
2874     this.logAllObjectsVerboseForTheseSubjectIds = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(this.retrieveConfigString("logAllObjectsVerboseForTheseSubjectIds", false), ","));
2875 
2876     this.logAllObjectsVerboseEntityAttributes = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(this.retrieveConfigString("logAllObjectsVerboseEntityAttributes", false), ","));
2877     this.logAllObjectsVerboseGroupAttributes = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(this.retrieveConfigString("logAllObjectsVerboseGroupAttributes", false), ","));
2878     
2879     if (GrouperUtil.length(this.logAllObjectsVerboseForTheseGroupNames) > 0 
2880         || GrouperUtil.length(this.logAllObjectsVerboseForTheseSubjectIds) > 0 ) {
2881       this.logCertainObjects = true;
2882     }
2883     
2884     this.logAllObjectsVerboseToDaemonDbLog = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("logAllObjectsVerboseToDaemonDbLog", false), true);
2885 
2886     this.logAllObjectsVerboseToLogFile = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("logAllObjectsVerboseToLogFile", false), true);
2887 
2888     this.logCommandsAlways = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("logCommandsAlways", false), false);
2889     
2890     this.logCommandsOnError = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("logCommandsOnError", false), false);
2891     
2892     this.logMaxErrorsPerType = GrouperUtil.intValue(this.retrieveConfigInt("logMaxErrorsPerType", false), 10);
2893     
2894     this.logCompareCalculations = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("logCompareCalculations", false), false);
2895     
2896     this.logAllObjectsVerboseCount = GrouperUtil.intValue(this.retrieveConfigInt("logAllObjectsVerboseCount", false), 10);
2897     
2898     this.debugLog = GrouperUtil.defaultIfNull(this.retrieveConfigBoolean("debugLog", false), false);
2899     
2900     this.operateOnGrouperEntities = GrouperUtil.booleanValue(this.retrieveConfigBoolean("operateOnGrouperEntities", false), false);
2901     this.operateOnGrouperMemberships = GrouperUtil.booleanValue(this.retrieveConfigBoolean("operateOnGrouperMemberships", false), false);
2902     this.operateOnGrouperGroups = GrouperUtil.booleanValue(this.retrieveConfigBoolean("operateOnGrouperGroups", false), false);
2903     
2904     this.subjectSourcesToProvision = GrouperUtil.nonNull(GrouperUtil.splitTrimToSet(this.retrieveConfigString("subjectSourcesToProvision", false), ","));
2905 
2906     for (String sourceId : this.subjectSourcesToProvision) {
2907       if (null == SourceManager.getInstance().getSource(sourceId)) {
2908         throw new RuntimeException("Cant find source: '" + sourceId + "'");
2909       }
2910     }
2911     this.debugMap.put("subjectSourcesToProvision", GrouperUtil.join(this.subjectSourcesToProvision.iterator(), ','));
2912     
2913     this.deleteMembershipsForUnprovisionableUsers = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteMembershipsForUnprovisionableUsers", false), false);
2914 
2915     this.groupAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupAttributeValueCacheHas", false), false);
2916     if (this.groupAttributeValueCacheHas) {
2917       this.groupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4];
2918 
2919       for (int i=0;i<4;i++) {
2920         boolean theGroupAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupAttributeValueCache" + i + "has", false), false);
2921         if (!theGroupAttributeValueCacheHas) {
2922           continue;
2923         }
2924         this.groupAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "group");
2925         String theGroupAttributeValueCache0source = this.retrieveConfigString("groupAttributeValueCache" + i + "source", true);
2926         this.groupAttributeDbCaches[i].setSource(
2927             GrouperProvisioningConfigurationAttributeDbCacheSource.valueOfIgnoreCase(theGroupAttributeValueCache0source, true));
2928 
2929         String theGroupAttributeValueCache0type = this.retrieveConfigString("groupAttributeValueCache" + i + "type", true);
2930         this.groupAttributeDbCaches[i].setType(
2931             GrouperProvisioningConfigurationAttributeDbCacheType.valueOfIgnoreCase(theGroupAttributeValueCache0type, true));
2932 
2933         if (this.groupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) {
2934           this.groupAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("groupAttributeValueCache" + i + "groupAttribute", true));
2935         } else if (this.groupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) {
2936           this.groupAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("groupAttributeValueCache" + i + "translationScript", true));
2937         } else if (this.groupAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.object) {
2938           // nuthin
2939         } else {
2940           throw new RuntimeException("Invalid attribute cache type: " + "groupAttributeValueCache" + i + "type" + ", " 
2941               + this.groupAttributeDbCaches[i].getType());
2942         }
2943       }
2944     }
2945     
2946     this.entityAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityAttributeValueCacheHas", false), false);
2947     if (this.entityAttributeValueCacheHas) {
2948       this.entityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4];
2949 
2950       for (int i=0;i<4;i++) {
2951         boolean theEntityAttributeValueCacheHas = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityAttributeValueCache" + i + "has", false), false);
2952         if (!theEntityAttributeValueCacheHas) {
2953           continue;
2954         }
2955         this.entityAttributeDbCaches[i] = new GrouperProvisioningConfigurationAttributeDbCache(this.grouperProvisioner, i, "entity");
2956         
2957         Boolean theEntityAttributeValueCacheNullChecksInScript = this.retrieveConfigBoolean("entityAttributeValueCache" + i + "nullChecksInScript", false);
2958         if (theEntityAttributeValueCacheNullChecksInScript == null) {
2959           theEntityAttributeValueCacheNullChecksInScript = false;
2960         }
2961         this.entityAttributeDbCaches[i].setNullChecksInScript(theEntityAttributeValueCacheNullChecksInScript);
2962         
2963         String entityAttributeValueCacheTranslationContinueCondition = this.retrieveConfigString("entityAttributeValueCache" + i + "translationContinueCondition", false);
2964         this.entityAttributeDbCaches[i].setTranslationContinueConditon(entityAttributeValueCacheTranslationContinueCondition);
2965         
2966         String theEntityAttributeValueCache0source = this.retrieveConfigString("entityAttributeValueCache" + i + "source", true);
2967         this.entityAttributeDbCaches[i].setSource(
2968             GrouperProvisioningConfigurationAttributeDbCacheSource.valueOfIgnoreCase(theEntityAttributeValueCache0source, true));
2969 
2970         String theEntityAttributeValueCache0type = this.retrieveConfigString("entityAttributeValueCache" + i + "type", true);
2971         this.entityAttributeDbCaches[i].setType(
2972             GrouperProvisioningConfigurationAttributeDbCacheType.valueOfIgnoreCase(theEntityAttributeValueCache0type, true));
2973 
2974         if (this.entityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.attribute) {
2975           this.entityAttributeDbCaches[i].setAttributeName(this.retrieveConfigString("entityAttributeValueCache" + i + "entityAttribute", true));
2976         } else if (this.entityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.translationScript) {
2977           this.entityAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("entityAttributeValueCache" + i + "translationScript", true));
2978         } else if (this.entityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.subjectTranslationScript) {
2979           this.entityAttributeDbCaches[i].setTranslationScript(this.retrieveConfigString("entityAttributeValueCache" + i + "translationScript", true));
2980         } else if (this.entityAttributeDbCaches[i].getType() == GrouperProvisioningConfigurationAttributeDbCacheType.object) {
2981           // nuthin
2982         } else {
2983           throw new RuntimeException("Invalid attribute cache type: " + "entityAttributeValueCache" + i + "type" + ", " 
2984               + this.entityAttributeDbCaches[i].getType());
2985         }
2986       }
2987     }
2988     
2989     this.refreshSubjectLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshSubjectLinkIfLessThanAmount", false), 20);
2990     this.refreshGroupLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshGroupLinkIfLessThanAmount", false), 20);
2991     this.refreshEntityLinkIfLessThanAmount = GrouperUtil.intValue(this.retrieveConfigInt("refreshEntityLinkIfLessThanAmount", false), 20);
2992     
2993     this.scoreConvertToFullSyncThreshold = GrouperUtil.intValue(this.retrieveConfigInt("scoreConvertToFullSyncThreshold", false), 10000);
2994     this.membershipsConvertToGroupSyncThreshold = GrouperUtil.intValue(this.retrieveConfigInt("membershipsConvertToGroupSyncThreshold", false), 500);
2995     
2996     this.entitySearchAllFilter = this.retrieveConfigString("userSearchAllFilter", false);
2997     this.groupSearchFilter = this.retrieveConfigString("groupSearchFilter", false);
2998     this.groupSearchAllFilter = this.retrieveConfigString("groupSearchAllFilter", false);
2999     
3000     this.customizeGroupCrud = GrouperUtil.booleanValue(this.retrieveConfigBoolean("customizeGroupCrud", false), false);
3001     
3002     if (!this.operateOnGrouperGroups) {
3003       this.insertGroups = false;
3004       
3005       this.deleteGroups = false;
3006   
3007       this.updateGroups = false;
3008   
3009       this.selectGroups = false;
3010   
3011       this.deleteGroupsIfNotExistInGrouper = false;
3012   
3013       this.deleteGroupsIfGrouperDeleted = false;
3014   
3015       this.deleteGroupsIfGrouperCreated = false;
3016 
3017       this.deleteGroupsIfUnmarkedProvisionable = false;
3018     }
3019     
3020     if (this.customizeGroupCrud) {
3021 
3022       this.insertGroups = GrouperUtil.booleanValue(this.retrieveConfigBoolean("insertGroups", false), true);
3023 
3024       this.selectGroups = GrouperUtil.booleanValue(this.retrieveConfigBoolean("selectGroups", false), true);
3025 
3026       this.updateGroups = GrouperUtil.booleanValue(this.retrieveConfigBoolean("updateGroups", false), true);
3027 
3028       this.deleteGroups = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteGroups", false), true);
3029 
3030       this.deleteGroupsIfNotExistInGrouper = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteGroupsIfNotExistInGrouper", false), false);
3031 
3032       this.deleteGroupsIfGrouperDeleted = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteGroupsIfGrouperDeleted", false), false);
3033 
3034       this.deleteGroupsIfGrouperCreated = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteGroupsIfGrouperCreated", false), 
3035           (deleteGroups && !this.deleteGroupsIfNotExistInGrouper && !this.deleteGroupsIfGrouperDeleted));
3036       
3037       this.deleteGroupsIfUnmarkedProvisionable = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteGroupsIfUnmarkedProvisionable", false), true);
3038     }
3039 
3040     
3041     if (!this.operateOnGrouperMemberships) {
3042       this.insertMemberships = false;
3043       
3044       this.deleteMemberships = false;
3045   
3046       this.selectMemberships = false;
3047   
3048       this.deleteMembershipsIfNotExistInGrouper = false;
3049 
3050       this.deleteValueIfManagedByGrouper = false;
3051       
3052       this.deleteMembershipsForUnprovisionableUsers = false;
3053   
3054       this.deleteMembershipsIfGrouperDeleted = false;
3055   
3056       this.deleteMembershipsIfGrouperCreated = false;
3057       
3058       this.deleteMembershipsIfGroupUnmarkedProvisionable = false;
3059     }
3060 
3061     
3062     this.customizeMembershipCrud = GrouperUtil.booleanValue(this.retrieveConfigBoolean("customizeMembershipCrud", false), false);
3063     if (this.customizeMembershipCrud) {
3064       
3065       this.insertMemberships = GrouperUtil.booleanValue(this.retrieveConfigBoolean("insertMemberships", false), true);
3066       
3067       this.replaceMemberships = GrouperUtil.booleanValue(this.retrieveConfigBoolean("replaceMemberships", false), false);
3068 
3069       this.selectMemberships = GrouperUtil.booleanValue(this.retrieveConfigBoolean("selectMemberships", false), true);
3070 
3071       this.deleteMemberships = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteMemberships", false), true);
3072 
3073       this.deleteMembershipsIfNotExistInGrouper = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteMembershipsIfNotExistInGrouper", false), false);
3074       this.deleteValueIfManagedByGrouper = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteValueIfManagedByGrouper", false), false);
3075       this.deleteMembershipsOnlyInTrackedGroups = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteMembershipsOnlyInTrackedGroups", false), true);
3076 
3077       this.deleteMembershipsIfGrouperDeleted = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteMembershipsIfGrouperDeleted", false), false);
3078 
3079       this.deleteMembershipsIfGrouperCreated = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteMembershipsIfGrouperCreated", false), 
3080           (deleteMemberships && !this.deleteMembershipsIfNotExistInGrouper && !this.deleteMembershipsIfGrouperDeleted));
3081       
3082       this.deleteMembershipsIfGroupUnmarkedProvisionable = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteMembershipsIfGroupUnmarkedProvisionable", false), true);
3083     }
3084 
3085     boolean errorHandlingShow = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingShow", false), false);
3086 
3087     if (errorHandlingShow) {
3088       
3089       this.errorHandlingLogErrors = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingLogErrors", false), true);
3090       this.errorHandlingLogCountPerType = GrouperUtil.intValue(this.retrieveConfigInt("errorHandlingLogCountPerType", false), 5);
3091       this.errorHandlingProvisionerDaemonShouldFailOnObjectError = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingProvisionerDaemonShouldFailOnObjectError", false), true);
3092       this.errorHandlingInvalidDataIsAnError = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingInvalidDataIsAnError", false), true);
3093       this.errorHandlingLengthValidationIsAnError = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingLengthValidationIsAnError", false), true);
3094       this.errorHandlingMatchingValidationIsAnError = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingMatchingValidationIsAnError", false), true);
3095       this.errorHandlingRequiredValidationIsAnError = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingRequiredValidationIsAnError", false), true);
3096       this.errorHandlingTargetObjectDoesNotExistIsAnError = GrouperUtil.booleanValue(this.retrieveConfigBoolean("errorHandlingTargetObjectDoesNotExistIsAnError", false), true);
3097       
3098       this.errorHandlingPercentLevel1 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingPercentLevel1", false), 1);
3099       this.errorHandlingMinutesLevel1 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingMinutesLevel1", false), 180);
3100       this.errorHandlingPercentLevel2 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingPercentLevel2", false), 5);
3101       this.errorHandlingMinutesLevel2 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingMinutesLevel2", false), 120);
3102       this.errorHandlingPercentLevel3 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingPercentLevel3", false), 10);
3103       this.errorHandlingMinutesLevel3 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingMinutesLevel3", false), 12);
3104       this.errorHandlingPercentLevel4 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingPercentLevel4", false), 100);
3105       this.errorHandlingMinutesLevel4 = GrouperUtil.floatValue(this.retrieveConfigDouble("errorHandlingMinutesLevel4", false), 3);
3106       
3107     }
3108     
3109     this.makeChangesToEntities = GrouperUtil.booleanValue(this.retrieveConfigBoolean("makeChangesToEntities", false), false);
3110 
3111     // reset some defaults if making changes
3112     if (this.makeChangesToEntities) {
3113       this.insertEntities = true;
3114       this.updateEntities = true;
3115       this.deleteEntities = true;
3116       this.deleteEntitiesIfGrouperCreated = true;
3117     }
3118 
3119     this.customizeEntityCrud = GrouperUtil.booleanValue(this.retrieveConfigBoolean("customizeEntityCrud", false), false);
3120   
3121     if (!this.operateOnGrouperEntities) {
3122       this.insertEntities = false;
3123       
3124       this.deleteEntities = false;
3125   
3126       this.updateEntities = false;
3127   
3128       this.selectEntities = false;
3129   
3130       this.deleteEntitiesIfNotExistInGrouper = false;
3131   
3132       this.deleteEntitiesIfGrouperDeleted = false;
3133   
3134       this.deleteEntitiesIfGrouperCreated = false;
3135       
3136     }
3137     
3138     if (this.customizeEntityCrud) {
3139       this.insertEntities = GrouperUtil.booleanValue(this.retrieveConfigBoolean("insertEntities", false), this.insertEntities);
3140       
3141       this.deleteEntities = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteEntities", false), this.deleteEntities);
3142   
3143       this.updateEntities = GrouperUtil.booleanValue(this.retrieveConfigBoolean("updateEntities", false), this.updateEntities);
3144   
3145       this.selectEntities = GrouperUtil.booleanValue(this.retrieveConfigBoolean("selectEntities", false), this.selectEntities);
3146   
3147       this.deleteEntitiesIfNotExistInGrouper = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteEntitiesIfNotExistInGrouper", false), this.deleteEntitiesIfNotExistInGrouper);
3148   
3149       this.deleteEntitiesIfGrouperDeleted = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteEntitiesIfGrouperDeleted", false), this.deleteEntitiesIfGrouperDeleted);
3150   
3151       this.deleteEntitiesIfGrouperCreated = GrouperUtil.booleanValue(this.retrieveConfigBoolean("deleteEntitiesIfGrouperCreated", false), 
3152           (this.makeChangesToEntities && deleteEntities && !this.deleteEntitiesIfNotExistInGrouper && !this.deleteEntitiesIfGrouperDeleted));
3153           
3154     }
3155     this.selectAllEntities = GrouperUtil.booleanValue(this.retrieveConfigBoolean("selectAllEntities", false), this.operateOnGrouperEntities);
3156     this.selectAllGroups = GrouperUtil.booleanValue(this.retrieveConfigBoolean("selectAllGroups", false), this.operateOnGrouperGroups);
3157 
3158     this.groupIdOfUsersToProvision = this.retrieveConfigString("groupIdOfUsersToProvision", false);
3159     this.groupIdOfUsersNotToProvision = this.retrieveConfigString("groupIdOfUsersNotToProvision", false);
3160     this.searchAttributeNameToRetrieveEntities = this.retrieveConfigString("searchAttributeNameToRetrieveEntities", false);
3161     
3162     this.loadEntitiesToGrouperTable = GrouperUtil.booleanValue(this.retrieveConfigBoolean("loadEntitiesToGrouperTable", false), false);
3163     
3164     this.hasEntityAttributes = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityResolver.entityAttributesNotInSubjectSource", false), false);
3165     this.resolveAttributesWithSql = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityResolver.resolveAttributesWithSQL", false), false);
3166     this.resolveAttributesWithLdap = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityResolver.resolveAttributesWithLDAP", false), false);
3167     this.useGlobalSqlResolver = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityResolver.useGlobalSQLResolver", false), false);
3168 
3169     this.useGlobalLdapResolver = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityResolver.useGlobalLDAPResolver", false), false);
3170     this.globalSqlResolver = this.retrieveConfigString("entityResolver.globalSQLResolver", false);
3171     this.globalLdapResolver = this.retrieveConfigString("entityResolver.globalLDAPResolver", false);
3172     this.selectAllSqlOnFull = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityResolver.selectAllSQLOnFull", false), true);
3173     this.filterAllLDAPOnFull = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityResolver.filterAllLDAPOnFull", false), true);
3174     
3175     this.entityAttributesSqlExternalSystem = this.retrieveConfigString("entityResolver.sqlConfigId", false);
3176     this.entityAttributesTableViewName = this.retrieveConfigString("entityResolver.tableOrViewName", false);
3177     this.entityAttributesColumnNames = this.retrieveConfigString("entityResolver.columnNames", false);
3178     this.entityAttributesSubjectSourceIdColumn = this.retrieveConfigString("entityResolver.subjectSourceIdColumn", false);
3179     this.entityAttributesSubjectSearchMatchingColumn = this.retrieveConfigString("entityResolver.subjectSearchMatchingColumn", false);
3180     this.entityAttributesSqlMappingType = this.retrieveConfigString("entityResolver.sqlMappingType", false);
3181     this.entityAttributesSqlMappingEntityAttribute = this.retrieveConfigString("entityResolver.sqlMappingEntityAttribute", false);
3182     this.entityAttributesSqlMappingExpression = this.retrieveConfigString("entityResolver.sqlMappingExpression", false);
3183     this.entityAttributesLastUpdatedColumn = this.retrieveConfigString("entityResolver.lastUpdatedColumn", false);
3184     this.entityAttributesLastUpdatedType = this.retrieveConfigString("entityResolver.lastUpdatedType", false);
3185     
3186     this.entityAttributesLdapExternalSystem = this.retrieveConfigString("entityResolver.ldapConfigId", false);
3187     this.entityAttributesLdapBaseDn = this.retrieveConfigString("entityResolver.baseDN", false);
3188     this.entityAttributesLdapSubjectSource = this.retrieveConfigString("entityResolver.subjectSourceId", false);
3189     this.entityAttributesLdapSearchScope = this.retrieveConfigString("entityResolver.searchScope", false);
3190     this.entityAttributesLdapFilterPart = this.retrieveConfigString("entityResolver.filterPart", false);
3191     this.entityAttributesLdapAttributes = this.retrieveConfigString("entityResolver.attributes", false);
3192     this.entityAttributesLdapMutliValuedAttributes = this.retrieveConfigString("entityResolver.multiValuedLdapAttributes", false);
3193     this.entityAttributesLdapMatchingSearchAttribute = this.retrieveConfigString("entityResolver.ldapMatchingSearchAttribute", false);
3194     this.entityAttributesLdapMappingType = this.retrieveConfigString("entityResolver.ldapMappingType", false);
3195     this.entityAttributesLdapMappingEntityAttribute = this.retrieveConfigString("entityResolver.ldapMappingEntityAttribute", false);
3196     this.entityAttributesLdapMatchingExpression = this.retrieveConfigString("entityResolver.ldapMatchingExpression", false);
3197     this.entityAttributesLdapLastUpdatedAttribute = this.retrieveConfigString("entityResolver.lastUpdatedAttribute", false);
3198     this.entityAttributesLdapLastUpdatedAttributeFormat = this.retrieveConfigString("entityResolver.lastUpdatedFormat", false);
3199     
3200     this.hasGroupAttributes = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupResolver.groupResolverAttributes", false), false);
3201     this.resolveGroupAttributesWithSql = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupResolver.resolveAttributesWithSQL", false), false);
3202     this.groupAttributesSqlExternalSystem = this.retrieveConfigString("groupResolver.sqlConfigId", false);
3203     this.groupAttributesTableViewName = this.retrieveConfigString("groupResolver.tableOrViewName", false);
3204     this.groupAttributesColumnNames = this.retrieveConfigString("groupResolver.columnNames", false);
3205     this.groupAttributesTableStructure = this.retrieveConfigString("groupResolver.tableStructure", false);
3206     this.groupAttributesAttributeNameColumnName = this.retrieveConfigString("groupResolver.attributeNameColumnName", false);
3207     this.groupAttributesAttributeValueColumnName = this.retrieveConfigString("groupResolver.attributeValueColumnName", false);
3208     this.groupAttributesGroupMatchingColumn = this.retrieveConfigString("groupResolver.groupMatchingColumn", false);
3209     this.groupAttributesLastUpdatedColumn = this.retrieveConfigString("groupResolver.lastUpdatedColumn", false);
3210     this.groupAttributesLastUpdatedType = this.retrieveConfigString("groupResolver.lastUpdatedType", false);
3211     this.groupAttributesRecalcMembershipsOnIncremental = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupResolver.recalcMembershipsOnIncremental", false), false);
3212     this.groupAttributesSelectAllSqlOnFull = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupResolver.selectAllSQLOnFull", false), false);
3213     
3214     
3215     this.threadPoolSize = GrouperUtil.intValue(this.retrieveConfigInt("threadPoolSize", false), 5);
3216     if (this.threadPoolSize < 1) {
3217       this.threadPoolSize = 1;
3218     }
3219     
3220     if (this.entityAttributesMultivalued == null) {
3221       this.entityAttributesMultivalued = new HashSet<String>();
3222     }
3223     
3224     if (this.groupAttributesMultivalued == null) {
3225       this.groupAttributesMultivalued = new HashSet<String>(); 
3226     }
3227 
3228     this.groupSelectAttributes = new HashSet<String>();
3229 
3230     for (String targetGroupAttributeName : this.targetGroupAttributeNameToConfig.keySet()) {
3231       GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = targetGroupAttributeNameToConfig.get(targetGroupAttributeName);
3232       if (grouperProvisioningConfigurationAttribute.isSelect()) {
3233         this.groupSelectAttributes.add(targetGroupAttributeName);
3234       }
3235       
3236       if (!StringUtils.isBlank(this.groupMembershipAttributeName) && StringUtils.equals(this.groupMembershipAttributeName, grouperProvisioningConfigurationAttribute.getName())) {
3237         this.attributeNameForMemberships = targetGroupAttributeName;
3238         grouperProvisioningConfigurationAttribute.setSelect(this.isSelectMemberships());
3239         grouperProvisioningConfigurationAttribute.setInsert(this.isInsertMemberships());
3240       }
3241       
3242       if (grouperProvisioningConfigurationAttribute.isMultiValued()) {
3243         this.groupAttributesMultivalued.add(targetGroupAttributeName);
3244       }
3245     }
3246 
3247     this.entityMatchingAttributeSameAsSearchAttribute = GrouperUtil.booleanValue(this.retrieveConfigBoolean("entityMatchingAttributeSameAsSearchAttribute", false), true);
3248     int entityMatchingAttributeCount = GrouperUtil.intValue(this.retrieveConfigInt("entityMatchingAttributeCount", false), 0);
3249     this.entityMatchingAttributes = new ArrayList<GrouperProvisioningConfigurationAttribute>();
3250     this.entitySearchAttributes = new ArrayList<GrouperProvisioningConfigurationAttribute>();
3251     for (int i=0;i<entityMatchingAttributeCount;i++) {
3252       String configSuffix = "entityMatchingAttribute" + i + "name";
3253       String matchingAttributeName = this.retrieveConfigString(configSuffix, true);
3254       GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = this.targetEntityAttributeNameToConfig.get(matchingAttributeName);
3255       if (grouperProvisioningConfigurationAttribute == null) {
3256         throw new RuntimeException("Cannot find entity attribute from " + configSuffix + "! '" + matchingAttributeName + "'");
3257       }
3258       this.entityMatchingAttributes.add(grouperProvisioningConfigurationAttribute);
3259       if (entityMatchingAttributeSameAsSearchAttribute) {
3260         this.entitySearchAttributes.add(grouperProvisioningConfigurationAttribute);
3261       }
3262     }
3263     
3264     if (!entityMatchingAttributeSameAsSearchAttribute) {
3265       int entitySearchAttributeCount = this.retrieveConfigInt("entitySearchAttributeCount", true);
3266       for (int i=0;i<entitySearchAttributeCount;i++) {
3267         String configSuffix = "entitySearchAttribute" + i + "name";
3268         String searchAttributeName = this.retrieveConfigString(configSuffix, true);
3269         GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = this.targetEntityAttributeNameToConfig.get(searchAttributeName);
3270         if (grouperProvisioningConfigurationAttribute == null) {
3271           throw new RuntimeException("Cannot find entity attribute from " + configSuffix + "! '" + searchAttributeName + "'");
3272         }
3273         this.entitySearchAttributes.add(grouperProvisioningConfigurationAttribute);
3274       }
3275     }
3276 
3277     this.groupMatchingAttributeSameAsSearchAttribute = GrouperUtil.booleanValue(this.retrieveConfigBoolean("groupMatchingAttributeSameAsSearchAttribute", false), true);
3278     int groupMatchingAttributeCount = GrouperUtil.intValue(this.retrieveConfigInt("groupMatchingAttributeCount", false), 0);
3279     this.groupMatchingAttributes = new ArrayList<GrouperProvisioningConfigurationAttribute>();
3280     this.groupSearchAttributes = new ArrayList<GrouperProvisioningConfigurationAttribute>();
3281     for (int i=0;i<groupMatchingAttributeCount;i++) {
3282       String configSuffix = "groupMatchingAttribute" + i + "name";
3283       String matchingAttributeName = this.retrieveConfigString(configSuffix, true);
3284       GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = this.targetGroupAttributeNameToConfig.get(matchingAttributeName);
3285       if (grouperProvisioningConfigurationAttribute == null) {
3286         throw new RuntimeException("Cannot find group attribute from " + configSuffix + "! '" + matchingAttributeName + "'");
3287       }
3288       this.groupMatchingAttributes.add(grouperProvisioningConfigurationAttribute);
3289       if (groupMatchingAttributeSameAsSearchAttribute) {
3290         this.groupSearchAttributes.add(grouperProvisioningConfigurationAttribute);
3291       }
3292     }
3293     
3294     if (!groupMatchingAttributeSameAsSearchAttribute) {
3295       int groupSearchAttributeCount = this.retrieveConfigInt("groupSearchAttributeCount", true);
3296       for (int i=0;i<groupSearchAttributeCount;i++) {
3297         String configSuffix = "groupSearchAttribute" + i + "name";
3298         String searchAttributeName = this.retrieveConfigString(configSuffix, true);
3299         GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = this.targetGroupAttributeNameToConfig.get(searchAttributeName);
3300         if (grouperProvisioningConfigurationAttribute == null) {
3301           throw new RuntimeException("Cannot find group attribute from " + configSuffix + "! '" + searchAttributeName + "'");
3302         }
3303         this.groupSearchAttributes.add(grouperProvisioningConfigurationAttribute);
3304       }
3305     }
3306 
3307     this.entitySelectAttributes = new HashSet<String>();
3308     for (String targetEntityAttributeName : this.targetEntityAttributeNameToConfig.keySet()) {
3309       GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = targetEntityAttributeNameToConfig.get(targetEntityAttributeName);
3310       if (grouperProvisioningConfigurationAttribute.isSelect()) {
3311         this.entitySelectAttributes.add(targetEntityAttributeName);
3312       }
3313       
3314       if (!StringUtils.isBlank(this.entityMembershipAttributeName) 
3315           && StringUtils.equals(this.entityMembershipAttributeName, grouperProvisioningConfigurationAttribute.getName())) {
3316         this.attributeNameForMemberships = targetEntityAttributeName;
3317         grouperProvisioningConfigurationAttribute.setSelect(this.isSelectMemberships());
3318         grouperProvisioningConfigurationAttribute.setInsert(this.isInsertMemberships());
3319       }
3320       
3321       if (grouperProvisioningConfigurationAttribute.isMultiValued()) {
3322         this.entityAttributesMultivalued.add(targetEntityAttributeName);
3323       }
3324 
3325     }
3326 
3327     this.recalculateAllOperations = GrouperUtil.booleanValue(this.retrieveConfigBoolean("recalculateAllOperations", false), false);
3328     
3329     if (this.recalculateAllOperations) {
3330       this.onlyAddMembershipsIfUserExistsInTarget = GrouperUtil.booleanValue(this.retrieveConfigBoolean("onlyAddMembershipsIfUserExistsInTarget", false), false);
3331     }
3332     
3333     this.readOnly = GrouperUtil.booleanValue(this.retrieveConfigBoolean("readOnly", false), false);
3334 
3335     this.runLogicInIncrementalDaemon = GrouperUtil.booleanValue(this.retrieveConfigBoolean("runLogicInIncrementalDaemon", false), true);
3336     this.runLogicInFullDaemon = GrouperUtil.booleanValue(this.retrieveConfigBoolean("runLogicInFullDaemon", false), true);
3337 
3338     {
3339       String grouperProvisioningMembershipFieldTypeString = this.retrieveConfigString("membershipFields", false);
3340       if (StringUtils.isBlank(grouperProvisioningMembershipFieldTypeString) || StringUtils.equalsIgnoreCase("members", grouperProvisioningMembershipFieldTypeString)) {
3341         this.grouperProvisioningMembershipFieldType = GrouperProvisioningMembershipFieldType.members;
3342       } else if (StringUtils.equals("admin", grouperProvisioningMembershipFieldTypeString)) {
3343         this.grouperProvisioningMembershipFieldType = GrouperProvisioningMembershipFieldType.admin;
3344       } else if (StringUtils.equals("read,admin", grouperProvisioningMembershipFieldTypeString)) {
3345         this.grouperProvisioningMembershipFieldType = GrouperProvisioningMembershipFieldType.readAdmin;
3346       } else if (StringUtils.equals("update,admin", grouperProvisioningMembershipFieldTypeString)) {
3347         this.grouperProvisioningMembershipFieldType = GrouperProvisioningMembershipFieldType.updateAdmin;
3348       } else {
3349         throw new RuntimeException("Invalid GrouperProvisioningMembershipFieldType: '" + grouperProvisioningMembershipFieldTypeString + "'");
3350       }
3351     }
3352     
3353     for (String configItem : new String[] {"grouperToTargetTranslationMembership", "grouperToTargetTranslationEntity",
3354         "grouperToTargetTranslationGroup", "grouperToTargetTranslationGroupCreateOnly"}) {
3355       String key = GrouperUtil.stripPrefix(configItem, "grouperToTargetTranslation");
3356       for (int i=0; i<= 1000; i++) {
3357         
3358         String script = this.retrieveConfigString(configItem + "."+i+".script" , false);
3359         if (StringUtils.isBlank(script)) {
3360           break;
3361         }
3362         List<String> scripts = this.grouperProvisioningToTargetTranslation.get(key);
3363         if (scripts == null) {
3364           scripts = new ArrayList<String>();
3365           this.grouperProvisioningToTargetTranslation.put(key, scripts);
3366         }
3367         scripts.add(script);
3368         
3369       }
3370       
3371     }
3372     
3373     this.subjectIdentifierForMemberSyncTable = this.retrieveConfigString("subjectIdentifierForMemberSyncTable", false);
3374         
3375     // diagnostics settings
3376     this.diagnosticsGroupsAllSelect = this.retrieveConfigBoolean("selectAllGroupsDuringDiagnostics", false);
3377     this.diagnosticsEntitiesAllSelect = this.retrieveConfigBoolean("selectAllEntitiesDuringDiagnostics", false);
3378     this.diagnosticsMembershipsAllSelect = this.retrieveConfigBoolean("selectAllMembershipsDuringDiagnostics", false);
3379     this.diagnosticsGroupName = this.retrieveConfigString("testGroupName", false);
3380     this.diagnosticsSubjectIdOrIdentifier = this.retrieveConfigString("testSubjectIdOrIdentifier", false);
3381     this.createGroupDuringDiagnostics = this.retrieveConfigBoolean("createGroupDuringDiagnostics", false);
3382     this.deleteGroupDuringDiagnostics = this.retrieveConfigBoolean("deleteGroupDuringDiagnostics", false);
3383     this.createEntityDuringDiagnostics = this.retrieveConfigBoolean("createEntityDuringDiagnostics", false);
3384     this.deleteEntityDuringDiagnostics = this.retrieveConfigBoolean("deleteEntityDuringDiagnostics", false);
3385     this.createMembershipDuringDiagnostics = this.retrieveConfigBoolean("createMembershipDuringDiagnostics", false);
3386     this.deleteMembershipDuringDiagnostics = this.retrieveConfigBoolean("deleteMembershipDuringDiagnostics", false);
3387     
3388     //register metadata
3389     this.getGrouperProvisioner().retrieveGrouperProvisioningObjectMetadata().appendMetadataItemsFromConfig(this.metadataNameToMetadataItem.values());
3390     
3391     if (this.isSelectMemberships() || isInsertMemberships() || isDeleteMemberships()) {
3392       
3393       // "id", "email", "loginid", "memberId", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "name", "subjectId", "subjectSourceId", "description", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2"
3394       //  configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.name", "subject_id");
3395       //  configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateExpressionType", "grouperProvisioningEntityField");
3396       //  configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.1.translateFromGrouperProvisioningEntityField", "subjectId");
3397       for (String entityMapping : new String[] {"memberId", "subjectId", "subjectIdentifier0", "subjectIdentifier1", "subjectIdentifier2", "email", "loginid", "entityAttributeValueCache0", "entityAttributeValueCache1", "entityAttributeValueCache2", "entityAttributeValueCache3", "id", "idIndex"}) {
3398         for (String name: getTargetMembershipAttributeNameToConfig().keySet()) {
3399           
3400           GrouperProvisioningConfigurationAttributeouperProvisioningConfigurationAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = (GrouperProvisioningConfigurationAttribute) this.getTargetMembershipAttributeNameToConfig().get(name);
3401           
3402           if (StringUtils.equals(entityMapping, grouperProvisioningConfigurationAttribute.getTranslateFromGrouperProvisioningEntityField())) {
3403             if (StringUtils.isBlank(membershipEntityMatchingIdAttribute)) {
3404               membershipEntityMatchingIdAttribute = name;
3405             }
3406             if (StringUtils.isBlank(membershipEntityMatchingIdGrouperAttribute)) {
3407               membershipEntityMatchingIdGrouperAttribute = entityMapping;
3408             }
3409           }
3410           
3411         }
3412         
3413       }
3414       // "id", "idIndex", "idIndexString", "displayExtension", "displayName", "extension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3", "name", "description"
3415       //  configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.name", "group_name");
3416       //  configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.translateFromGrouperProvisioningGroupField", "name");
3417       //  configureProvisionerSuffix(provisioningTestConfigInput, "targetMembershipAttribute.0.translateExpressionType", "grouperProvisioningGroupField");
3418       for (String groupMapping : new String[] {"id", "idIndex", "idIndexString", "name", "displayName", "extension", "displayExtension", "groupAttributeValueCache0", "groupAttributeValueCache1", "groupAttributeValueCache2", "groupAttributeValueCache3"}) {
3419         for (String name: getTargetMembershipAttributeNameToConfig().keySet()) {
3420           
3421           GrouperProvisioningConfigurationAttributeouperProvisioningConfigurationAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute grouperProvisioningConfigurationAttribute = (GrouperProvisioningConfigurationAttribute) this.getTargetMembershipAttributeNameToConfig().get(name);
3422           
3423           if (StringUtils.equals(groupMapping, grouperProvisioningConfigurationAttribute.getTranslateFromGrouperProvisioningGroupField())) {
3424             if (StringUtils.isBlank(membershipGroupMatchingIdAttribute)) {
3425               membershipGroupMatchingIdAttribute = name;
3426             }
3427             if (StringUtils.isBlank(membershipGroupMatchingIdGrouperAttribute)) {
3428               membershipGroupMatchingIdGrouperAttribute = groupMapping;
3429             }
3430           }
3431           
3432         }
3433         
3434       }
3435     }
3436     
3437 
3438     assignAutoTranslatedGroupsConfiguration();
3439 
3440     assignAutoTranslatedEntitiesConfiguration();
3441     
3442   }
3443   
3444   private boolean groupMatchingAttributeSameAsSearchAttribute;
3445   
3446   
3447   
3448   public boolean isGroupMatchingAttributeSameAsSearchAttribute() {
3449     return groupMatchingAttributeSameAsSearchAttribute;
3450   }
3451 
3452   private boolean entityMatchingAttributeSameAsSearchAttribute;
3453   
3454   
3455   
3456   public boolean isEntityMatchingAttributeSameAsSearchAttribute() {
3457     return entityMatchingAttributeSameAsSearchAttribute;
3458   }
3459 
3460   public boolean isGroupsRequireMembers() {
3461     return groupsRequireMembers;
3462   }
3463 
3464   private boolean groupAttributeValueCacheHas;
3465 
3466   public boolean isGroupAttributeValueCacheHas() {
3467     return groupAttributeValueCacheHas;
3468   }
3469 
3470   private Boolean entityAttributeValueCacheHas;
3471 
3472   public boolean isEntityAttributeValueCacheHas() {
3473     return entityAttributeValueCacheHas;
3474   }
3475 
3476   private GrouperProvisioningConfigurationAttributeDbCacheAttributeDbCache.html#GrouperProvisioningConfigurationAttributeDbCache">GrouperProvisioningConfigurationAttributeDbCache[] groupAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4];
3477   
3478   public GrouperProvisioningConfigurationAttributeDbCache[] getGroupAttributeDbCaches() {
3479     return groupAttributeDbCaches;
3480   }
3481 
3482   private GrouperProvisioningConfigurationAttributeDbCachettributeDbCache.html#GrouperProvisioningConfigurationAttributeDbCache">GrouperProvisioningConfigurationAttributeDbCache[] entityAttributeDbCaches = new GrouperProvisioningConfigurationAttributeDbCache[4];
3483   
3484   public GrouperProvisioningConfigurationAttributeDbCache[] getEntityAttributeDbCaches() {
3485     return entityAttributeDbCaches;
3486   }
3487 
3488   
3489   private void assignAutoTranslatedGroupsConfiguration() {
3490     
3491     if (this.getGrouperProvisioner().retrieveGrouperProvisioningTranslator().isTranslateGrouperToTargetAutomatically()) {
3492       
3493       if (this.targetGroupAttributeNameToConfig.size() == 0) {
3494         
3495         GrouperProvisioningConfigurationAttributeationAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute nameConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3496         nameConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3497         nameConfigurationAttribute.setUpdate(this.isUpdateGroups());
3498         nameConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.group);
3499         nameConfigurationAttribute.setInsert(this.isInsertGroups());
3500         nameConfigurationAttribute.setName("name");
3501         nameConfigurationAttribute.setSelect(this.isSelectGroups());
3502         nameConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3503         nameConfigurationAttribute.setTranslateFromGrouperProvisioningGroupField("name");
3504         this.targetGroupAttributeNameToConfig.put("name", nameConfigurationAttribute);
3505         
3506         GrouperProvisioningConfigurationAttributetribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute displayNameConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3507         displayNameConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3508         displayNameConfigurationAttribute.setUpdate(this.isUpdateGroups());
3509         displayNameConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.group);
3510         displayNameConfigurationAttribute.setInsert(this.isInsertGroups());
3511         displayNameConfigurationAttribute.setName("displayName");
3512         displayNameConfigurationAttribute.setSelect(this.isSelectGroups());
3513         displayNameConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3514         displayNameConfigurationAttribute.setTranslateFromGrouperProvisioningGroupField("displayName");
3515         this.targetGroupAttributeNameToConfig.put("displayName", displayNameConfigurationAttribute);
3516         
3517         GrouperProvisioningConfigurationAttributeonAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute idIndexConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3518         idIndexConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3519         idIndexConfigurationAttribute.setUpdate(this.isUpdateGroups());
3520         idIndexConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.group);
3521         idIndexConfigurationAttribute.setInsert(this.isInsertGroups());
3522         idIndexConfigurationAttribute.setName("idIndex");
3523         idIndexConfigurationAttribute.setSelect(this.isSelectGroups());
3524         idIndexConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3525         idIndexConfigurationAttribute.setTranslateFromGrouperProvisioningGroupField("idIndex");
3526         this.targetGroupAttributeNameToConfig.put("idIndex", idIndexConfigurationAttribute);
3527         
3528         
3529         GrouperProvisioningConfigurationAttributetribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute descriptionConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3530         descriptionConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3531         descriptionConfigurationAttribute.setUpdate(this.isUpdateGroups());
3532         descriptionConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.group);
3533         descriptionConfigurationAttribute.setInsert(this.isInsertGroups());
3534         descriptionConfigurationAttribute.setName("description");
3535         descriptionConfigurationAttribute.setSelect(this.isSelectGroups());
3536         descriptionConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3537         descriptionConfigurationAttribute.setTranslateFromGrouperProvisioningGroupField("description");
3538         this.targetGroupAttributeNameToConfig.put("description", descriptionConfigurationAttribute);
3539         
3540       }
3541       
3542     }
3543   }
3544   
3545   private void assignAutoTranslatedEntitiesConfiguration() {
3546     
3547     if (this.getGrouperProvisioner().retrieveGrouperProvisioningTranslator().isTranslateGrouperToTargetAutomatically()) {
3548       
3549       if (this.targetEntityAttributeNameToConfig.size() == 0) {
3550         
3551         GrouperProvisioningConfigurationAttributeurationAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute idConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3552         idConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3553         idConfigurationAttribute.setUpdate(this.isUpdateEntities());
3554         idConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3555         idConfigurationAttribute.setInsert(this.isInsertEntities());
3556         idConfigurationAttribute.setName("id");
3557         idConfigurationAttribute.setSelect(this.isSelectEntities());
3558         idConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3559         idConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("id");
3560         this.targetEntityAttributeNameToConfig.put("id", idConfigurationAttribute);
3561         
3562         GrouperProvisioningConfigurationAttributeationAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute nameConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3563         nameConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3564         nameConfigurationAttribute.setUpdate(this.isUpdateEntities());
3565         nameConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3566         nameConfigurationAttribute.setInsert(this.isInsertEntities());
3567         nameConfigurationAttribute.setName("name");
3568         nameConfigurationAttribute.setSelect(this.isSelectEntities());
3569         nameConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3570         nameConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("name");
3571         this.targetEntityAttributeNameToConfig.put("name", nameConfigurationAttribute);
3572         
3573         GrouperProvisioningConfigurationAttributeAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute subjectIdConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3574         subjectIdConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3575         subjectIdConfigurationAttribute.setUpdate(this.isUpdateEntities());
3576         subjectIdConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3577         subjectIdConfigurationAttribute.setInsert(this.isInsertEntities());
3578         subjectIdConfigurationAttribute.setName("subjectId");
3579         subjectIdConfigurationAttribute.setSelect(this.isSelectEntities());
3580         subjectIdConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3581         subjectIdConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("subjectId");
3582         this.targetEntityAttributeNameToConfig.put("subjectId", subjectIdConfigurationAttribute);
3583         
3584         GrouperProvisioningConfigurationAttributetribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute descriptionConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3585         descriptionConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3586         descriptionConfigurationAttribute.setUpdate(this.isUpdateEntities());
3587         descriptionConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3588         descriptionConfigurationAttribute.setInsert(this.isInsertEntities());
3589         descriptionConfigurationAttribute.setName("description");
3590         descriptionConfigurationAttribute.setSelect(this.isSelectEntities());
3591         descriptionConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3592         descriptionConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("description");
3593         this.targetEntityAttributeNameToConfig.put("description", descriptionConfigurationAttribute);
3594         
3595         GrouperProvisioningConfigurationAttributeute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute subjectSourceIdConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3596         subjectSourceIdConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3597         subjectSourceIdConfigurationAttribute.setUpdate(this.isUpdateEntities());
3598         subjectSourceIdConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3599         subjectSourceIdConfigurationAttribute.setInsert(this.isInsertEntities());
3600         subjectSourceIdConfigurationAttribute.setName("subjectSourceId");
3601         subjectSourceIdConfigurationAttribute.setSelect(this.isSelectEntities());
3602         subjectSourceIdConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3603         subjectSourceIdConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("subjectSourceId");
3604         this.targetEntityAttributeNameToConfig.put("subjectSourceId", subjectSourceIdConfigurationAttribute);
3605         
3606         GrouperProvisioningConfigurationAttributee.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute subjectIdetifier0ConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3607         subjectIdetifier0ConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3608         subjectIdetifier0ConfigurationAttribute.setUpdate(this.isUpdateEntities());
3609         subjectIdetifier0ConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3610         subjectIdetifier0ConfigurationAttribute.setInsert(this.isInsertEntities());
3611         subjectIdetifier0ConfigurationAttribute.setName("subjectIdentifier0");
3612         subjectIdetifier0ConfigurationAttribute.setSelect(this.isSelectEntities());
3613         subjectIdetifier0ConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3614         subjectIdetifier0ConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("subjectIdentifier0");
3615         this.targetEntityAttributeNameToConfig.put("subjectIdentifier0", subjectIdetifier0ConfigurationAttribute);
3616         
3617         GrouperProvisioningConfigurationAttributee.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute subjectIdetifier1ConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3618         subjectIdetifier1ConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3619         subjectIdetifier1ConfigurationAttribute.setUpdate(this.isUpdateEntities());
3620         subjectIdetifier1ConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3621         subjectIdetifier1ConfigurationAttribute.setInsert(this.isInsertEntities());
3622         subjectIdetifier1ConfigurationAttribute.setName("subjectIdentifier1");
3623         subjectIdetifier1ConfigurationAttribute.setSelect(this.isSelectEntities());
3624         subjectIdetifier1ConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3625         subjectIdetifier1ConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("subjectIdentifier1");
3626         this.targetEntityAttributeNameToConfig.put("subjectIdentifier1", subjectIdetifier1ConfigurationAttribute);
3627         
3628         GrouperProvisioningConfigurationAttributee.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute subjectIdetifier2ConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3629         subjectIdetifier2ConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3630         subjectIdetifier2ConfigurationAttribute.setUpdate(this.isUpdateEntities());
3631         subjectIdetifier2ConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3632         subjectIdetifier2ConfigurationAttribute.setInsert(this.isInsertEntities());
3633         subjectIdetifier2ConfigurationAttribute.setName("subjectIdentifier2");
3634         subjectIdetifier2ConfigurationAttribute.setSelect(this.isSelectEntities());
3635         subjectIdetifier2ConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3636         subjectIdetifier2ConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("subjectIdentifier2");
3637         this.targetEntityAttributeNameToConfig.put("subjectIdentifier2", subjectIdetifier2ConfigurationAttribute);
3638         
3639         GrouperProvisioningConfigurationAttributeonAttribute.html#GrouperProvisioningConfigurationAttribute">GrouperProvisioningConfigurationAttribute idIndexConfigurationAttribute = new GrouperProvisioningConfigurationAttribute();
3640         idIndexConfigurationAttribute.setGrouperProvisioner(grouperProvisioner);
3641         idIndexConfigurationAttribute.setUpdate(this.isUpdateEntities());
3642         idIndexConfigurationAttribute.setGrouperProvisioningConfigurationAttributeType(GrouperProvisioningConfigurationAttributeType.entity);
3643         idIndexConfigurationAttribute.setInsert(this.isInsertEntities());
3644         idIndexConfigurationAttribute.setName("idIndex");
3645         idIndexConfigurationAttribute.setSelect(this.isSelectEntities());
3646         idIndexConfigurationAttribute.setValueType(GrouperProvisioningConfigurationAttributeValueType.STRING);
3647         idIndexConfigurationAttribute.setTranslateFromGrouperProvisioningEntityField("idIndex");
3648         this.targetEntityAttributeNameToConfig.put("idIndex", idIndexConfigurationAttribute);
3649       }
3650       
3651     }
3652   }
3653   
3654   /**
3655    * operate on grouper entities
3656    */
3657   private boolean operateOnGrouperEntities;
3658   
3659   /**
3660    * operate on grouper memberships
3661    */
3662   private boolean operateOnGrouperMemberships;
3663   
3664   /**
3665    * operate on grouper groups
3666    */
3667   private boolean operateOnGrouperGroups;
3668   
3669   /**
3670    * operate on grouper entities
3671    * @return is operate
3672    */
3673   public boolean isOperateOnGrouperEntities() {
3674     return operateOnGrouperEntities;
3675   }
3676 
3677   /**
3678    * operate on grouper entities
3679    * @return is operate
3680    */
3681   public boolean isOperateOnGrouperMemberships() {
3682     return operateOnGrouperMemberships;
3683   }
3684 
3685   
3686   public boolean isOperateOnGrouperGroups() {
3687     return operateOnGrouperGroups;
3688   }
3689 
3690   public boolean isRecalculateAllOperations() {
3691     return recalculateAllOperations;
3692   }
3693 
3694   
3695   public void setRecalculateAllOperations(boolean recalculateAllOperations) {
3696     this.recalculateAllOperations = recalculateAllOperations;
3697   }
3698 
3699   /**
3700    * no need to configure twice if the caller needs to configure before provisioning
3701    */
3702   private boolean configured = false;
3703 
3704   /**
3705    * attribute name to config
3706    */
3707   private Map<String, GrouperProvisioningConfigurationAttribute> targetEntityAttributeNameToConfig = new LinkedHashMap<String, GrouperProvisioningConfigurationAttribute>();
3708 
3709   /**
3710    * attribute name to config
3711    */
3712   private Map<String, GrouperProvisioningConfigurationAttribute> targetMembershipAttributeNameToConfig = new LinkedHashMap<String, GrouperProvisioningConfigurationAttribute>();
3713 
3714   /**
3715    * grouper attribute from GrouperProvisioningEntity that maps to the value in membershipEntityMatchingIdAttribute
3716    */
3717   protected String membershipEntityMatchingIdGrouperAttribute;
3718 
3719   /**
3720    * membership attribute that matches entities
3721    */
3722   protected String membershipEntityMatchingIdAttribute;
3723 
3724   
3725   public void setMembershipEntityMatchingIdGrouperAttribute(
3726       String membershipEntityMatchingIdGrouperAttribute) {
3727     this.membershipEntityMatchingIdGrouperAttribute = membershipEntityMatchingIdGrouperAttribute;
3728   }
3729 
3730   
3731   public void setMembershipEntityMatchingIdAttribute(
3732       String membershipEntityMatchingIdAttribute) {
3733     this.membershipEntityMatchingIdAttribute = membershipEntityMatchingIdAttribute;
3734   }
3735 
3736   
3737   public void setMembershipGroupMatchingIdAttribute(
3738       String membershipGroupMatchingIdAttribute) {
3739     this.membershipGroupMatchingIdAttribute = membershipGroupMatchingIdAttribute;
3740   }
3741 
3742   
3743   public void setMembershipGroupMatchingIdGrouperAttribute(
3744       String membershipGroupMatchingIdGrouperAttribute) {
3745     this.membershipGroupMatchingIdGrouperAttribute = membershipGroupMatchingIdGrouperAttribute;
3746   }
3747 
3748   /**
3749    * grouper attribute from GrouperProvisioningGroup that maps to the value in membershipGroupMatchingIdAttribute
3750    */
3751   protected String membershipGroupMatchingIdAttribute;
3752 
3753   /**
3754    * membership attribute that matches groups
3755    */
3756   protected String membershipGroupMatchingIdGrouperAttribute;
3757 
3758 
3759   /**
3760    * grouper attribute from GrouperProvisioningEntity that maps to the value in membershipEntityMatchingIdAttribute
3761    * @return
3762    */
3763   public String getMembershipEntityMatchingIdGrouperAttribute() {
3764     return membershipEntityMatchingIdGrouperAttribute;
3765   }
3766 
3767   /**
3768    * grouper attribute from GrouperProvisioningGroup that maps to the value in membershipGroupMatchingIdAttribute
3769    * @return
3770    */
3771   public String getMembershipGroupMatchingIdGrouperAttribute() {
3772     return membershipGroupMatchingIdGrouperAttribute;
3773   }
3774 
3775   public Map<String, GrouperProvisioningConfigurationAttribute> getTargetMembershipAttributeNameToConfig() {
3776     return targetMembershipAttributeNameToConfig;
3777   }
3778 
3779   
3780   public Map<String, GrouperProvisioningConfigurationAttribute> getTargetEntityAttributeNameToConfig() {
3781     return targetEntityAttributeNameToConfig;
3782   }
3783 
3784   
3785 
3786   /**
3787    * configure the provisioner, call super if subclassing
3788    */
3789   public void configureProvisioner() {
3790     
3791     if (this.configured) {
3792       return;
3793     }
3794     try {
3795     
3796       this.preConfigure();
3797     
3798       this.configureGenericSettings();
3799       
3800       this.configureSpecificSettings();
3801       
3802     } catch (RuntimeException re) {
3803       if (this.grouperProvisioner != null && this.grouperProvisioner.getGcGrouperSyncLog() != null) {
3804         try {
3805           this.grouperProvisioner.getGcGrouperSyncLog().setStatus(GcGrouperSyncLogState.CONFIG_ERROR);
3806           this.grouperProvisioner.getGcGrouperSync().getGcGrouperSyncLogDao().internal_logStore(this.grouperProvisioner.getGcGrouperSyncLog());
3807         } catch (RuntimeException re2) {
3808           GrouperClientUtils.injectInException(re, "***** START ANOTHER EXCEPTON *******" + GrouperClientUtils.getFullStackTrace(re2) + "***** END ANOTHER EXCEPTON *******");
3809         }
3810       }
3811       throw re;
3812     }
3813 
3814     this.configured = true;
3815   }
3816 
3817   
3818   
3819   public boolean isConfigured() {
3820     return configured;
3821   }
3822 
3823 
3824 
3825   public Map<String, Object> getDebugMap() {
3826     return debugMap;
3827   }
3828 
3829   
3830   public void setDebugMap(Map<String, Object> debugMap) {
3831     this.debugMap = debugMap;
3832   }
3833 
3834   
3835   
3836   public boolean isHasTargetGroupLink() {
3837     return hasTargetGroupLink;
3838   }
3839 
3840   
3841   public void setHasTargetGroupLink(boolean hasTargetGroupLink) {
3842     this.hasTargetGroupLink = hasTargetGroupLink;
3843   }
3844 
3845   
3846   public boolean isHasTargetEntityLink() {
3847     return hasTargetEntityLink;
3848   }
3849 
3850   
3851   public void setHasTargetEntityLink(boolean hasTargetEntityLink) {
3852     this.hasTargetEntityLink = hasTargetEntityLink;
3853   }
3854   
3855   public Set<String> getSubjectSourcesToProvision() {
3856     return subjectSourcesToProvision;
3857   }
3858 
3859   
3860   public void setSubjectSourcesToProvision(Set<String> subjectSourcesToProvision) {
3861     this.subjectSourcesToProvision = subjectSourcesToProvision;
3862   }
3863   
3864   public List<GrouperProvisioningConfigurationAttribute> getEntitySearchAttributes() {
3865     return entitySearchAttributes;
3866   }
3867 
3868   
3869   public void setEntitySearchAttributes(List<GrouperProvisioningConfigurationAttribute> userSearchAttributes ) {
3870     this.entitySearchAttributes = userSearchAttributes;
3871   }
3872 
3873   
3874   public List<GrouperProvisioningConfigurationAttribute> getGroupSearchAttributes() {
3875     return groupSearchAttributes;
3876   }
3877 
3878   public void setGroupSearchAttributes(List<GrouperProvisioningConfigurationAttribute> groupSearchAttributes) {
3879     this.groupSearchAttributes = groupSearchAttributes;
3880   }
3881 
3882   
3883   public Set<String> getEntityAttributesMultivalued() {
3884     return entityAttributesMultivalued;
3885   }
3886 
3887   
3888   public void setEntityAttributesMultivalued(Set<String> userAttributesMultivalued) {
3889     this.entityAttributesMultivalued = userAttributesMultivalued;
3890   }
3891 
3892   
3893   public Set<String> getGroupAttributesMultivalued() {
3894     return groupAttributesMultivalued;
3895   }
3896 
3897   
3898   public void setGroupAttributesMultivalued(Set<String> groupAttributesMultivalued) {
3899     this.groupAttributesMultivalued = groupAttributesMultivalued;
3900   }
3901 
3902   public boolean isInsertEntities() {
3903     return insertEntities;
3904   }
3905 
3906   
3907   public void setInsertEntities(boolean insertEntities) {
3908     this.insertEntities = insertEntities;
3909   }
3910 
3911   
3912   public boolean isInsertGroups() {
3913     return insertGroups;
3914   }
3915 
3916   
3917   public void setInsertGroups(boolean insertGroups) {
3918     this.insertGroups = insertGroups;
3919   }
3920 
3921   
3922   
3923   public boolean isDeleteGroupsIfNotExistInGrouper() {
3924     return deleteGroupsIfNotExistInGrouper;
3925   }
3926 
3927   
3928   public void setDeleteGroupsIfNotExistInGrouper(boolean deleteGroupsIfNotExistInGrouper) {
3929     this.deleteGroupsIfNotExistInGrouper = deleteGroupsIfNotExistInGrouper;
3930   }
3931 
3932 
3933   public boolean isDeleteGroupsIfGrouperDeleted() {
3934     return deleteGroupsIfGrouperDeleted;
3935   }
3936 
3937   
3938   public void setDeleteGroupsIfGrouperDeleted(boolean deleteGroupsIfGrouperDeleted) {
3939     this.deleteGroupsIfGrouperDeleted = deleteGroupsIfGrouperDeleted;
3940   }
3941 
3942   public GrouperProvisioningMembershipFieldType getGrouperProvisioningMembershipFieldType() {
3943     return grouperProvisioningMembershipFieldType;
3944   }
3945 
3946   
3947   public void setGrouperProvisioningMembershipFieldType(
3948       GrouperProvisioningMembershipFieldType grouperProvisioningMembershipFieldType) {
3949     this.grouperProvisioningMembershipFieldType = grouperProvisioningMembershipFieldType;
3950   }
3951 
3952 
3953   public String getEntityAttributesLdapSubjectSource() {
3954     return entityAttributesLdapSubjectSource;
3955   }
3956   
3957   public int getDaoSleepBeforeSelectAfterInsertMillis() {
3958     return sleepBeforeSelectAfterInsertMillis;
3959   }
3960 
3961   /**
3962    * finish configuration after figuring out metadata
3963    */
3964   public void configureAfterMetadata() {
3965   }
3966 
3967   
3968   public Boolean getCreateGroupDuringDiagnostics() {
3969     return createGroupDuringDiagnostics;
3970   }
3971 
3972   
3973   public void setCreateGroupDuringDiagnostics(Boolean createGroupDuringDiagnostics) {
3974     this.createGroupDuringDiagnostics = createGroupDuringDiagnostics;
3975   }
3976 
3977   
3978   public Boolean getDeleteGroupDuringDiagnostics() {
3979     return deleteGroupDuringDiagnostics;
3980   }
3981 
3982   
3983   public void setDeleteGroupDuringDiagnostics(Boolean deleteGroupDuringDiagnostics) {
3984     this.deleteGroupDuringDiagnostics = deleteGroupDuringDiagnostics;
3985   }
3986 
3987   
3988   public Boolean getCreateEntityDuringDiagnostics() {
3989     return createEntityDuringDiagnostics;
3990   }
3991 
3992   
3993   public void setCreateEntityDuringDiagnostics(Boolean createEntityDuringDiagnostics) {
3994     this.createEntityDuringDiagnostics = createEntityDuringDiagnostics;
3995   }
3996 
3997   
3998   public Boolean getDeleteEntityDuringDiagnostics() {
3999     return deleteEntityDuringDiagnostics;
4000   }
4001 
4002   
4003   public void setDeleteEntityDuringDiagnostics(Boolean deleteEntityDuringDiagnostics) {
4004     this.deleteEntityDuringDiagnostics = deleteEntityDuringDiagnostics;
4005   }
4006 
4007   
4008   public Boolean getDiagnosticsGroupsAllSelect() {
4009     return diagnosticsGroupsAllSelect;
4010   }
4011 
4012   
4013   public void setDiagnosticsGroupsAllSelect(Boolean diagnosticsGroupsAllSelect) {
4014     this.diagnosticsGroupsAllSelect = diagnosticsGroupsAllSelect;
4015   }
4016 
4017   
4018   public Boolean getDiagnosticsEntitiesAllSelect() {
4019     return diagnosticsEntitiesAllSelect;
4020   }
4021 
4022   
4023   public void setDiagnosticsEntitiesAllSelect(Boolean diagnosticsEntitiesAllSelect) {
4024     this.diagnosticsEntitiesAllSelect = diagnosticsEntitiesAllSelect;
4025   }
4026 
4027   
4028   public Boolean getDiagnosticsMembershipsAllSelect() {
4029     return diagnosticsMembershipsAllSelect;
4030   }
4031 
4032   
4033   public void setDiagnosticsMembershipsAllSelect(Boolean diagnosticsMembershipsAllSelect) {
4034     this.diagnosticsMembershipsAllSelect = diagnosticsMembershipsAllSelect;
4035   }
4036 
4037   
4038   public Boolean getOnlyProvisionPolicyGroups() {
4039     return onlyProvisionPolicyGroups;
4040   }
4041 
4042   
4043   public void setOnlyProvisionPolicyGroups(Boolean onlyProvisionPolicyGroups) {
4044     this.onlyProvisionPolicyGroups = onlyProvisionPolicyGroups;
4045   }
4046 
4047   
4048   public Boolean getAllowPolicyGroupOverride() {
4049     return allowPolicyGroupOverride;
4050   }
4051 
4052   
4053   public void setAllowPolicyGroupOverride(Boolean allowPolicyGroupOverride) {
4054     this.allowPolicyGroupOverride = allowPolicyGroupOverride;
4055   }
4056 
4057   
4058   public Boolean getAllowProvisionableRegexOverride() {
4059     return allowProvisionableRegexOverride;
4060   }
4061 
4062   
4063   public void setAllowProvisionableRegexOverride(Boolean allowProvisionableRegexOverride) {
4064     this.allowProvisionableRegexOverride = allowProvisionableRegexOverride;
4065   }
4066 
4067   
4068   public Boolean getEntityAttributeValueCacheHas() {
4069     return entityAttributeValueCacheHas;
4070   }
4071 
4072   
4073   public void setEntityAttributeValueCacheHas(Boolean entityAttributeValueCacheHas) {
4074     this.entityAttributeValueCacheHas = entityAttributeValueCacheHas;
4075   }
4076 
4077   
4078   public void setThreadPoolSize(int threadPoolSize) {
4079     this.threadPoolSize = threadPoolSize;
4080   }
4081 
4082   
4083   public void setSubjectIdentifierForMemberSyncTable(
4084       String subjectIdentifierForMemberSyncTable) {
4085     this.subjectIdentifierForMemberSyncTable = subjectIdentifierForMemberSyncTable;
4086   }
4087 
4088   
4089   public void setGroupsRequireMembers(boolean groupsRequireMembers) {
4090     this.groupsRequireMembers = groupsRequireMembers;
4091   }
4092 
4093   
4094   public void setHasEntityAttributes(boolean hasEntityAttributes) {
4095     this.hasEntityAttributes = hasEntityAttributes;
4096   }
4097 
4098   
4099   public void setResolveAttributesWithSql(boolean resolveAttributesWithSql) {
4100     this.resolveAttributesWithSql = resolveAttributesWithSql;
4101   }
4102 
4103   
4104   public void setResolveAttributesWithLdap(boolean resolveAttributesWithLdap) {
4105     this.resolveAttributesWithLdap = resolveAttributesWithLdap;
4106   }
4107 
4108   
4109   public void setUseGlobalSqlResolver(boolean useGlobalSqlResolver) {
4110     this.useGlobalSqlResolver = useGlobalSqlResolver;
4111   }
4112 
4113   
4114   public void setUseGlobalLdapResolver(boolean useGlobalLdapResolver) {
4115     this.useGlobalLdapResolver = useGlobalLdapResolver;
4116   }
4117 
4118   
4119   public void setGlobalSqlResolver(String globalSqlResolver) {
4120     this.globalSqlResolver = globalSqlResolver;
4121   }
4122 
4123   
4124   public void setGlobalLdapResolver(String globalLdapResolver) {
4125     this.globalLdapResolver = globalLdapResolver;
4126   }
4127 
4128   
4129   public void setSelectAllSqlOnFull(boolean selectAllSqlOnFull) {
4130     this.selectAllSqlOnFull = selectAllSqlOnFull;
4131   }
4132 
4133   
4134   public void setFilterAllLDAPOnFull(boolean filterAllLDAPOnFull) {
4135     this.filterAllLDAPOnFull = filterAllLDAPOnFull;
4136   }
4137 
4138   
4139   public void setLoadEntitiesToGrouperTable(boolean loadEntitiesToGrouperTable) {
4140     this.loadEntitiesToGrouperTable = loadEntitiesToGrouperTable;
4141   }
4142 
4143   
4144   public void setEntityAttributesSqlExternalSystem(
4145       String entityAttributesSqlExternalSystem) {
4146     this.entityAttributesSqlExternalSystem = entityAttributesSqlExternalSystem;
4147   }
4148 
4149   
4150   public void setEntityAttributesTableViewName(String entityAttributesTableViewName) {
4151     this.entityAttributesTableViewName = entityAttributesTableViewName;
4152   }
4153 
4154   
4155   public void setEntityAttributesColumnNames(String entityAttributesColumnNames) {
4156     this.entityAttributesColumnNames = entityAttributesColumnNames;
4157   }
4158 
4159   
4160   public void setEntityAttributesSubjectSourceIdColumn(
4161       String entityAttributesSubjectSourceIdColumn) {
4162     this.entityAttributesSubjectSourceIdColumn = entityAttributesSubjectSourceIdColumn;
4163   }
4164 
4165   
4166   public void setEntityAttributesSubjectSearchMatchingColumn(
4167       String entityAttributesSubjectSearchMatchingColumn) {
4168     this.entityAttributesSubjectSearchMatchingColumn = entityAttributesSubjectSearchMatchingColumn;
4169   }
4170 
4171   
4172   public void setEntityAttributesSqlMappingType(String entityAttributesSqlMappingType) {
4173     this.entityAttributesSqlMappingType = entityAttributesSqlMappingType;
4174   }
4175 
4176   
4177   public void setEntityAttributesSqlMappingEntityAttribute(
4178       String entityAttributesSqlMappingEntityAttribute) {
4179     this.entityAttributesSqlMappingEntityAttribute = entityAttributesSqlMappingEntityAttribute;
4180   }
4181 
4182   
4183   public void setEntityAttributesSqlMappingExpression(
4184       String entityAttributesSqlMappingExpression) {
4185     this.entityAttributesSqlMappingExpression = entityAttributesSqlMappingExpression;
4186   }
4187 
4188   
4189   public void setEntityAttributesLastUpdatedColumn(
4190       String entityAttributesLastUpdatedColumn) {
4191     this.entityAttributesLastUpdatedColumn = entityAttributesLastUpdatedColumn;
4192   }
4193 
4194   
4195   public void setEntityAttributesLastUpdatedType(String entityAttributesLastUpdatedType) {
4196     this.entityAttributesLastUpdatedType = entityAttributesLastUpdatedType;
4197   }
4198 
4199   
4200   public void setEntityAttributesLdapExternalSystem(
4201       String entityAttributesLdapExternalSystem) {
4202     this.entityAttributesLdapExternalSystem = entityAttributesLdapExternalSystem;
4203   }
4204 
4205   
4206   public void setEntityAttributesLdapBaseDn(String entityAttributesLdapBaseDn) {
4207     this.entityAttributesLdapBaseDn = entityAttributesLdapBaseDn;
4208   }
4209 
4210   
4211   public void setEntityAttributesLdapSubjectSource(
4212       String entityAttributesLdapSubjectSource) {
4213     this.entityAttributesLdapSubjectSource = entityAttributesLdapSubjectSource;
4214   }
4215 
4216   
4217   public void setEntityAttributesLdapSearchScope(String entityAttributesLdapSearchScope) {
4218     this.entityAttributesLdapSearchScope = entityAttributesLdapSearchScope;
4219   }
4220 
4221   
4222   public void setEntityAttributesLdapFilterPart(String entityAttributesLdapFilterPart) {
4223     this.entityAttributesLdapFilterPart = entityAttributesLdapFilterPart;
4224   }
4225 
4226   
4227   public void setEntityAttributesLdapAttributes(String entityAttributesLdapAttributes) {
4228     this.entityAttributesLdapAttributes = entityAttributesLdapAttributes;
4229   }
4230 
4231   
4232   public void setEntityAttributesLdapMutliValuedAttributes(
4233       String entityAttributesLdapMutliValuedAttributes) {
4234     this.entityAttributesLdapMutliValuedAttributes = entityAttributesLdapMutliValuedAttributes;
4235   }
4236 
4237   
4238   public void setEntityAttributesLdapMatchingSearchAttribute(
4239       String entityAttributesLdapMatchingSearchAttribute) {
4240     this.entityAttributesLdapMatchingSearchAttribute = entityAttributesLdapMatchingSearchAttribute;
4241   }
4242 
4243   
4244   public void setEntityAttributesLdapMappingType(String entityAttributesLdapMappingType) {
4245     this.entityAttributesLdapMappingType = entityAttributesLdapMappingType;
4246   }
4247 
4248   
4249   public void setEntityAttributesLdapMappingEntityAttribute(
4250       String entityAttributesLdapMappingEntityAttribute) {
4251     this.entityAttributesLdapMappingEntityAttribute = entityAttributesLdapMappingEntityAttribute;
4252   }
4253 
4254   
4255   public void setEntityAttributesLdapMatchingExpression(
4256       String entityAttributesLdapMatchingExpression) {
4257     this.entityAttributesLdapMatchingExpression = entityAttributesLdapMatchingExpression;
4258   }
4259 
4260   
4261   public void setEntityAttributesLdapLastUpdatedAttribute(
4262       String entityAttributesLdapLastUpdatedAttribute) {
4263     this.entityAttributesLdapLastUpdatedAttribute = entityAttributesLdapLastUpdatedAttribute;
4264   }
4265 
4266   
4267   public void setEntityAttributesLdapLastUpdatedAttributeFormat(
4268       String entityAttributesLdapLastUpdatedAttributeFormat) {
4269     this.entityAttributesLdapLastUpdatedAttributeFormat = entityAttributesLdapLastUpdatedAttributeFormat;
4270   }
4271 
4272   
4273   public void setGroupIdOfUsersToProvision(String groupIdOfUsersToProvision) {
4274     this.groupIdOfUsersToProvision = groupIdOfUsersToProvision;
4275   }
4276 
4277   
4278   public void setDiagnosticsGroupName(String diagnosticsGroupName) {
4279     this.diagnosticsGroupName = diagnosticsGroupName;
4280   }
4281 
4282   
4283   public void setDiagnosticsSubjectIdOrIdentifier(String diagnosticsSubjectIdOrIdentifier) {
4284     this.diagnosticsSubjectIdOrIdentifier = diagnosticsSubjectIdOrIdentifier;
4285   }
4286 
4287   
4288   public void setProvisionableRegex(String provisionableRegex) {
4289     this.provisionableRegex = provisionableRegex;
4290   }
4291 
4292   
4293   public void setTargetGroupAttributeNameToConfig(
4294       Map<String, GrouperProvisioningConfigurationAttribute> targetGroupAttributeNameToConfig) {
4295     this.targetGroupAttributeNameToConfig = targetGroupAttributeNameToConfig;
4296   }
4297 
4298   
4299   public void setGrouperProvisioningToTargetTranslation(
4300       Map<String, List<String>> grouperProvisioningToTargetTranslation) {
4301     this.grouperProvisioningToTargetTranslation = grouperProvisioningToTargetTranslation;
4302   }
4303 
4304   
4305   public void setEntityMatchingAttributes(
4306       List<GrouperProvisioningConfigurationAttribute> entityMatchingAttributes) {
4307     this.entityMatchingAttributes = entityMatchingAttributes;
4308   }
4309 
4310   
4311   public void setGroupMatchingAttributes(
4312       List<GrouperProvisioningConfigurationAttribute> groupMatchingAttributes) {
4313     this.groupMatchingAttributes = groupMatchingAttributes;
4314   }
4315 
4316   
4317   public void setGroupMembershipAttributeName(String groupMembershipAttributeName) {
4318     this.groupMembershipAttributeName = groupMembershipAttributeName;
4319   }
4320 
4321   
4322   public void setGroupMembershipAttributeValue(String groupMembershipAttributeValue) {
4323     this.groupMembershipAttributeValue = groupMembershipAttributeValue;
4324   }
4325 
4326   
4327   public void setEntityMembershipAttributeName(String entityMembershipAttributeName) {
4328     this.entityMembershipAttributeName = entityMembershipAttributeName;
4329   }
4330 
4331   
4332   public void setEntityMembershipAttributeValue(String entityMembershipAttributeValue) {
4333     this.entityMembershipAttributeValue = entityMembershipAttributeValue;
4334   }
4335 
4336   
4337   public void setGroupMatchingAttributeSameAsSearchAttribute(
4338       boolean groupMatchingAttributeSameAsSearchAttribute) {
4339     this.groupMatchingAttributeSameAsSearchAttribute = groupMatchingAttributeSameAsSearchAttribute;
4340   }
4341 
4342   
4343   public void setEntityMatchingAttributeSameAsSearchAttribute(
4344       boolean entityMatchingAttributeSameAsSearchAttribute) {
4345     this.entityMatchingAttributeSameAsSearchAttribute = entityMatchingAttributeSameAsSearchAttribute;
4346   }
4347 
4348   
4349   public void setGroupAttributeValueCacheHas(boolean groupAttributeValueCacheHas) {
4350     this.groupAttributeValueCacheHas = groupAttributeValueCacheHas;
4351   }
4352 
4353   
4354   public void setGroupAttributeDbCaches(
4355       GrouperProvisioningConfigurationAttributeDbCache[] groupAttributeDbCaches) {
4356     this.groupAttributeDbCaches = groupAttributeDbCaches;
4357   }
4358 
4359   
4360   public void setEntityAttributeDbCaches(
4361       GrouperProvisioningConfigurationAttributeDbCache[] entityAttributeDbCaches) {
4362     this.entityAttributeDbCaches = entityAttributeDbCaches;
4363   }
4364 
4365   
4366   public void setOperateOnGrouperEntities(boolean operateOnGrouperEntities) {
4367     this.operateOnGrouperEntities = operateOnGrouperEntities;
4368   }
4369 
4370   
4371   public void setOperateOnGrouperMemberships(boolean operateOnGrouperMemberships) {
4372     this.operateOnGrouperMemberships = operateOnGrouperMemberships;
4373   }
4374 
4375   
4376   public void setOperateOnGrouperGroups(boolean operateOnGrouperGroups) {
4377     this.operateOnGrouperGroups = operateOnGrouperGroups;
4378   }
4379 
4380   
4381   public void setConfigured(boolean configured) {
4382     this.configured = configured;
4383   }
4384 
4385   
4386   public void setTargetEntityAttributeNameToConfig(
4387       Map<String, GrouperProvisioningConfigurationAttribute> targetEntityAttributeNameToConfig) {
4388     this.targetEntityAttributeNameToConfig = targetEntityAttributeNameToConfig;
4389   }
4390 
4391   
4392   public void setTargetMembershipAttributeNameToConfig(
4393       Map<String, GrouperProvisioningConfigurationAttribute> targetMembershipAttributeNameToConfig) {
4394     this.targetMembershipAttributeNameToConfig = targetMembershipAttributeNameToConfig;
4395   }
4396 
4397   
4398   public boolean isDeleteMembershipsForUnprovisionableUsers() {
4399     return deleteMembershipsForUnprovisionableUsers;
4400   }
4401 
4402   
4403   public void setDeleteMembershipsForUnprovisionableUsers(
4404       boolean deleteMembershipsForUnprovisionableUsers) {
4405     this.deleteMembershipsForUnprovisionableUsers = deleteMembershipsForUnprovisionableUsers;
4406   }
4407 
4408   
4409   public boolean isHasGroupAttributes() {
4410     return hasGroupAttributes;
4411   }
4412 
4413   
4414   public void setHasGroupAttributes(boolean hasGroupAttributes) {
4415     this.hasGroupAttributes = hasGroupAttributes;
4416   }
4417 
4418   
4419   public boolean isResolveGroupAttributesWithSql() {
4420     return resolveGroupAttributesWithSql;
4421   }
4422 
4423   
4424   public void setResolveGroupAttributesWithSql(boolean resolveGroupAttributesWithSql) {
4425     this.resolveGroupAttributesWithSql = resolveGroupAttributesWithSql;
4426   }
4427 
4428   
4429   public String getGroupAttributesSqlExternalSystem() {
4430     return groupAttributesSqlExternalSystem;
4431   }
4432 
4433   
4434   public void setGroupAttributesSqlExternalSystem(String groupAttributesSqlExternalSystem) {
4435     this.groupAttributesSqlExternalSystem = groupAttributesSqlExternalSystem;
4436   }
4437 
4438   
4439   public String getGroupAttributesTableViewName() {
4440     return groupAttributesTableViewName;
4441   }
4442 
4443   
4444   public void setGroupAttributesTableViewName(String groupAttributesTableViewName) {
4445     this.groupAttributesTableViewName = groupAttributesTableViewName;
4446   }
4447 
4448   
4449   public String getGroupAttributesColumnNames() {
4450     return groupAttributesColumnNames;
4451   }
4452 
4453   
4454   public void setGroupAttributesColumnNames(String groupAttributesColumnNames) {
4455     this.groupAttributesColumnNames = groupAttributesColumnNames;
4456   }
4457 
4458   
4459   public String getGroupAttributesTableStructure() {
4460     return groupAttributesTableStructure;
4461   }
4462 
4463   
4464   public void setGroupAttributesTableStructure(String groupAttributesTableStructure) {
4465     this.groupAttributesTableStructure = groupAttributesTableStructure;
4466   }
4467 
4468   
4469   public String getGroupAttributesAttributeNameColumnName() {
4470     return groupAttributesAttributeNameColumnName;
4471   }
4472 
4473   
4474   public void setGroupAttributesAttributeNameColumnName(
4475       String groupAttributesAttributeNameColumnName) {
4476     this.groupAttributesAttributeNameColumnName = groupAttributesAttributeNameColumnName;
4477   }
4478 
4479   
4480   public String getGroupAttributesAttributeValueColumnName() {
4481     return groupAttributesAttributeValueColumnName;
4482   }
4483 
4484   
4485   public void setGroupAttributesAttributeValueColumnName(
4486       String groupAttributesAttributeValueColumnName) {
4487     this.groupAttributesAttributeValueColumnName = groupAttributesAttributeValueColumnName;
4488   }
4489 
4490   
4491   public String getGroupAttributesGroupMatchingColumn() {
4492     return groupAttributesGroupMatchingColumn;
4493   }
4494 
4495   
4496   public void setGroupAttributesGroupMatchingColumn(
4497       String groupAttributesGroupMatchingColumn) {
4498     this.groupAttributesGroupMatchingColumn = groupAttributesGroupMatchingColumn;
4499   }
4500 
4501   
4502   public String getGroupAttributesLastUpdatedColumn() {
4503     return groupAttributesLastUpdatedColumn;
4504   }
4505 
4506   
4507   public void setGroupAttributesLastUpdatedColumn(String groupAttributesLastUpdatedColumn) {
4508     this.groupAttributesLastUpdatedColumn = groupAttributesLastUpdatedColumn;
4509   }
4510 
4511   
4512   public String getGroupAttributesLastUpdatedType() {
4513     return groupAttributesLastUpdatedType;
4514   }
4515 
4516   
4517   public void setGroupAttributesLastUpdatedType(String groupAttributesLastUpdatedType) {
4518     this.groupAttributesLastUpdatedType = groupAttributesLastUpdatedType;
4519   }
4520 
4521   
4522   public boolean isGroupAttributesRecalcMembershipsOnIncremental() {
4523     return groupAttributesRecalcMembershipsOnIncremental;
4524   }
4525 
4526   
4527   public void setGroupAttributesRecalcMembershipsOnIncremental(
4528       boolean groupAttributesRecalcMembershipsOnIncremental) {
4529     this.groupAttributesRecalcMembershipsOnIncremental = groupAttributesRecalcMembershipsOnIncremental;
4530   }
4531 
4532   
4533   public boolean isGroupAttributesSelectAllSqlOnFull() {
4534     return groupAttributesSelectAllSqlOnFull;
4535   }
4536 
4537   
4538   public void setGroupAttributesSelectAllSqlOnFull(
4539       boolean groupAttributesSelectAllSqlOnFull) {
4540     this.groupAttributesSelectAllSqlOnFull = groupAttributesSelectAllSqlOnFull;
4541   }
4542   
4543   
4544 
4545   /**
4546    * find the matching ID part for membership table that goes to the entity
4547    * @return the column which is the matching ID in memberships for entity
4548    */
4549   public String getMembershipEntityMatchingIdAttribute() {
4550     return this.membershipEntityMatchingIdAttribute;
4551   }
4552 
4553   /**
4554    * find the matching ID part for membership table that goes to the group
4555    * @return the column which is the matching ID in memberships for group
4556    */
4557   public String getMembershipGroupMatchingIdAttribute() {
4558     return this.membershipGroupMatchingIdAttribute;
4559   }  
4560   
4561 }