Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   * Copyright 2013, Red Hat, Inc., and individual contributors
   * as indicated by the @author tags. See the copyright.txt file in the
   * distribution for a full listing of individual contributors.
   *
   * This is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as
   * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software 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
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
 
 package org.jboss.as.test.integration.management.interfaces;
 
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ACCESS_CONTROL;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILED;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FAILURE_DESCRIPTION;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.NAME;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OUTCOME;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_ATTRIBUTE_OPERATION;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.READ_RESOURCE_OPERATION;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESPONSE_HEADERS;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.RESULT;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUCCESS;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE;
 import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION;
 
 import java.util.Map;
 import java.util.Set;
 
 

Author(s):
jcechace
Ladislav Thon <lthon@redhat.com>
 
 public class JmxManagementInterface implements ManagementInterface {
     private final JMXConnector jmxConnector;
     private final String domain;
 
     protected JmxManagementInterface(JMXConnector jmxConnectorString domain) {
         this. = jmxConnector;
         this. = domain;
     }
 
     public void close() {
         try {
             .close();
         } catch (IOException e) {
             throw new RuntimeException();
         }
     }
 
     @Override
     public ModelNode execute(ModelNode operation) {
         try {
             ObjectName objectName = objectName(operation);
             return doExecute(objectNameoperation);
         } catch (MalformedObjectNameException e) {
             throw new RuntimeException(e);
         }
     }
 
     private ModelNode doExecute(ObjectName objectNameModelNode op) {
         String opName = op.get().asString();
         if (.equals(opName)) {
             String name = JmxInterfaceStringUtils.toCamelCase(op.get().asString());
            return getAttribute(objectNamename);
        } else if (.equals(opName)) {
            String name = JmxInterfaceStringUtils.toCamelCase(op.get().asString());
            Object value = object(op.get());
            return setAttribute(objectNamenamevalue);
        } else if (.equals(opName)) {
            return getInfo(objectName);
        } else {
            Set<Stringkeys = new HashSet<String>(op.keys()); // must copy
            keys.remove();
            keys.remove();
            if (!keys.isEmpty()) {
                throw new UnsupportedOperationException("Operations with arguments are not supported: " + opName + " " + keys);
            }
            String name = JmxInterfaceStringUtils.toCamelCase(op.get().asString());
            return invoke(objectNamename);
        }
    }
    private ModelNode getAttribute(ObjectName objectNameString name) {
        MBeanServerConnection connection = getConnection();
        Object result = null;
        JMRuntimeException exception = null;
        try {
            result = connection.getAttribute(objectNamename);
        } catch (JMRuntimeException e) {
            exception = e;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return modelNodeResult(resultexception);
    }
    private ModelNode setAttribute(ObjectName objectNameString nameObject value) {
        MBeanServerConnection connection = getConnection();
        Attribute attribute = new Attribute(namevalue);
        JMRuntimeException exception = null;
        try {
            connection.setAttribute(objectNameattribute);
        } catch (JMRuntimeException e) {
            exception = e;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return modelNodeResult(nullexception);
    }
    private ModelNode invoke(ObjectName objectNameString name) {
        MBeanServerConnection connection = getConnection();
        Object result = null;
        JMRuntimeException exception = null;
        try {
            result = connection.invoke(objectNamenamenullnull);
        } catch (JMRuntimeException e) {
            exception = e;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return modelNodeResult(resultexception);
    }
    private ModelNode getInfo(ObjectName objectName) {
        MBeanServerConnection connection = getConnection();
        ModelNode attributes = null;
        ModelNode headers = null;
        Exception exception = null;
        try {
            MBeanInfo mBeanInfo = connection.getMBeanInfo(objectName);
            MBeanAttributeInfo[] attributeInfos = mBeanInfo.getAttributes();
            ModelNode[] data = modelNodeAttributesInfo(attributeInfosobjectName);
            attributes = data[0];
            headers = data[1];
        } catch (Exception e) {
            if (e instanceof JMException || e instanceof JMRuntimeException) {
                exception = e;
            } else {
                throw new RuntimeException(e);
            }
        }
        return modelNodeResult(attributesexceptionheaders);
    }
    private ModelNode[] modelNodeAttributesInfo(MBeanAttributeInfo[] attributeInfosObjectName objectNamethrows IOExceptionJMException {
        MBeanServerConnection connection = getConnection();
        ModelNode attributes = new ModelNode();
        ModelNode filtered = new ModelNode().setEmptyList();
        ModelNode headers = null;
        for (MBeanAttributeInfo attribute : attributeInfos) {
            String attributeName = attribute.getName();
            try {
                Object attributeValue = connection.getAttribute(objectNameattributeName);
                try {
                    attributes.get(JmxInterfaceStringUtils.toDashCase(attributeName)).set(modelNode(attributeValue));
                } catch (UnsupportedOperationException e) {
                    // happens for some attributes that are represented as a Tabular***; let's just ignore them
                }
            } catch (Exception e) {
                // see RbacUtil.checkOperationResult for error codes
                // TODO could possibly use MBeanAttributeInfo#isReadable instead of error codes, but it's currently broken
                String message = e.getMessage();
                if (message.contains("WFLYCTL0216") || message.contains("WFLYCTL0030")) {
                    throw e;
                } else if (message.contains("WFLYCTL0313") || message.contains("WFLYJMX0039")) {
                    filtered.add(JmxInterfaceStringUtils.toDashCase(attributeName));
                } else {
                    throw new RuntimeException(e);
                }
            }
        }
        if (!filtered.asList().isEmpty()) {
            headers = new ModelNode();
            headers.get("filtered-attributes").set(filtered);
        }
        return new ModelNode[]{attributesheaders};
    }
    private ModelNode modelNodeResult(Object resultException exception) {
        return modelNodeResult(resultexceptionnull);
    }
    private ModelNode modelNodeResult(Object resultException exceptionModelNode headers) {
        ModelNode root = new ModelNode();
        if (exception == null) {
            root.get().set();
            if (result != null) {
                root.get().set(modelNode(result));
            }
        } else {
            root.get().set();
            root.get().set(JmxInterfaceStringUtils.rawString(exception.getMessage()));
            if (result != null) {
                root.get().set(modelNode(result));
            }
        }
        if (headers != null) {
            root.get().set(headers);
        }
        return root;
    }
    private static ModelNode modelNode(Object obj) {
        if (obj == null) {
            return new ModelNode();
        } else if (obj instanceof ModelNode) {
            return ((ModelNodeobj);
        } else if (obj instanceof BigDecimal) {
            return new ModelNode((BigDecimalobj);
        } else if (obj instanceof BigInteger) {
            return new ModelNode((BigIntegerobj);
        } else if (obj instanceof Boolean) {
            return new ModelNode((Booleanobj);
        } else if (obj instanceof byte[]) {
            return new ModelNode((byte[]) obj);
        } else if (obj instanceof Double) {
            return new ModelNode((Doubleobj);
        } else if (obj instanceof Integer) {
            return new ModelNode((Integerobj);
        } else if (obj instanceof Long) {
            return new ModelNode((Longobj);
        } else if (obj instanceof String) {
            return JmxInterfaceStringUtils.nodeFromString((Stringobj);
        } else {
            throw new UnsupportedOperationException("Can't convert '" + obj.getClass() + "' to ModelNode: " + obj);
        }
    }
    private static Object object(ModelNode node) {
        switch (node.getType()) {
            case :
                return node.asBigDecimal();
            case :
                return node.asBigInteger();
            case :
                return node.asBoolean();
            case :
                return node.asBytes();
            case :
                return node.asDouble();
            case :
                return node.asExpression();
            case :
                return node.asInt();
            case :
                return node.asList();
            case :
                return node.asLong();
            case :
                return node.asProperty();
            case :
                return node.asString();
            case :
                return null;
            default:
                throw new UnsupportedOperationException("Can't convert '" + node.getType() + "' to object");
        }
    }
    private ObjectName objectName(ModelNode operationthrows MalformedObjectNameException {
        StringBuilder builder = new StringBuilder();
        String opName = operation.get().asString();
        if (operation.has()) {
            ModelNode address = operation.get();
            Iterator<ModelNodeit = address.asList().iterator();
            while (it.hasNext()) {
                Property segment = it.next().asProperty();
                if (opName.equals() && !it.hasNext()) { // skip the last one in case of 'add'
                    continue;
                }
                builder.append(segment.getName()).append("=").append(segment.getValue().asString()).append(",");
            }
        }
        if (builder.toString().isEmpty()) {
            builder.append("management-root=server,");
        }
        builder.deleteCharAt(builder.length() - 1);
        return new ObjectName( + ":" + builder.toString());
    }
        MBeanServerConnection mBeanServerConnection = null;
        try {
            mBeanServerConnection = .getMBeanServerConnection();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return mBeanServerConnection;
    }
    public static JmxManagementInterface create(JMXServiceURL urlString usernameString passwordString domain) {
        try {
            Map<StringString[]> env = new HashMap<StringString[]>();
            env.put(.new String[]{usernamepassword});
            JMXConnector jmxConnector = JMXConnectorFactory.connect(urlenv);
            return new JmxManagementInterface(jmxConnectordomain);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
New to GrepCode? Check out our FAQ X