/* * Jopr Management Platform * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.plugins.jbossas5.util; import java.io.Serializable; import java.util.Comparator; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jboss.deployers.spi.management.ManagementView; import org.jboss.deployers.spi.management.NameMatcher; import org.jboss.managed.api.ComponentType; import org.jboss.managed.api.ManagedComponent; import org.jboss.managed.api.ManagedProperty; import org.jboss.managed.api.annotation.ViewUse; import org.jboss.metatype.api.types.MetaType; import org.jboss.metatype.api.values.EnumValue; import org.jboss.metatype.api.values.SimpleValue; /** * A collection of utility methods for working with Profile Service {@link ManagedComponent}s. * * @author Ian Springer */ public class ManagedComponentUtils { private static final Comparator<ComponentType> COMPONENT_TYPE_COMPARATOR = new ComponentTypeComparator(); @Nullable public static ManagedComponent getSingletonManagedComponent(ManagementView managementView, ComponentType componentType) { Set<ManagedComponent> components = getManagedComponents(managementView, componentType); if (components.size() > 1) { throw new IllegalStateException("Found more than one component of type " + componentType + ": " + components); } @SuppressWarnings( { "UnnecessaryLocalVariable" }) ManagedComponent component = (components.size() == 1) ? components.iterator().next() : null; return component; } public static Serializable getSimplePropertyValue(ManagedComponent component, String propertyName) throws PropertyNotFoundException { ManagedProperty property = component.getProperty(propertyName); if (property == null) { throw new PropertyNotFoundException("Property named '" + propertyName + "' not found for ManagedComponent [" + component + "]."); } MetaType metaType = property.getMetaType(); Serializable value; if (metaType.isSimple()) { SimpleValue simpleValue = (SimpleValue) property.getValue(); value = (simpleValue != null) ? simpleValue.getValue() : null; } else if (metaType.isEnum()) { EnumValue enumValue = (EnumValue) property.getValue(); value = (enumValue != null) ? enumValue.getValue() : null; } else { throw new IllegalStateException("Type of [" + property + "] is not simple or enum."); } return value; } @NotNull public static EnumSet<ViewUse> getViewUses(ManagedProperty managedProperty) { EnumSet<ViewUse> viewUses = EnumSet.noneOf(ViewUse.class); for (ViewUse viewUse : ViewUse.values()) { if (managedProperty.hasViewUse(viewUse)) viewUses.add(viewUse); } return viewUses; } /** * TODO */ public static boolean isManagedComponent(ManagementView managementView, String name, ComponentType componentType) { boolean isDeployed = false; if (name != null) { try { //ManagedComponent component = getManagedComponent(managementView, componentType, name); ManagedComponent component = managementView.getComponent(name, componentType); if (component != null) isDeployed = true; } catch (Exception e) { // Setting it to true to be safe than sorry, since there might be a component // already deployed in the AS. TODO (ips): I don't think I like this. isDeployed = true; } } return isDeployed; } @NotNull public static Set<ManagedComponent> getManagedComponents(ManagementView managementView, ComponentType componentType, String name, NameMatcher<ManagedComponent> nameMatcher) { Set<ManagedComponent> matchingComponents = new HashSet<ManagedComponent>(); Set<ManagedComponent> allComponents = getManagedComponents(managementView, componentType); for (ManagedComponent component : allComponents) { if (nameMatcher.matches(component, name)) { matchingComponents.add(component); } } return matchingComponents; } public static Comparator<ComponentType> getComponentTypeComparator() { return COMPONENT_TYPE_COMPARATOR; } @NotNull private static Set<ManagedComponent> getManagedComponents(ManagementView managementView, ComponentType componentType) { Set<ManagedComponent> components; try { components = managementView.getComponentsForType(componentType); } catch (Exception e) { throw new IllegalStateException(e); } return components; } private static class ComponentTypeComparator implements Comparator<ComponentType> { public int compare(ComponentType type1, ComponentType type2) { int value = type1.getType().compareTo(type2.getType()); // If the categories (e.g. JMSDestination) were equal, do a secondary sort by subtype (e.g. Queue). return (value != 0) ? value : type1.getSubtype().compareTo(type2.getSubtype()); } } public static class PropertyNotFoundException extends RuntimeException { public PropertyNotFoundException(String message) { super(message); } } }