Java tutorial
package org.jolokia.converter.json; /* * Copyright 2009-2011 Roland Huss * * Licensed 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. */ import java.lang.reflect.InvocationTargetException; import java.util.*; import javax.management.*; import javax.management.openmbean.*; import org.jolokia.converter.object.StringToObjectConverter; import org.jolokia.converter.util.CompositeTypeAndJson; import org.jolokia.converter.util.TabularTypeAndJson; import org.json.simple.JSONObject; import org.testng.annotations.*; import static javax.management.openmbean.SimpleType.*; import static org.testng.Assert.*; /** * @author roland * @since 05.08.11 */ @Test public class TabularDataExtractorTest { private static final String TEST_VALUE = "value1"; TabularDataExtractor extractor = new TabularDataExtractor(); ObjectToJsonConverter converter; @BeforeMethod public void setup() { converter = new ObjectToJsonConverter(new StringToObjectConverter(), null); converter.setupContext(new JsonConvertOptions.Builder().useAttributeFilter(true).build()); } @AfterMethod public void tearDown() { converter.clearContext(); } @Test public void typeInfo() { assertEquals(extractor.getType(), TabularData.class); assertFalse(extractor.canSetValue()); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*written to.*") public void setValue() throws InvocationTargetException, IllegalAccessException { extractor.setObjectValue(new StringToObjectConverter(), new Object(), "bla", "blub"); } @Test public void extractMapAsJson() throws OpenDataException, AttributeNotFoundException { TabularData data = getMapTabularData(STRING, "key1", TEST_VALUE); JSONObject result = (JSONObject) extract(true, data); assertNull(result.get("key2")); assertEquals(result.get("key1"), TEST_VALUE); assertEquals(result.size(), 1); } @Test public void extractMapAsJsonWithPath() throws OpenDataException, AttributeNotFoundException { TabularData data = getMapTabularData(STRING, "key1", TEST_VALUE); assertEquals(extract(true, data, "key1"), TEST_VALUE); } @Test public void extractMapAsJsonWithWildcardPath() throws OpenDataException, AttributeNotFoundException, MalformedObjectNameException { TabularData data = prepareMxMBeanMapData("key1", "test:type=bla", "key2", "java.lang:type=Memory"); JSONObject result = (JSONObject) extract(true, data, null, "domain"); assertEquals(result.size(), 2); assertEquals(result.get("key1"), "test"); assertEquals(result.get("key2"), "java.lang"); } @Test(expectedExceptions = ValueFaultHandler.AttributeFilteredException.class) public void extractMapAsJsonWithWildcardPathButFiltered() throws OpenDataException, AttributeNotFoundException, MalformedObjectNameException { TabularData data = prepareMxMBeanMapData("key1", "test:type=bla", "key2", "java.lang:type=Memory"); extract(true, data, null, "noKnownAttribute"); } private TabularData prepareMxMBeanMapData(String... keyAndValues) throws OpenDataException, MalformedObjectNameException { CompositeTypeAndJson ctj = new CompositeTypeAndJson(STRING, "key", null, OBJECTNAME, "value", null); TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "key" }, ctj); TabularData data = new TabularDataSupport(taj.getType()); for (int i = 0; i < keyAndValues.length; i += 2) { CompositeData cd = new CompositeDataSupport(ctj.getType(), new String[] { "key", "value" }, new Object[] { keyAndValues[i], new ObjectName(keyAndValues[i + 1]) }); data.put(cd); } return data; } @Test public void extractMapWithComplexType() throws OpenDataException, AttributeNotFoundException { CompositeTypeAndJson cdj = new CompositeTypeAndJson(STRING, "name", "roland", INTEGER, "date", 1968); TabularData data = getMapTabularData(cdj.getType(), cdj.getCompositeData(), TEST_VALUE); JSONObject result = (JSONObject) extract(true, data); assertEquals(result.size(), 2); assertTrue(result.containsKey("indexNames")); assertTrue(result.containsKey("values")); List indexNames = (List) result.get("indexNames"); assertEquals(indexNames.size(), 1); assertTrue(indexNames.contains("key")); List values = (List) result.get("values"); assertEquals(values.size(), 1); JSONObject value = (JSONObject) values.get(0); JSONObject key = (JSONObject) value.get("key"); assertEquals(key.get("name"), "roland"); assertEquals(key.get("date"), 1968); assertEquals(key.size(), 2); assertEquals(value.get("value"), TEST_VALUE); assertEquals(key.size(), 2); } @Test void extractMapDirect() throws OpenDataException, AttributeNotFoundException { TabularData data = getMapTabularData(STRING, "key1", TEST_VALUE); TabularData data2 = (TabularData) extract(false, data); assertEquals(data2, data); } @Test void extractMapWithPath() throws OpenDataException, AttributeNotFoundException { TabularData data = getMapTabularData(STRING, "key1", TEST_VALUE); Object result = extract(true, data, "key1"); assertEquals(result, TEST_VALUE); } @Test void extractGenericTabularDataWithJsonEmpty() throws OpenDataException, AttributeNotFoundException { CompositeTypeAndJson ctj = new CompositeTypeAndJson(STRING, "name", null, STRING, "firstname", null, INTEGER, "age", null, BOOLEAN, "male", null); TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "name", "firstname" }, ctj); TabularData data = new TabularDataSupport(taj.getType()); JSONObject result = (JSONObject) extract(true, data); assertTrue(result.isEmpty()); } @Test void extractGenericTabularDataWithJson() throws OpenDataException, AttributeNotFoundException { TabularData data = getComplexTabularData(); JSONObject result = (JSONObject) extract(true, data); assertEquals(result.size(), 2); assertTrue(result.containsKey("meyer")); assertTrue(result.containsKey("huber")); JSONObject meyerMap = (JSONObject) result.get("meyer"); assertTrue(meyerMap.containsKey("xaver")); assertTrue(meyerMap.containsKey("zensi")); assertEquals(meyerMap.size(), 2); JSONObject zensiMap = (JSONObject) meyerMap.get("zensi"); assertEquals(zensiMap.get("name"), "meyer"); assertEquals(zensiMap.get("firstname"), "zensi"); assertEquals(zensiMap.get("age"), 28); assertEquals(zensiMap.get("male"), false); assertEquals(zensiMap.size(), 4); } @Test void extractGenericTabularData() throws OpenDataException, AttributeNotFoundException { TabularData data = getComplexTabularData(); TabularData data2 = (TabularData) extract(false, data); assertEquals(data2, data); } @Test void extractGenericTabularDataWithPath() throws OpenDataException, AttributeNotFoundException { TabularData data = getComplexTabularData(); JSONObject result = (JSONObject) extract(true, data, "meyer", "xaver"); assertEquals(result.size(), 4); assertEquals(result.get("age"), 12); assertEquals(result.get("male"), true); } @Test void extractGenericTabularDataWithIntegerAndObjectNamePath() throws OpenDataException, AttributeNotFoundException, MalformedObjectNameException { TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "bundleId", "oName" }, new CompositeTypeAndJson(LONG, "bundleId", null, OBJECTNAME, "oName", null, BOOLEAN, "active", null)); TabularData data = new TabularDataSupport(taj.getType()); data.put( new CompositeDataSupport(taj.getType().getRowType(), new String[] { "bundleId", "oName", "active" }, new Object[] { 10L, new ObjectName("test:type=bundle"), false })); JSONObject result = (JSONObject) extract(true, data, "10", "test:type=bundle"); assertEquals(result.size(), 3); assertEquals(result.get("bundleId"), 10L); assertEquals(result.get("active"), false); } @Test public void extractWithWildCardPath() throws OpenDataException, MalformedObjectNameException, AttributeNotFoundException { TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "id" }, new CompositeTypeAndJson(LONG, "id", null, OBJECTNAME, "oName", null, BOOLEAN, "flag", null)); TabularData data = new TabularDataSupport(taj.getType()); data.put(new CompositeDataSupport(taj.getType().getRowType(), new String[] { "id", "oName", "flag" }, new Object[] { 10L, new ObjectName("test:type=bundle"), false })); data.put(new CompositeDataSupport(taj.getType().getRowType(), new String[] { "id", "oName", "flag" }, new Object[] { 20L, new ObjectName("java.lang:type=Memory"), true })); // Path: */*/domain --> 1. Level: 10, 20 -- 2. Level: CD key-value (e.g {id: 10, oName: test=type...}), -- 3. level: Objects // Here: Only ObjetNames should be picked JSONObject result = (JSONObject) extract(true, data, null, null, "domain"); assertEquals(result.size(), 2); // 10 & 20 JSONObject inner = (JSONObject) result.get(10L); assertEquals(inner.size(), 1); assertEquals(inner.get("oName"), "test"); inner = (JSONObject) result.get(20L); assertEquals(inner.size(), 1); assertEquals(inner.get("oName"), "java.lang"); // Path: */oName --> 1. Level: 10,20 -- 2. Level: { oName : { 10 vals}} result = (JSONObject) extract(true, data, null, "oName"); assertEquals(result.size(), 2); inner = (JSONObject) result.get(10L); assertEquals(inner.get("domain"), "test"); inner = (JSONObject) result.get(20L); assertEquals(inner.get("domain"), "java.lang"); } @Test(expectedExceptions = ValueFaultHandler.AttributeFilteredException.class) public void noMatchWithWildcardPattern() throws OpenDataException, MalformedObjectNameException, AttributeNotFoundException { TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "oName" }, new CompositeTypeAndJson(OBJECTNAME, "oName", null)); TabularData data = new TabularDataSupport(taj.getType()); data.put(new CompositeDataSupport(taj.getType().getRowType(), new String[] { "oName" }, new Object[] { new ObjectName("test:type=bundle") })); extract(true, data, null, "oName2"); } @Test(expectedExceptions = ValueFaultHandler.AttributeFilteredException.class) void extractGenericTabularDataWithToShortPath() throws OpenDataException, AttributeNotFoundException { extract(true, getComplexTabularData(), "meyer"); } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*Boolean.*") void extractTabularDataWithPathButWrongIndexType() throws OpenDataException, AttributeNotFoundException { TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "verein", "absteiger" }, new CompositeTypeAndJson(STRING, "verein", null, INTEGER, "platz", null, BOOLEAN, "absteiger", null)); TabularData data = new TabularDataSupport(taj.getType()); data.put(new CompositeDataSupport(taj.getType().getRowType(), new String[] { "verein", "platz", "absteiger" }, new Object[] { "fcn", 6, false })); extract(true, data, "fcn", "true"); } @Test void emptyMxMBeanTabularData() throws MalformedObjectNameException, OpenDataException, AttributeNotFoundException { TabularData data = prepareMxMBeanMapData(); JSONObject result = (JSONObject) extract(true, data); assertNotNull(result); assertEquals(result.size(), 0); } @Test void emptyTabularData() throws MalformedObjectNameException, OpenDataException, AttributeNotFoundException { CompositeType type = new CompositeType("testType", "Type for testing", new String[] { "testKey" }, new String[] { "bla" }, new OpenType[] { STRING }); TabularData data = new TabularDataSupport( new TabularType("test", "test desc", type, new String[] { "testKey" })); JSONObject result = (JSONObject) extract(true, data); assertNotNull(result); assertEquals(result.size(), 0); } private TabularData getComplexTabularData() throws OpenDataException { CompositeTypeAndJson ctj = new CompositeTypeAndJson(STRING, "name", null, STRING, "firstname", null, INTEGER, "age", null, BOOLEAN, "male", null); TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "name", "firstname" }, ctj); TabularData data = new TabularDataSupport(taj.getType()); data.put(new CompositeDataSupport(ctj.getType(), new String[] { "name", "firstname", "age", "male" }, new Object[] { "meyer", "xaver", 12, true })); data.put(new CompositeDataSupport(ctj.getType(), new String[] { "name", "firstname", "age", "male" }, new Object[] { "meyer", "zensi", 28, false })); data.put(new CompositeDataSupport(ctj.getType(), new String[] { "name", "firstname", "age", "male" }, new Object[] { "huber", "erna", 18, false })); return data; } private TabularData getMapTabularData(OpenType keyType, Object... keyAndValues) throws OpenDataException { CompositeTypeAndJson ctj = new CompositeTypeAndJson(keyType, "key", null, STRING, "value", null); TabularTypeAndJson taj = new TabularTypeAndJson(new String[] { "key" }, ctj); TabularData data = new TabularDataSupport(taj.getType()); for (int i = 0; i < keyAndValues.length; i += 2) { CompositeData cd = new CompositeDataSupport(ctj.getType(), new String[] { "key", "value" }, new Object[] { keyAndValues[i], keyAndValues[i + 1] }); data.put(cd); } return data; } private Object extract(boolean pJson, Object pValue, String... pPathElements) throws AttributeNotFoundException { Stack<String> extra = new Stack<String>(); if (pPathElements.length > 0) { for (String p : pPathElements) { extra.push(p); } } Collections.reverse(extra); return extractor.extractObject(converter, pValue, extra, pJson); } }