001 /*
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements. See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership. The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License. You may obtain a copy of the License at
010 *
011 * http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing,
014 * software distributed under the License is distributed on an
015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016 * KIND, either express or implied. See the License for the
017 * specific language governing permissions and limitations
018 * under the License.
019 *
020 */
021 package org.apache.qpid.management.wsdm.capabilities;
022
023 import java.lang.management.ManagementFactory;
024
025 import javax.management.Attribute;
026 import javax.management.AttributeNotFoundException;
027 import javax.management.InstanceNotFoundException;
028 import javax.management.MBeanException;
029 import javax.management.MBeanServer;
030 import javax.management.ObjectName;
031
032 import org.apache.muse.ws.resource.impl.AbstractWsResourceCapability;
033 import org.apache.qpid.management.Messages;
034 import org.apache.qpid.management.domain.handler.impl.InvocationResult;
035 import org.apache.qpid.management.domain.services.MethodInvocationException;
036 import org.apache.qpid.management.wsdm.common.EntityInstanceNotFoundFault;
037 import org.apache.qpid.management.wsdm.common.MethodInvocationFault;
038 import org.apache.qpid.management.wsdm.common.NoSuchAttributeFault;
039 import org.apache.qpid.management.wsdm.common.QManFault;
040 import org.apache.qpid.transport.util.Logger;
041
042 /**
043 * Abstract capability used for centralize common
044 * behaviour of the QMan resource(s) related capabilities.
045 *
046 * @author Andrea Gazzarini
047 */
048 public abstract class MBeanCapability extends AbstractWsResourceCapability
049 {
050 private static final Logger LOGGER = Logger.get(MBeanCapability.class);
051
052 protected final MBeanServer _mxServer;
053 protected ObjectName _objectName;
054
055 /**
056 * Builds a new capability related to the given object name.
057 *
058 * @param objectName the name of the target object of this capability.
059 */
060 public MBeanCapability()
061 {
062 _mxServer = ManagementFactory.getPlatformMBeanServer();
063 }
064
065 /**
066 * Injects on this capability the object name of the target mbean.
067 *
068 * @param objectName the object name of the target mbean.
069 */
070 void setResourceObjectName(ObjectName objectName)
071 {
072 this._objectName = objectName;
073 }
074
075 /**
076 * Returns the attribute value of a QMan managed object instance.
077 *
078 * @param attributeName the name of the attribute to be requested.
079 * @return the value for the requested attribute.
080 * @throws NoSuchAttributeFault when the requested attribute cannot be found
081 * on the given entity instance.
082 * @throws EntityInstanceNotFoundFault when the requested entity instance cannot
083 * be found.
084 * @throws QManFault in case of internal system failure.
085 */
086 Object getAttribute(String attributeName) throws NoSuchAttributeFault, EntityInstanceNotFoundFault, QManFault
087 {
088 try
089 {
090 return _mxServer.getAttribute(_objectName, attributeName);
091 } catch (AttributeNotFoundException exception)
092 {
093 throw new NoSuchAttributeFault(
094 getWsResource().getEndpointReference(),
095 attributeName);
096 } catch (InstanceNotFoundException exception)
097 {
098 throw new EntityInstanceNotFoundFault(
099 getWsResource().getEndpointReference(),
100 _objectName);
101 } catch (Exception exception)
102 {
103 LOGGER.error(
104 Messages.QMAN_100035_GET_ATTRIBUTE_FAILURE,
105 attributeName,
106 _objectName);
107 throw new QManFault(
108 getWsResource().getEndpointReference(),
109 exception);
110 }
111 }
112
113 /**
114 * Sets the value for the given attribute on this MBean (proxy).
115 *
116 * @param objectName
117 * the object name of the target instance (excluding the domain
118 * name).
119 * @param attributeName
120 * the name of the attribute to be requested.
121 * @param value
122 * the value for the requested attribute.
123 * @throws NoSuchAttributeFault
124 * when the requested attribute cannot be found on the given
125 * entity instance.
126 * @throws EntityInstanceNotFoundFault
127 * when the requested entity instance cannot be found.
128 * @throws QManFault
129 * in case of internal system failure.
130 */
131 void setAttribute(String attributeName, Object value) throws NoSuchAttributeFault, EntityInstanceNotFoundFault, QManFault
132 {
133 try
134 {
135 _mxServer.setAttribute(_objectName, new Attribute(attributeName,value));
136 } catch (AttributeNotFoundException exception)
137 {
138 throw new NoSuchAttributeFault(
139 getWsResource().getEndpointReference(),
140 attributeName);
141 } catch (InstanceNotFoundException exception)
142 {
143 throw new EntityInstanceNotFoundFault(
144 getWsResource().getEndpointReference(),
145 _objectName);
146 } catch (Exception exception)
147 {
148 LOGGER.error(
149 Messages.QMAN_100036_SET_ATTRIBUTE_FAILURE,
150 attributeName,
151 _objectName);
152 throw new QManFault(
153 getWsResource().getEndpointReference(),
154 exception);
155 }
156 }
157
158 /**
159 * Invokes the requested operation on target JMX resource.
160 *
161 * @param operationName the name of the operation to be invoked.
162 * @param params parameters used for operation invocation.
163 * @param signature the operation / method signature.
164 * @throws EntityInstanceNotFoundFault
165 * when the target MBean doesn't exist on Management server.
166 * @throws MethodInvocationFault
167 * when the invocation of the requested operation raises an exception.
168 * @throws QManFault
169 * in case of not-well known failure.
170 */
171 Result invoke(String operationName, Object [] params, String [] signature) throws EntityInstanceNotFoundFault, MethodInvocationFault,QManFault
172 {
173 try
174 {
175 InvocationResult output = (InvocationResult) _mxServer
176 .invoke(
177 _objectName,
178 operationName,
179 params,
180 signature);
181
182 Result result = new Result(
183 output.getReturnCode(),
184 output.getStatusText(),
185 output.getOutputSection());
186
187 return result;
188 } catch (InstanceNotFoundException exception)
189 {
190 throw new EntityInstanceNotFoundFault(
191 getWsResource().getEndpointReference(),
192 _objectName);
193 } catch (MBeanException exception)
194 {
195 if (exception.getTargetException() instanceof MethodInvocationException)
196 {
197 MethodInvocationException failure = (MethodInvocationException) exception.getTargetException();
198 throw new MethodInvocationFault(
199 getWsResource().getEndpointReference(),
200 operationName,
201 failure.getStatusText(),
202 failure.getReturnCode());
203 } else {
204 LOGGER.error(
205 Messages.QMAN_100037_INVOKE_OPERATION_FAILURE,
206 operationName,
207 _objectName);
208 throw new QManFault(
209 getWsResource().getEndpointReference(),
210 exception);
211 }
212 }catch(Exception exception)
213 {
214 LOGGER.error(
215 Messages.QMAN_100037_INVOKE_OPERATION_FAILURE,
216 operationName,
217 _objectName);
218 throw new QManFault(
219 getWsResource().getEndpointReference(),
220 exception);
221 }
222 }
223 }
|