@Override protected Map<UUID, Map<UUID, StateValueAdapter<Object, Object>>> create() { bootstrapOnce.ensure(); Map<UUID, Map<UUID, StateValueAdapter<Object, Object>>> adaptersBySourceTypeId = new ConcurrentHashMap<>(); for (Class<?> c : ClassFinder.findConcreteClasses(StateValueAdapter.class)) { TypeDefinition<?> d = TypeDefinition.getInstance(c); Class<?> source = d.getInferredGenericTypeArgumentClass(StateValueAdapter.class, 0); if (source != null) { Class<?> target = d.getInferredGenericTypeArgumentClass(StateValueAdapter.class, 1); if (target != null) { ObjectType sourceType = getTypeByClass(source); if (sourceType != null) { ObjectType targetType = getTypeByClass(target); if (targetType != null) { UUID sourceTypeId = sourceType.getId(); UUID targetTypeId = targetType.getId(); Map<UUID, StateValueAdapter<Object, Object>> adapters = adaptersBySourceTypeId.get(sourceTypeId); if (adapters == null) { adapters = new ConcurrentHashMap<>(); adaptersBySourceTypeId.put(sourceTypeId, adapters); } adapters.put( targetTypeId, (StateValueAdapter<Object, Object>) TypeDefinition.getInstance(c).newInstance()); } } } } } return adaptersBySourceTypeId; }