1 package edu.internet2.middleware.grouper.pspng;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.lang.reflect.Constructor;
20 import java.lang.reflect.InvocationTargetException;
21 import java.lang.reflect.Method;
22 import java.util.Map;
23 import java.util.concurrent.ConcurrentHashMap;
24 import java.util.concurrent.ConcurrentMap;
25
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 import edu.internet2.middleware.grouper.app.loader.GrouperLoaderConfig;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class ProvisionerFactory {
47 private final static Logger LOG = LoggerFactory.getLogger(ProvisionerFactory.class);
48 final static String PROVISIONER_TYPE_PROPERTY_NAME = "type";
49
50
51
52 private static Map<String, Provisioner> incrementalProvisioners=new ConcurrentHashMap<String, Provisioner>();
53
54 private static ConcurrentMap<String, ProvisionerCoordinator> provisionerCoordinators=new ConcurrentHashMap<>();
55
56
57 public static Provisioner getIncrementalProvisioner(String configName) throws PspException {
58 synchronized (incrementalProvisioners) {
59 if ( !incrementalProvisioners.containsKey(configName) )
60 {
61 Provisioner provisioner;
62 try {
63 provisioner = ProvisionerFactory.createProvisioner(configName, false);
64 incrementalProvisioners.put(configName, provisioner);
65 } catch (PspException e) {
66 LOG.error("Unable to create incremental provisioner {}", configName, e);
67 throw e;
68 }
69 }
70 }
71
72 return incrementalProvisioners.get(configName);
73 }
74
75
76
77 public static ProvisionerCoordinator getProvisionerCoordinator(Provisioner<?,?,?> provisioner) {
78 String provisionerConfigName = provisioner.getConfigName();
79
80 if ( !provisionerCoordinators.containsKey(provisionerConfigName) ) {
81 provisionerCoordinators.putIfAbsent(provisionerConfigName, new ProvisionerCoordinator(provisioner));
82 }
83
84 return provisionerCoordinators.get(provisionerConfigName);
85 }
86
87
88
89
90
91
92
93
94
95
96
97 public static Provisioner createProvisioner(String configName, boolean fullSyncMode) throws PspException {
98 final String qualifiedParameterNamespace = ProvisionerConfiguration.PARAMETER_NAMESPACE + configName + ".";
99
100 LOG.info("Constructing provisioner: {}", configName);
101 String typeName = GrouperLoaderConfig.retrieveConfig().propertyValueStringRequired(qualifiedParameterNamespace + PROVISIONER_TYPE_PROPERTY_NAME);
102
103
104
105 String className = typeName;
106 try {
107 Class<? extends Provisioner> provisionerClass = (Class<? extends Provisioner>) Class.forName(className);
108 Method getPropertyClassMethod = provisionerClass.getMethod("getPropertyClass");
109
110 Class<? extends ProvisionerConfiguration> propertyClass = (Class<? extends ProvisionerConfiguration>) getPropertyClassMethod.invoke(null);
111
112 Constructor<? extends ProvisionerConfiguration> propertyConstructor = propertyClass.getConstructor(String.class);
113
114 ProvisionerConfiguration properties = propertyConstructor.newInstance(configName);
115
116 properties.readConfiguration();
117
118 Constructor<? extends Provisioner> provisionerConstructor = provisionerClass.getConstructor(String.class, propertyClass, Boolean.TYPE);
119 Provisioner provisioner = provisionerConstructor.newInstance(configName, properties, fullSyncMode);
120 return provisioner;
121 } catch (ClassNotFoundException e) {
122 Provisioner.STATIC_LOG.error("Unable to find provisioner class: {}", className);
123 throw new PspException("Unknown provisioner class %s", className);
124 } catch (IllegalAccessException e) {
125 Provisioner.STATIC_LOG.error("Problem constructing provisioner & properties: {}", className, e);
126 throw new PspException("IllegalAccessException while constructing provisioner & properties: %s", className);
127 } catch (IllegalArgumentException e) {
128 Provisioner.STATIC_LOG.error("Problem constructing provisioner & properties: {}", className, e);
129 throw new PspException("IllegalArgumentException while constructing provisioner & properties: %s", className);
130 } catch (InvocationTargetException e) {
131 Provisioner.STATIC_LOG.error("Problem constructing provisioner & properties: {}", className, e);
132 throw new PspException("Problem while constructing provisioner & properties: %s: %s", className, e.getCause().getMessage());
133 } catch (NoSuchMethodException e) {
134 Provisioner.STATIC_LOG.error("Problem constructing provisioner & properties: {}", className, e);
135 throw new PspException("NoSuchMethodException while constructing provisioner & properties: %s: %s", className, e.getMessage());
136 } catch (SecurityException e) {
137 Provisioner.STATIC_LOG.error("Problem constructing provisioner & properties: {}", className, e);
138 throw new PspException("SecurityException while constructing provisioner & properties: %s: %s", className, e.getMessage());
139 } catch (InstantiationException e) {
140 Provisioner.STATIC_LOG.error("Problem constructing provisioner & properties: {}", className, e);
141 throw new PspException("InstantiationException while constructing provisioner & properties: %s: %s", className, e.getMessage());
142 }
143
144
145 }
146
147
148 }