+ String[] parts = resolvedID.split(":");
+ if (parts.length != 3)
+ throw new IllegalArgumentException("invaild resource id: " + resolvedID);
+ String rLoadID = parts[1];
+ String resID = parts[2];
+ try
+ {
+ ResourceLoader loader;
+ if (!resourceLoaders.containsKey(rLoadID))
+ {
+ Class<?> c = Class.forName(rLoadID);
+ if (ResourceLoader.class.isAssignableFrom(c))
+ loader = (ResourceLoader) c.getConstructor().newInstance();
+ else
+ loader = (ResourceLoader) Objects.requireNonNull(c.getMethod("resourceLoader").invoke(null));
+ resourceLoaders.put(rLoadID, loader);
+ } else
+ {
+ loader = Objects.requireNonNull(resourceLoaders.get(parts[1]));
+ }
+ if (resID.endsWith(".json"))
+ {
+ JsonObject jsonContents = JsonHandler.readJson(loader.loadResource(resID), JsonObject.class);
+ return loadComponentFromJsonObject(model, id, name, jsonContents);
+ }
+ loader.loadClass(resID);
+ ComponentSupplier componentSupplier = componentSuppliers.get(resID);
+ if (componentSupplier != null)
+ return componentSupplier.create(model, params, name);
+ throw new IllegalArgumentException("Component supplier not found for ID " + id + " (class cannot initialize?)");
+ }
+ catch (IOException e)
+ {
+ throw new UncheckedIOException(e);
+ }
+ catch (ClassCastException | ReflectiveOperationException e)
+ {
+ throw new IllegalArgumentException("class not found / invaild resource loader specified:" + parts[1], e);
+ }
+ } else if (resolvedID.startsWith("file:"))
+ {
+ try
+ {
+ String filename = resolvedID.substring(5);
+ JsonObject jsonContents = JsonHandler.readJson(filename, JsonObject.class);
+ return loadComponentFromJsonObject(model, id, name, jsonContents);
+ }
+ catch (IOException e)
+ {
+ throw new UncheckedIOException(e);
+ }
+ } else