|
22 | 22 |
|
23 | 23 | import com.google.auto.service.AutoService; |
24 | 24 | import java.io.IOException; |
25 | | -import java.lang.reflect.Constructor; |
26 | 25 | import java.lang.reflect.Method; |
27 | 26 | import java.util.ArrayDeque; |
28 | 27 | import java.util.Collections; |
@@ -107,39 +106,39 @@ public Map<String, ExpansionService.TransformProvider> knownTransforms() { |
107 | 106 | ImmutableMap.builder(); |
108 | 107 | for (ExternalTransformRegistrar registrar : |
109 | 108 | ServiceLoader.load(ExternalTransformRegistrar.class)) { |
110 | | - for (Map.Entry<String, Class<? extends ExternalTransformBuilder<?, ?, ?>>> entry : |
111 | | - registrar.knownBuilders().entrySet()) { |
| 109 | + for (Map.Entry<String, ExternalTransformBuilder<?, ?, ?>> entry : |
| 110 | + registrar.knownBuilderInstances().entrySet()) { |
112 | 111 | String urn = entry.getKey(); |
113 | | - Class<? extends ExternalTransformBuilder<?, ?, ?>> builderClass = entry.getValue(); |
| 112 | + ExternalTransformBuilder builderInstance = entry.getValue(); |
114 | 113 | builder.put( |
115 | 114 | urn, |
116 | 115 | spec -> { |
117 | 116 | try { |
118 | 117 | ExternalTransforms.ExternalConfigurationPayload payload = |
119 | 118 | ExternalTransforms.ExternalConfigurationPayload.parseFrom(spec.getPayload()); |
120 | | - return translate(payload, builderClass); |
| 119 | + return builderInstance.buildExternal( |
| 120 | + payloadToConfig( |
| 121 | + payload, |
| 122 | + (Class<? extends ExternalTransformBuilder<?, ?, ?>>) |
| 123 | + builderInstance.getClass())); |
121 | 124 | } catch (Exception e) { |
122 | 125 | throw new RuntimeException( |
123 | 126 | String.format("Failed to build transform %s from spec %s", urn, spec), e); |
124 | 127 | } |
125 | 128 | }); |
126 | 129 | } |
127 | 130 | } |
| 131 | + |
128 | 132 | return builder.build(); |
129 | 133 | } |
130 | 134 |
|
131 | | - private static PTransform<?, ?> translate( |
| 135 | + Object payloadToConfig( |
132 | 136 | ExternalTransforms.ExternalConfigurationPayload payload, |
133 | 137 | Class<? extends ExternalTransformBuilder<?, ?, ?>> builderClass) |
134 | 138 | throws Exception { |
135 | | - Preconditions.checkState( |
136 | | - ExternalTransformBuilder.class.isAssignableFrom(builderClass), |
137 | | - "Provided identifier %s is not an ExternalTransformBuilder.", |
138 | | - builderClass.getName()); |
139 | | - |
140 | 139 | Object configObject = initConfiguration(builderClass); |
141 | 140 | populateConfiguration(configObject, payload); |
142 | | - return buildTransform(builderClass, configObject); |
| 141 | + return configObject; |
143 | 142 | } |
144 | 143 |
|
145 | 144 | private static Object initConfiguration( |
@@ -239,28 +238,6 @@ private static RunnerApi.Coder buildProto( |
239 | 238 |
|
240 | 239 | return coderBuilder.build(); |
241 | 240 | } |
242 | | - |
243 | | - private static PTransform<?, ?> buildTransform( |
244 | | - Class<? extends ExternalTransformBuilder<?, ?, ?>> builderClass, Object configObject) |
245 | | - throws Exception { |
246 | | - Constructor<? extends ExternalTransformBuilder<?, ?, ?>> constructor = |
247 | | - builderClass.getDeclaredConstructor(); |
248 | | - constructor.setAccessible(true); |
249 | | - ExternalTransformBuilder<?, ?, ?> externalTransformBuilder = constructor.newInstance(); |
250 | | - Method buildMethod = builderClass.getMethod("buildExternal", configObject.getClass()); |
251 | | - buildMethod.setAccessible(true); |
252 | | - |
253 | | - PTransform<?, ?> transform = |
254 | | - (PTransform<?, ?>) |
255 | | - checkArgumentNotNull( |
256 | | - buildMethod.invoke(externalTransformBuilder, configObject), |
257 | | - "Invoking %s.%s(%s) returned null, violating its type.", |
258 | | - builderClass.getCanonicalName(), |
259 | | - "buildExternal", |
260 | | - configObject); |
261 | | - |
262 | | - return transform; |
263 | | - } |
264 | 241 | } |
265 | 242 |
|
266 | 243 | /** |
|
0 commit comments