@Override public <T> Codec<T> getCodec(String codecName, Class<T> objectClass) { if (!codecFactories.containsKey(codecName)) { throw new IllegalArgumentException( String.format("Invalid codec name: %s, requested for class: %s", codecName, objectClass)); } // TODO codec are thread safe so we can use a cache codecName, objectClass -> codec return codecFactories.get(codecName).newCodec(objectClass); } }
@Override public void start(ComponentContext context) { super.start(context); List<CodecDescriptor> descriptors = getDescriptors(XP_CODEC); for (CodecDescriptor descriptor : descriptors) { log.debug("Creating CodecFactory : {}", descriptor.klass::getSimpleName); try { CodecFactory factory = descriptor.klass.getDeclaredConstructor().newInstance(); factory.init(descriptor.options); codecFactories.put(descriptor.getId(), factory); } catch (ReflectiveOperationException e) { throw new IllegalArgumentException("Invalid class: " + getClass(), e); } } }