private static List<ModelNode> spi(JsonNode root, PathAddress spiAddr, String spiName) { List<ModelNode> spiAndProviders = new ArrayList<>(); ModelNode op = Util.createAddOperation(spiAddr); spiAndProviders.add(op); Iterator<String> providerIterator = root.get(spiName).fieldNames(); while (providerIterator.hasNext()) { String providerName = providerIterator.next(); if ("provider".equals(providerName)) { op.get(SpiResourceDefinition.DEFAULT_PROVIDER.getName()).set(getNode(root, spiName, "provider").asText()); } else { PathAddress providerAddr = spiAddr.append("provider", providerName); spiAndProviders.add(spiProvider(getNode(root, spiName, providerName), providerAddr)); } } return spiAndProviders; }
/** * Convert keycloak-server.json to DMR operations that write to standalone.xml * or domain.xml. * * @param json The json representation of the config. * @param subsysAddress The management model address of the keycloak-server subsystem. * @return A list of DMR operations. * @throws IOException If the json can not be parsed. */ public static List<ModelNode> convertJsonConfig(String json, PathAddress subsysAddress) throws IOException { List<ModelNode> list = new ArrayList<>(); JsonNode root = new ObjectMapper().readTree(json); list.add(masterRealmName(root, subsysAddress)); list.add(scheduledTaskInterval(root, subsysAddress)); list.add(providers(root, subsysAddress)); list.add(theme(root, subsysAddress.append(ThemeResourceDefinition.TAG_NAME, ThemeResourceDefinition.RESOURCE_NAME))); list.addAll(spis(root, subsysAddress)); return list; }
private static Collection<ModelNode> spis(JsonNode root, PathAddress addr) { List<ModelNode> spis = new ArrayList<>(); Iterator<String> spiIterator = root.fieldNames(); while (spiIterator.hasNext()) { String spiName = spiIterator.next(); if (NON_SPI_LIST.contains(spiName)) continue; PathAddress spiAddr = addr.append("spi", spiName); spis.addAll(spi(root, spiAddr, spiName)); } return spis; }
private static ModelNode theme(JsonNode root, PathAddress addr) { JsonNode themeNode = getNode(root, "theme"); ModelNode op = Util.createAddOperation(addr); JsonNode targetNode = getNode(themeNode, "staticMaxAge"); Long lValue = STATIC_MAX_AGE.getDefaultValue().asLong(); if (targetNode != null) lValue = targetNode.asLong(lValue); op.get(STATIC_MAX_AGE.getName()).set(lValue); targetNode = getNode(themeNode, "cacheTemplates"); Boolean bValue = CACHE_TEMPLATES.getDefaultValue().asBoolean(); if (targetNode != null) bValue = targetNode.asBoolean(bValue); op.get(CACHE_TEMPLATES.getName()).set(bValue); targetNode = getNode(themeNode, "cacheThemes"); bValue = CACHE_THEMES.getDefaultValue().asBoolean(); if (targetNode != null) bValue = targetNode.asBoolean(bValue); op.get(CACHE_THEMES.getName()).set(bValue); targetNode = getNode(themeNode, "folder", "dir"); String sValue = DIR.getDefaultValue().asString(); if (targetNode != null) sValue = targetNode.asText(sValue); op.get(DIR.getName()).set(sValue); targetNode = getNode(themeNode, "welcomeTheme"); if (targetNode != null) op.get(WELCOME_THEME.getName()).set(targetNode.asText()); targetNode = getNode(themeNode, "default"); if (targetNode != null) op.get(DEFAULT.getName()).set(targetNode.asText());
private static ModelNode masterRealmName(JsonNode root, PathAddress addr) { JsonNode targetNode = getNode(root, "admin", "realm"); String value = MASTER_REALM_NAME.getDefaultValue().asString(); if (targetNode != null) value = targetNode.asText(value); ModelNode op = Util.createOperation(WRITE_ATTRIBUTE_OPERATION, addr); op.get("name").set(MASTER_REALM_NAME.getName()); op.get("value").set(value); return op; }
} else { if (providerNode.get(propName).isArray()) { properties.get(propName).set(makeArrayText(providerNode.get(propName))); } else { properties.get(propName).set(providerNode.get(propName).asText());
@Override public void execute(OperationContext context, ModelNode operation) throws OperationFailedException { List<ModelNode> ops = null; try { PathAddress currentAddr = context.getCurrentAddress(); ops = JsonConfigConverter.convertJsonConfig(readConfig(operation), currentAddr); } catch (IOException ioe) { throw new OperationFailedException(ioe); } for (ModelNode op : ops) { PathAddress addr = PathAddress.pathAddress(op.get(ADDRESS)); String opName = op.get(OP).asString(); context.addStep(op, context.getRootResourceRegistration().getOperationHandler(addr, opName), OperationContext.Stage.MODEL); } context.completeStep(OperationContext.RollbackHandler.NOOP_ROLLBACK_HANDLER); }
private static ModelNode providers(JsonNode root, PathAddress addr) { JsonNode targetNode = getNode(root, "providers"); ModelNode value = PROVIDERS.getDefaultValue(); if (targetNode != null && targetNode.isArray()) { value = new ModelNode(); for (JsonNode node : targetNode) { value.add(node.asText()); } } ModelNode op = Util.createOperation(WRITE_ATTRIBUTE_OPERATION, addr); op.get("name").set(PROVIDERS.getName()); op.get("value").set(value); return op; }
private static ModelNode scheduledTaskInterval(JsonNode root, PathAddress addr) { JsonNode targetNode = getNode(root, "scheduled", "interval"); Long value = SCHEDULED_TASK_INTERVAL.getDefaultValue().asLong(); if (targetNode != null) value = targetNode.asLong(value); ModelNode op = Util.createOperation(WRITE_ATTRIBUTE_OPERATION, addr); op.get("name").set(SCHEDULED_TASK_INTERVAL.getName()); op.get("value").set(value); return op; }