@GET @Produces({"application/hocon", "text/x-java-properties", "text/plain"}) @Path("/v2/tables/{tableName}") @ApiOperation("Displays the configuration of a table") public Response readTableConfiguration(@PathParam("tableName") String tableName, @Context Request request) { TableConfig offlineTableConfig = _resourceManager.getTableConfig(tableName, CommonConstants.Helix.TableType.OFFLINE); TableConfig realtimeTableConfig = _resourceManager.getTableConfig(tableName, CommonConstants.Helix.TableType.REALTIME); Schema tableSchema = _resourceManager.getTableSchema(tableName); if (offlineTableConfig == null && realtimeTableConfig == null) { return Response.status(Response.Status.NOT_FOUND).build(); } CombinedConfig combinedConfig = new CombinedConfig(offlineTableConfig, realtimeTableConfig, tableSchema); String serializedConfig; List<Variant> variants = Variant.mediaTypes(APPLICATION_HOCON, TEXT_JAVA_PROPERTIES, MediaType.TEXT_PLAIN_TYPE).build(); Variant variant = request.selectVariant(variants); if (variant == null) { return Response.notAcceptable(variants).build(); } else if (APPLICATION_HOCON.equals(variant.getMediaType()) || MediaType.TEXT_PLAIN_TYPE .equals(variant.getMediaType())) { serializedConfig = Serializer.serializeToString(combinedConfig); } else if (TEXT_JAVA_PROPERTIES.equals(variant.getMediaType())) { serializedConfig = Serializer.serializeToPropertiesString(combinedConfig); } else { return Response.notAcceptable(variants).build(); } return Response.ok(serializedConfig, variant).header("Content-Disposition", "inline").build(); }
public static <T> Map<String, ?> serialize(T object) { try { if (object == null) { return null; } return serialize(object, object.getClass(), ""); } catch (Exception e) { throw new RuntimeException(e); } }
@Test public void testConfigRoundtrip() throws Exception { // Load the config and check it CombinedConfig combinedConfig = CombinedConfigLoader .loadCombinedConfig(new File(getClass().getClassLoader().getResource("test-table-config.conf").getFile())); TableConfig config = combinedConfig.getOfflineTableConfig(); validateLoadedConfig(config); // Shallow serialization (to a map of objects): serialize to a map of objects, deserialize and check config final Map<String, ?> serialize = Serializer.serialize(config); TableConfig newConfig = Deserializer.deserialize(TableConfig.class, serialize, ""); Assert.assertEquals(config, newConfig); validateLoadedConfig(newConfig); // Serialization to a string (which could be written to a file): serialize to a string, deserialize and check config String configAsString = Serializer.serializeToString(config); TableConfig newConfigFromString = Deserializer.deserializeFromString(TableConfig.class, configAsString); if (!config.equals(newConfigFromString)) { System.out.println("Serialized config is = " + configAsString); System.out.println("Expected a config that contains: " + config); } Assert.assertEquals(config, newConfigFromString); validateLoadedConfig(newConfigFromString); }
Map<String, Class<? extends SingleKeyDsl>> dslClasses = HashMap.empty(); for (Field field : getClassFields(clazz)) { ConfigKey configKey = field.getAnnotation(ConfigKey.class); NestedConfig nestedConfig = field.getAnnotation(NestedConfig.class); values = storeSimpleFieldIntoMap(field.get(object), field.getType(), keyName, values); } else { values = values.merge(serialize(field.get(object), field.getType(), keyName)); values = values.merge(serialize(field.get(object), field.getType(), pathContext));
protected void completeTableConfiguration() { if (isUsingNewConfigFormat()) { CombinedConfig combinedConfig = new CombinedConfig(_offlineTableConfig, _realtimeTableConfig, _schema); try { sendPostRequest(_controllerRequestURLBuilder.forNewTableCreate(), Serializer.serializeToString(combinedConfig)); } catch (IOException e) { throw new RuntimeException(e); } } }
String computedConfig = Serializer.serializeToPropertiesString(combinedConfig);
protected void updateTableConfiguration() { if (isUsingNewConfigFormat()) { CombinedConfig combinedConfig = new CombinedConfig(_offlineTableConfig, _realtimeTableConfig, _schema); try { sendPutRequest(_controllerRequestURLBuilder.forNewUpdateTableConfig(_offlineTableConfig.getTableName()), Serializer.serializeToString(combinedConfig)); } catch (IOException e) { throw new RuntimeException(e); } } } }
@Override public Map<String, ?> unhandleChildKeys(java.util.Map<String, T> value, String pathPrefix) { if (value == null) { return null; } final io.vavr.collection.HashMap<String, ?> serialized = io.vavr.collection.HashMap.ofAll(value).flatMap( (columnName, columnPartitionConfig) -> Serializer.serialize(columnPartitionConfig) .map((key, obj) -> Tuple.of(columnName + "." + key, obj))); return serialized; } }
@Override public Map<String, ?> unhandleChildKeys(java.util.List<T> values, String pathPrefix) { if (values == null) { return null; } return List.ofAll(values).flatMap(value -> { Map<String, ?> serializedValue = Serializer.serialize(value); final String name = (String) serializedValue.getOrElse("name", null); return serializedValue.remove("name").mapKeys(key -> name + "." + key); }).toMap(Function.identity()); } }
if (config.containsKey(keyName)) { Object dslValue = dsl.parse(config.getOrElse(keyName, null).toString()); Map<String, ?> dslValues = Serializer.serialize(dslValue);
public static <T> String serializeToString(T object) { Config config = ConfigFactory.parseMap(serialize(object).toJavaMap()); return config.root().render(ConfigRenderOptions.defaults().setJson(false).setOriginComments(false)); }
public static <T> String serializeToPropertiesString(T object) { ConfigRenderOptions configRenderOptions = ConfigRenderOptions.defaults().setJson(false).setOriginComments(false).setFormatted(false); return serialize(object).map( keyValueTuple -> keyValueTuple._1 + "=" + ConfigValueFactory.fromAnyRef(keyValueTuple._2) .render(configRenderOptions)).sorted().mkString("\n"); }