public static TabularData tableFrom(Collection<JmxProviderState> jmxProviderStates) {
   TabularDataSupport table = new TabularDataSupport(PROVIDER_STATE_TABLE);
   for (JmxProviderState entry : jmxProviderStates) {
     table.put(entry.asCompositeData());
   }
   return table;
 }
 /** Wraps the service statistics into JMX types */
 private void populateServiceStatistics(boolean clearCollectedStats) {
   // clear existing stats in the TabularDataSupport and re-populate it with current data extracted
   // from service framework classes
   serviceInvocationStatistics.clear();
   ServiceStatistics[] stats = getStats(clearCollectedStats);
   for (ServiceStatistics stat : stats) {
     Object[] statValues = new Object[attributeNames.length];
     statValues[0] = stat.getServiceName();
     statValues[1] = stat.getServiceVersion();
     statValues[2] = stat.getStartupTimeStamp().getTime();
     statValues[3] =
         stat.getLastCalledTimestamp() == null ? null : stat.getLastCalledTimestamp().getTime();
     statValues[4] = stat.getActiveRequestsCount();
     statValues[5] = stat.getTotalRequestsCount();
     statValues[6] = stat.getAverageResponseTime();
     statValues[7] = stat.getMinimumResponseTime();
     statValues[8] = stat.getMaximumResponseTime();
     statValues[9] = stat.getLastServiceRequestResponseTime();
     statValues[10] = stat.getErrorRequestsCount();
     statValues[11] = stat.getSuccessRequestsCount();
     CompositeData compositeData;
     try {
       compositeData = new CompositeDataSupport(compositeType, attributeNames, statValues);
       serviceInvocationStatistics.put(compositeData);
     } catch (OpenDataException e) {
       // ideally we should not get this exception
       LOGGER.error(
           "Error constructing JMX data type from service statistics. Error is : "
               + e.getMessage(),
           e);
     }
   }
 }
  @Test
  public void testJmxAttributeOfTypeTabularDataProviderConvertedToMap() throws Exception {
    // Create the CompositeType and TabularData
    CompositeType compositeType =
        new CompositeType(
            "typeName",
            "description",
            new String[] {"myint", "mystring", "mybool"}, // item names
            new String[] {
              "myint", "mystring", "mybool"
            }, // item descriptions, can't be null or empty string
            new OpenType<?>[] {SimpleType.INTEGER, SimpleType.STRING, SimpleType.BOOLEAN});
    TabularType tt =
        new TabularType("typeName", "description", compositeType, new String[] {"myint"});
    TabularDataSupport tds = new TabularDataSupport(tt);
    tds.put(
        new CompositeDataSupport(
            compositeType,
            new String[] {"mybool", "myint", "mystring"},
            new Object[] {true, 1234, "on"}));

    // Create MBean
    GeneralisedDynamicMBean mbean =
        jmxService.registerMBean(ImmutableMap.of(attributeName, tds), objectName);

    feed =
        JmxFeed.builder()
            .entity(entity)
            .pollAttribute(
                new JmxAttributePollConfig<Map>(mapAttribute)
                    .objectName(objectName)
                    .attributeName(attributeName)
                    .onSuccess((Function) JmxValueFunctions.tabularDataToMap()))
            .build();

    // Starts with value defined when registering...
    assertSensorEventually(
        mapAttribute,
        ImmutableMap.of("myint", 1234, "mystring", "on", "mybool", Boolean.TRUE),
        TIMEOUT_MS);
  }
  private static TabularData tabularData(
      String typeName, String typeDescription, String[] names, Object[] values) {
    if (names.length == 0) {
      return null;
    }

    OpenType<?>[] types = new OpenType<?>[names.length];
    for (int i = 0; i < types.length; i++) {
      types[i] = SimpleType.STRING;
    }

    try {
      CompositeType ct = new CompositeType(typeName, typeDescription, names, names, types);
      TabularType type = new TabularType(typeName, typeDescription, ct, names);
      TabularDataSupport data = new TabularDataSupport(type);

      CompositeData line = new CompositeDataSupport(ct, names, values);
      data.put(line);

      return data;
    } catch (OpenDataException e) {
      return null;
    }
  }
 /**
  * Adds the specified {@link CompositeData} value to the table, ignoring the supplied key, by
  * simply calling <code>put((CompositeData) val)</code>.
  *
  * @param key ignored.
  * @param val the {@link CompositeData} value to add.
  * @return the {@link CompositeData} value.
  * @throws NullPointerException if <code>val</code> is <code>null</code>.
  * @throws InvalidOpenTypeException if the type of the given value does not match the row type.
  * @throws KeyAlreadyExistsException if the value has the same calculated index as an existing
  *     value.
  */
 public Object put(Object key, Object val) {
   put((CompositeData) val);
   return val;
 }