blob: ad682be7bb850dad36fa414e361fadcd20004438 [file] [log] [blame]
/*
* 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.karaf.features.management.codec;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.management.openmbean.TabularData;
import javax.management.openmbean.TabularType;
import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import javax.management.openmbean.ArrayType;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.TabularDataSupport;
import org.apache.karaf.features.BundleInfo;
import org.apache.karaf.features.ConfigFileInfo;
import org.apache.karaf.features.Feature;
import org.apache.karaf.features.management.FeaturesServiceMBean;
public class JmxFeature {
/**
* The CompositeType which represents a single feature
*/
public final static CompositeType FEATURE;
/**
* The TabularType which represents a list of features
*/
public final static TabularType FEATURE_TABLE;
public final static CompositeType FEATURE_IDENTIFIER;
public final static TabularType FEATURE_IDENTIFIER_TABLE;
public final static CompositeType FEATURE_CONFIG_ELEMENT;
public final static TabularType FEATURE_CONFIG_ELEMENT_TABLE;
public final static CompositeType FEATURE_CONFIG;
public final static TabularType FEATURE_CONFIG_TABLE;
public final static CompositeType FEATURE_CONFIG_FILES;
public final static TabularType FEATURE_CONFIG_FILES_TABLE;
private final CompositeData data;
public JmxFeature(Feature feature, boolean installed) {
try {
String[] itemNames = FeaturesServiceMBean.FEATURE;
Object[] itemValues = new Object[itemNames.length];
itemValues[0] = feature.getName();
itemValues[1] = feature.getVersion();
itemValues[2] = getFeatureIdentifierTable(feature.getDependencies());
itemValues[3] = getBundleUris(feature.getBundles());
itemValues[4] = getConfigTable(feature.getConfigurations());
itemValues[5] = getConfigFileList(feature.getConfigurationFiles());
itemValues[6] = installed;
data = new CompositeDataSupport(FEATURE, itemNames, itemValues);
} catch (OpenDataException e) {
throw new IllegalStateException("Cannot form feature open data", e);
}
}
public CompositeData asCompositeData() {
return data;
}
public static TabularData tableFrom(Collection<JmxFeature> features) {
TabularDataSupport table = new TabularDataSupport(FEATURE_TABLE);
for (JmxFeature feature : features) {
table.put(feature.asCompositeData());
}
return table;
}
static TabularData getFeatureIdentifierTable(List<Feature> features) throws OpenDataException {
TabularDataSupport table = new TabularDataSupport(FEATURE_IDENTIFIER_TABLE);
Set<String> featureSet = new HashSet<String>();
for (Feature feature : features) {
if (featureSet.contains(feature.getName() + feature.getVersion())) {
continue;
} else {
featureSet.add(feature.getName() + feature.getVersion());
}
String[] itemNames = new String[] { FeaturesServiceMBean.FEATURE_NAME, FeaturesServiceMBean.FEATURE_VERSION };
Object[] itemValues = new Object[] { feature.getName(), feature.getVersion() };
CompositeData ident = new CompositeDataSupport(FEATURE_IDENTIFIER, itemNames, itemValues);
table.put(ident);
}
return table;
}
static String[] getBundleUris(List<BundleInfo> infos) {
String[] array = new String[infos.size()];
for (int i = 0; i < array.length; i++) {
array[i] = infos.get(i).getLocation();
}
return array;
}
static TabularData getConfigTable(Map<String, Map<String, String>> configs) throws OpenDataException {
TabularDataSupport table = new TabularDataSupport(FEATURE_CONFIG_TABLE);
for (Map.Entry<String, Map<String, String>> entry : configs.entrySet()) {
String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG;
Object[] itemValues = new Object[2];
itemValues[0] = entry.getKey();
itemValues[1] = getConfigElementTable(entry.getValue());
CompositeData config = new CompositeDataSupport(FEATURE_CONFIG, itemNames, itemValues);
table.put(config);
}
return table;
}
static TabularData getConfigFileList(List<ConfigFileInfo> configFiles) throws OpenDataException {
TabularDataSupport table = new TabularDataSupport(FEATURE_CONFIG_FILES_TABLE);
for (ConfigFileInfo configFile : configFiles) {
String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_FILES;
Object[] itemValues = { configFile.getFinalname() };
CompositeData config = new CompositeDataSupport(FEATURE_CONFIG_FILES, itemNames, itemValues);
table.put(config);
}
return table;
}
static TabularData getConfigElementTable(Map<String, String> config) throws OpenDataException {
TabularDataSupport table = new TabularDataSupport(FEATURE_CONFIG_ELEMENT_TABLE);
for (Map.Entry<String, String> entry : config.entrySet()) {
String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_ELEMENT;
Object[] itemValues = { entry.getKey(), entry.getValue() };
CompositeData element = new CompositeDataSupport(FEATURE_CONFIG_ELEMENT, itemNames, itemValues);
table.put(element);
}
return table;
}
static {
FEATURE_IDENTIFIER = createFeatureIdentifierType();
FEATURE_IDENTIFIER_TABLE = createFeatureIdentifierTableType();
FEATURE_CONFIG_ELEMENT = createFeatureConfigElementType();
FEATURE_CONFIG_ELEMENT_TABLE = createFeatureConfigElementTableType();
FEATURE_CONFIG = createFeatureConfigType();
FEATURE_CONFIG_TABLE = createFeatureConfigTableType();
FEATURE_CONFIG_FILES = createFeatureConfigFilesType();
FEATURE_CONFIG_FILES_TABLE = createFeatureConfigFilesTableType();
FEATURE = createFeatureType();
FEATURE_TABLE = createFeatureTableType();
}
private static CompositeType createFeatureIdentifierType() {
try {
String description = "This type identify a Karaf features";
String[] itemNames = FeaturesServiceMBean.FEATURE_IDENTIFIER;
OpenType[] itemTypes = new OpenType[itemNames.length];
String[] itemDescriptions = new String[itemNames.length];
itemTypes[0] = SimpleType.STRING;
itemTypes[1] = SimpleType.STRING;
itemDescriptions[0] = "The id of the feature";
itemDescriptions[1] = "The version of the feature";
return new CompositeType("FeatureIdentifier", description, itemNames,
itemDescriptions, itemTypes);
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build featureIdentifier type", e);
}
}
private static TabularType createFeatureIdentifierTableType() {
try {
return new TabularType("Features", "The table of featureIdentifiers",
FEATURE_IDENTIFIER, new String[] { FeaturesServiceMBean.FEATURE_NAME, FeaturesServiceMBean.FEATURE_VERSION });
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build featureIdentifier table type", e);
}
}
private static CompositeType createFeatureConfigElementType() {
try {
String description = "This type encapsulates Karaf feature config element";
String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_ELEMENT;
OpenType[] itemTypes = new OpenType[itemNames.length];
String[] itemDescriptions = new String[itemNames.length];
itemTypes[0] = SimpleType.STRING;
itemTypes[1] = SimpleType.STRING;
itemDescriptions[0] = "The key";
itemDescriptions[1] = "The value";
return new CompositeType("ConfigElement", description, itemNames,
itemDescriptions, itemTypes);
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build configElement type", e);
}
}
private static TabularType createFeatureConfigElementTableType() {
try {
return new TabularType("ConfigElement", "The table of configurations elements",
FEATURE_CONFIG_ELEMENT, new String[] { FeaturesServiceMBean.FEATURE_CONFIG_ELEMENT_KEY});
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build feature table type", e);
}
}
private static CompositeType createFeatureConfigType() {
try {
String description = "This type encapsulates Karaf feature config";
String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG;
OpenType[] itemTypes = new OpenType[itemNames.length];
String[] itemDescriptions = new String[itemNames.length];
itemTypes[0] = SimpleType.STRING;
itemTypes[1] = FEATURE_CONFIG_ELEMENT_TABLE;
itemDescriptions[0] = "The PID of the config";
itemDescriptions[1] = "The configuration elements";
return new CompositeType("Config", description, itemNames,
itemDescriptions, itemTypes);
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build configElement type", e);
}
}
private static CompositeType createFeatureConfigFilesType() {
try {
String description = "This type encapsulates Karaf feature config files";
String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_FILES;
OpenType[] itemTypes = new OpenType[itemNames.length];
String[] itemDescriptions = new String[itemNames.length];
itemTypes[0] = SimpleType.STRING;
itemDescriptions[0] = "The configuration file";
return new CompositeType("Config", description, itemNames,
itemDescriptions, itemTypes);
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build configElement type", e);
}
}
private static TabularType createFeatureConfigTableType() {
try {
return new TabularType("Features", "The table of configurations",
FEATURE_CONFIG, new String[] { FeaturesServiceMBean.FEATURE_CONFIG_PID});
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build feature table type", e);
}
}
private static TabularType createFeatureConfigFilesTableType() {
try {
return new TabularType("Features", "The table of configuration files",
FEATURE_CONFIG_FILES, new String[] { FeaturesServiceMBean.FEATURE_CONFIG_FILES_ELEMENTS });
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build feature table type", e);
}
}
private static CompositeType createFeatureType() {
try {
String description = "This type encapsulates Karaf features";
String[] itemNames = FeaturesServiceMBean.FEATURE;
OpenType[] itemTypes = new OpenType[itemNames.length];
String[] itemDescriptions = new String[itemNames.length];
itemTypes[0] = SimpleType.STRING;
itemTypes[1] = SimpleType.STRING;
itemTypes[2] = FEATURE_IDENTIFIER_TABLE;
itemTypes[3] = new ArrayType(1, SimpleType.STRING);
itemTypes[4] = FEATURE_CONFIG_TABLE;
itemTypes[5] = FEATURE_CONFIG_FILES_TABLE;
itemTypes[6] = SimpleType.BOOLEAN;
itemDescriptions[0] = "The name of the feature";
itemDescriptions[1] = "The version of the feature";
itemDescriptions[2] = "The feature dependencies";
itemDescriptions[3] = "The feature bundles";
itemDescriptions[4] = "The feature configurations";
itemDescriptions[5] = "The feature configuration files";
itemDescriptions[6] = "Whether the feature is installed";
return new CompositeType("Feature", description, itemNames,
itemDescriptions, itemTypes);
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build feature type", e);
}
}
private static TabularType createFeatureTableType() {
try {
return new TabularType("Features", "The table of all features",
FEATURE, new String[] { FeaturesServiceMBean.FEATURE_NAME, FeaturesServiceMBean.FEATURE_VERSION });
} catch (OpenDataException e) {
throw new IllegalStateException("Unable to build feature table type", e);
}
}
}