/* * 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.aries.jmx.blueprint; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; import javax.management.openmbean.ArrayType; import javax.management.openmbean.CompositeType; import javax.management.openmbean.OpenDataException; import javax.management.openmbean.OpenType; import javax.management.openmbean.TabularType; /** * The item class enables the definition of open types in the appropriate interfaces. * * This class contains a number of methods that make it possible to create open types for {@link CompositeType}, * {@link TabularType}, and {@link ArrayType}. The normal creation throws a checked exception, making it impossible to * use them in a static initializer. They constructors are also not very suitable for static construction. * * * An Item instance describes an item in a Composite Type. It groups the triplet of name, description, and Open Type. * These Item instances allows the definitions of an item to stay together. * * @Immutable */ public class Item { /** * The name of this item. */ private final String name; /** * The description of this item. */ private final String description; /** * The type of this item. */ private final OpenType/*<?>*/ type; /** * Create a triple of name, description, and type. This triplet is used in the creation of a Composite Type. * * @param name * The name of the item. * @param description * The description of the item. * @param type * The Open Type of this item. * @param restrictions * Ignored, contains list of restrictions */ public Item(String name, String description, OpenType/*<?>*/ type, String... restrictions) { this.name = name; this.description = description; this.type = type; } /** * Create a Tabular Type. * * @param name * The name of the Tabular Type. * @param description * The description of the Tabular Type. * @param rowType * The Open Type for a row * @param index * The names of the items that form the index . * @return A new Tabular Type composed from the parameters. * @throws RuntimeException * when the Tabular Type throws an OpenDataException */ static public TabularType tabularType(String name, String description, CompositeType rowType, String... index) { try { return new TabularType(name, description, rowType, index); } catch (OpenDataException e) { throw new RuntimeException(e); } } /** * Create a Composite Type * * @param name * The name of the Tabular Type. * @param description * The description of the Tabular Type. * @param items * The items that describe the composite type. * @return a new Composite Type * @throws RuntimeException * when the Tabular Type throws an OpenDataException */ static public CompositeType compositeType(String name, String description, Item... items) { return extend(null, name, description, items); } /** * Extend a Composite Type by adding new items. Items can override items in the parent type. * * @param parent * The parent type, can be <code>null</code> * @param name * The name of the type * @param description * The description of the type * @param items * The items that should be added/override to the parent type * @return A new Composite Type that extends the parent type * @throws RuntimeException * when an OpenDataException is thrown */ public static CompositeType extend(CompositeType parent, String name, String description, Item... items) { Set<Item> all = new LinkedHashSet<Item>(); if (parent != null) { for (Object nm : parent.keySet()) { String key = (String) nm; all.add(new Item((String) nm, parent.getDescription(key), parent.getType(key))); } } all.addAll(Arrays.asList(items)); String names[] = new String[all.size()]; String descriptions[] = new String[all.size()]; OpenType types[] = new OpenType[all.size()]; int n = 0; for (Item item : all) { names[n] = item.name; descriptions[n] = item.description; types[n] = item.type; n++; } try { return new CompositeType(name, description, names, descriptions, types); } catch (OpenDataException e) { throw new RuntimeException(e); } } /** * Return a new Array Type. * * @param dim * The dimension * @param elementType * The element type * @return A new Array Type */ public static <T> ArrayType<T> arrayType(int dim, OpenType<T> elementType) { try { return new ArrayType<T>(dim, elementType); } catch (OpenDataException e) { throw new RuntimeException(e); } } /** * Return a new primaArray Type. * * @param elementType * The element type * @return A new Array Type */ /* * For the compatibility with java 5, we have to cancel this method temporarily. * * public static ArrayType<?> primitiveArrayType(SimpleType<?> elementType) { try { return new ArrayType(elementType, true); } catch (OpenDataException e) { throw new RuntimeException(e); } } */ }