public DeclarableType(String className, Properties properties) { if (StringUtils.isBlank(className)) { return; } this.className = className; if (properties != null) { parameters = properties.stringPropertyNames().stream() .map(k -> new ParameterType(k, properties.getProperty(k))).collect(Collectors.toList()); } }
public ParameterType(String name, String value) { this.name = name; setString(value); }
@Test public void declarableWithDeclarableParam() { DeclarableType declarable = new DeclarableType("className"); ParameterType param = new ParameterType("param1"); param.setDeclarable(new DeclarableType("anotherClassName", "{'k':'v'}")); declarable.getParameters().add(param); assertThat(declarable.toString()).isEqualTo("className{param1:anotherClassName{k:v}}"); DeclarableType d2 = new DeclarableType("className"); ParameterType p2 = new ParameterType("param1"); p2.setDeclarable(new DeclarableType("anotherClassName", "{'k':'v'}")); d2.getParameters().add(p2); assertThat(declarable).isEqualTo(d2); DeclarableType d3 = new DeclarableType("className"); ParameterType p3 = new ParameterType("param1"); p3.setDeclarable(new DeclarableType("anotherClassName", "{'k':'v2'}")); d3.getParameters().add(p3); assertThat(declarable).isNotEqualTo(d3); }
public static <T extends Declarable> T newInstance(DeclarableType declarableType, Cache cache) { try { Class<T> loadedClass = (Class<T>) ClassPathLoader.getLatest().forName(declarableType.getClassName()); T declarable = loadedClass.newInstance(); Properties initProperties = new Properties(); for (ParameterType parameter : declarableType.getParameters()) { initProperties.put(parameter.getName(), newInstance(parameter, cache)); } declarable.initialize(cache, initProperties); return declarable; } catch (Exception e) { throw new RuntimeException( "Error instantiating class: <" + declarableType.getClassName() + ">", e); } }
@Before public void setUp() throws Exception { cacheConfig = new CacheConfig("1.0"); cacheXml = "<cache version=\"1.0\" xsi:schemaLocation=\"http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd\" xmlns=\"http://geode.apache.org/schema/cache\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"; service = new JAXBService(CacheConfig.class); service.validateWithLocalCacheXSD(); regionConfig = new RegionConfig(); regionConfig.setName("regionA"); regionConfig.setType("REPLICATE"); regionXml = "<region name=\"regionA\" refid=\"REPLICATE\">"; classNameTypeXml = "<class-name>my.className</class-name>"; declarableWithString = new DeclarableType("my.className", "{'key':'value'}"); declarableWithStringXml = classNameTypeXml + "<parameter name=\"key\"><string>value</string></parameter>"; declarableWithParam = new DeclarableType("my.className"); ParameterType param = new ParameterType("key"); param.setDeclarable(declarableWithString); declarableWithParam.getParameters().add(param); declarableWithParamXml = classNameTypeXml + "<parameter name=\"key\"><declarable>" + declarableWithStringXml + "</declarable></parameter>"; }
@Test public void createDeclarableInstancedFromNestedDeclarableType() { DeclarableType declarableType = new DeclarableType(MyDeclarable.class.getName(), "{\"value1\":5,\"value2\":\"some string\"}"); ParameterType parameterType = new ParameterType("inner-prop", declarableType); DeclarableType outerDeclarable = new DeclarableType(MyOuterDeclarable.class.getName()); outerDeclarable.getParameters().add(parameterType); MyOuterDeclarable result = DeclarableTypeInstantiator.newInstance(outerDeclarable, cache); assertThat(result.props).isNotNull(); MyDeclarable innerDeclarable = (MyDeclarable) result.props.get("inner-prop"); assertThat(innerDeclarable.props.getProperty("value1")).isEqualTo("5"); assertThat(innerDeclarable.props.getProperty("value2")).isEqualTo("some string"); } }
@Test public void declarableWithStringParam() { DeclarableType declarable = new DeclarableType("className"); assertThat(declarable).isEqualTo(declarable); assertThat(declarable).isEqualTo(new DeclarableType("className")); assertThat(declarable).isNotEqualTo(new DeclarableType("anotherClassName")); ParameterType parameter = new ParameterType("name", "value"); declarable.getParameters().add(parameter); DeclarableType d2 = new DeclarableType("className"); assertThat(declarable).isNotEqualTo(d2); d2.getParameters().add(parameter); assertThat(declarable).isEqualTo(d2); // has one common parameter, but d2 has additional param d2.getParameters().add(new ParameterType("name1", "value1")); assertThat(declarable).isNotEqualTo(d2); // same size, but different param value DeclarableType d3 = new DeclarableType("className"); d3.getParameters().add(new ParameterType("name", "value1")); assertThat(declarable).isNotEqualTo(d3); assertThat(declarable.toString()).isEqualTo("className{name:value}"); }