/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.tool;
import java.io.File;
import java.util.Properties;
import junit.framework.TestCase;
import org.apache.activemq.tool.properties.ReflectionConfigurable;
import org.apache.activemq.tool.properties.ReflectionUtil;
public class ReflectionUtilTest extends TestCase {
public void testConfigurableOption() {
TestClass5 data = new TestClass5();
data.willIntercept = true;
ReflectionUtil.configureClass(data, "this-should-not-matter", "this-should-not-matter");
assertTrue(data.intercepted);
data.willIntercept = false;
data.nest = new TestClass5();
data.nest.willIntercept = true;
ReflectionUtil.configureClass(data, "nest.this-should-not-matter", "this-should-not-matter");
assertTrue(data.intercepted);
assertTrue(data.nest.intercepted);
data.willIntercept = false;
data.nest = new TestClass5();
data.nest.willIntercept = false;
data.nest.nest = new TestClass5();
data.nest.nest.willIntercept = true;
ReflectionUtil.configureClass(data, "nest.nest.this-should-not-matter", "this-should-not-matter");
assertTrue(data.intercepted);
assertTrue(data.nest.intercepted);
assertTrue(data.nest.nest.intercepted);
TestClass6 data2 = new TestClass6();
data2.nestConfig = new TestClass5();
data2.nestConfig.willIntercept = true;
ReflectionUtil.configureClass(data2, "nestConfig.this-should-not-matter", "this-should-not-matter");
assertTrue(data2.nestConfig.intercepted);
data2.nestNotConfig = new TestClass6();
data2.nestNotConfig.nestConfig = new TestClass5();
data2.nestNotConfig.nestConfig.willIntercept = true;
ReflectionUtil.configureClass(data2, "nestNotConfig.nestConfig.this-should-not-matter", "this-should-not-matter");
assertTrue(data2.nestNotConfig.nestConfig.intercepted);
}
public void testDataTypeConfig() {
TestClass3 targetObj = new TestClass3();
// Initialize variables;
targetObj.setBooleanData(false);
targetObj.setIntData(0);
targetObj.setLongData(0);
targetObj.setShortData((short)0);
targetObj.setDoubleData(0.0);
targetObj.setFloatData(0.0F);
targetObj.setByteData((byte)0);
targetObj.setCharData('0');
targetObj.setStringData("false");
// Set properties
Properties props = new Properties();
props.setProperty("booleanData", "true");
props.setProperty("intData", "1000");
props.setProperty("longData", "2000");
props.setProperty("shortData", "3000");
props.setProperty("doubleData", "1234.567");
props.setProperty("floatData", "9876.543");
props.setProperty("byteData", "127");
props.setProperty("charData", "A");
props.setProperty("stringData", "true");
ReflectionUtil.configureClass(targetObj, props);
// Check config
assertEquals(true, targetObj.isBooleanData());
assertEquals(1000, targetObj.getIntData());
assertEquals(2000, targetObj.getLongData());
assertEquals(3000, targetObj.getShortData());
assertEquals(1234.567, targetObj.getDoubleData(), 0.0001);
assertEquals(9876.543, targetObj.getFloatData(), 0.0001);
assertEquals(127, targetObj.getByteData());
assertEquals('A', targetObj.getCharData());
assertEquals("true", targetObj.getStringData());
}
public void testValueOfMethod() {
TestClass4 targetObj = new TestClass4();
ReflectionUtil.configureClass(targetObj, "testFile", "TEST.FOO.BAR");
assertEquals("TEST.FOO.BAR", targetObj.testFile.toString());
}
public void testGetProperties() {
TestClass3 testData = new TestClass3();
testData.setBooleanData(false);
testData.setByteData((byte)15);
testData.setCharData('G');
testData.setDoubleData(765.43);
testData.setFloatData(543.21F);
testData.setIntData(654321);
testData.setLongData(987654321);
testData.setShortData((short)4321);
testData.setStringData("BAR.TEST.FOO");
TestClass3 targetObj = new TestClass3();
targetObj.setBooleanData(true);
targetObj.setByteData((byte)10);
targetObj.setCharData('D');
targetObj.setDoubleData(1234.567);
targetObj.setFloatData(4567.89F);
targetObj.setIntData(123456);
targetObj.setLongData(1234567890);
targetObj.setShortData((short)1234);
targetObj.setStringData("Test.FOO.BAR");
targetObj.setTestData(testData);
Properties p = ReflectionUtil.retrieveObjectProperties(targetObj);
assertEquals("true", p.getProperty("booleanData"));
assertEquals("10", p.getProperty("byteData"));
assertEquals("D", p.getProperty("charData"));
assertEquals("1234.567", p.getProperty("doubleData"));
assertEquals("4567.89", p.getProperty("floatData"));
assertEquals("123456", p.getProperty("intData"));
assertEquals("1234567890", p.getProperty("longData"));
assertEquals("1234", p.getProperty("shortData"));
assertEquals("Test.FOO.BAR", p.getProperty("stringData"));
assertEquals("false", p.getProperty("testData.booleanData"));
assertEquals("15", p.getProperty("testData.byteData"));
assertEquals("G", p.getProperty("testData.charData"));
assertEquals("765.43", p.getProperty("testData.doubleData"));
assertEquals("543.21", p.getProperty("testData.floatData"));
assertEquals("654321", p.getProperty("testData.intData"));
assertEquals("987654321", p.getProperty("testData.longData"));
assertEquals("4321", p.getProperty("testData.shortData"));
assertEquals("BAR.TEST.FOO", p.getProperty("testData.stringData"));
}
public void testNestedConfig() {
TestClass3 t1 = new TestClass3();
TestClass3 t2 = new TestClass3();
TestClass3 t3 = new TestClass3();
TestClass3 t4 = new TestClass3();
TestClass3 t5 = new TestClass3();
ReflectionUtil.configureClass(t1, "stringData", "t1");
assertEquals("t1", t1.getStringData());
t1.setTestData(t2);
ReflectionUtil.configureClass(t1, "testData.stringData", "t2");
assertEquals("t2", t2.getStringData());
t2.setTestData(t3);
ReflectionUtil.configureClass(t1, "testData.testData.stringData", "t3");
assertEquals("t3", t3.getStringData());
t3.setTestData(t4);
ReflectionUtil.configureClass(t1, "testData.testData.testData.stringData", "t4");
assertEquals("t4", t4.getStringData());
t4.setTestData(t5);
ReflectionUtil.configureClass(t1, "testData.testData.testData.testData.stringData", "t5");
assertEquals("t5", t5.getStringData());
}
public class TestClass1 {
private boolean booleanData;
private int intData;
private long longData;
public boolean isBooleanData() {
return booleanData;
}
public void setBooleanData(boolean booleanData) {
this.booleanData = booleanData;
}
public int getIntData() {
return intData;
}
public void setIntData(int intData) {
this.intData = intData;
}
public long getLongData() {
return longData;
}
public void setLongData(long longData) {
this.longData = longData;
}
}
public class TestClass2 extends TestClass1 {
private float floatData;
private byte byteData;
private char charData;
public float getFloatData() {
return floatData;
}
public void setFloatData(float floatData) {
this.floatData = floatData;
}
public byte getByteData() {
return byteData;
}
public void setByteData(byte byteData) {
this.byteData = byteData;
}
public char getCharData() {
return charData;
}
public void setCharData(char charData) {
this.charData = charData;
}
}
public class TestClass3 extends TestClass2 {
private short shortData;
private double doubleData;
private String stringData;
private TestClass3 testData;
public short getShortData() {
return shortData;
}
public void setShortData(short shortData) {
this.shortData = shortData;
}
public double getDoubleData() {
return doubleData;
}
public void setDoubleData(double doubleData) {
this.doubleData = doubleData;
}
public String getStringData() {
return stringData;
}
public void setStringData(String stringData) {
this.stringData = stringData;
}
public TestClass3 getTestData() {
return testData;
}
public void setTestData(TestClass3 testData) {
this.testData = testData;
}
public TestClass3 getRecursiveData() {
return this;
}
}
public class TestClass4 {
private File testFile;
public String getTestFile() {
return testFile.toString();
}
public void setTestFile(String testFile) {
this.testFile = new File(testFile);
}
}
public class TestClass5 implements ReflectionConfigurable {
public boolean intercepted;
public boolean willIntercept = true;
public TestClass5 nest;
public void configureProperties(Properties props) {
// Do nothing
}
public Properties retrieveProperties(Properties props) {
return null;
}
public boolean acceptConfig(String key, String val) {
intercepted = true;
return !willIntercept;
}
public TestClass5 getNest() {
return nest;
}
public void setNest(TestClass5 nest) {
this.nest = nest;
}
}
public class TestClass6 {
public TestClass6 nestNotConfig;
public TestClass5 nestConfig;
public TestClass6 getNestNotConfig() {
return nestNotConfig;
}
public void setNestNotConfig(TestClass6 nestNotConfig) {
this.nestNotConfig = nestNotConfig;
}
public TestClass5 getNestConfig() {
return nestConfig;
}
public void setNestConfig(TestClass5 nestConfig) {
this.nestConfig = nestConfig;
}
}
}