1 29 30 31 package com.caucho.quercus.lib.resin; 32 33 import com.caucho.quercus.env.Value; 34 35 import javax.management.Attribute ; 36 import javax.management.MBeanInfo ; 37 import javax.management.MBeanOperationInfo ; 38 import javax.management.MBeanParameterInfo ; 39 import javax.management.MBeanServerConnection ; 40 import javax.management.ObjectName ; 41 import java.util.HashMap ; 42 import java.util.logging.Level ; 43 import java.util.logging.Logger ; 44 45 public class MBean { 46 private static final Logger log = Logger.getLogger(MBean.class.getName()); 47 48 private static final HashMap <String ,Marshall> _marshallMap 49 = new HashMap <String ,Marshall>(); 50 51 private MBeanServerConnection _server; 52 private ObjectName _name; 53 private MBeanInfo _info; 54 55 MBean(MBeanServerConnection server, ObjectName name) 56 { 57 _server = server; 58 _name = name; 59 } 60 61 64 public String getMbean_name() 65 { 66 return _name.getCanonicalName(); 67 } 68 69 72 public MBeanInfo getMbean_info() 73 { 74 try { 75 if (_info == null) 76 _info = _server.getMBeanInfo(_name); 77 78 return _info; 79 } catch (Exception e) { 80 log.log(Level.FINE, e.toString(), e); 81 82 return null; 83 } 84 } 85 86 89 public Object __getField(String attrName) 90 { 91 try { 92 return unmarshall(_server.getAttribute(_name, attrName)); 93 } catch (Exception e) { 94 log.log(Level.FINE, e.toString(), e); 95 96 return null; 97 } 98 } 99 100 103 public boolean __setField(String attrName, Object value) 104 { 105 try { 106 _server.setAttribute(_name, new Attribute (attrName, value)); 107 108 return true; 109 } catch (Exception e) { 110 log.log(Level.FINE, e.toString(), e); 111 112 return false; 113 } 114 } 115 116 119 public Object __call(String name, Value []values) 120 { 121 try { 122 Object []args = new Object [values.length]; 123 String []sig = new String [values.length]; 124 125 for (int i = 0; i < values.length; i++) { 126 args[i] = values[i].toJavaObject(); 127 128 if (args[i] != null) 129 sig[i] = args[i].getClass().getName(); 130 else 131 sig[i] = "java.lang.Object"; 132 } 133 134 String []mbeanSig = findClosestOperation(name, sig); 135 136 if (mbeanSig != null) { 137 marshall(args, mbeanSig); 138 139 return unmarshall(_server.invoke(_name, name, args, mbeanSig)); 140 } 141 else 142 return null; 143 } catch (Exception e) { 144 log.log(Level.FINE, e.toString(), e); 145 146 return null; 147 } 148 } 149 150 protected String []findClosestOperation(String name, String []sig) 151 throws Exception 152 { 153 MBeanInfo info = getMbean_info(); 154 155 MBeanOperationInfo []ops = info.getOperations(); 156 157 MBeanOperationInfo bestOp = null; 158 long bestCost = Long.MAX_VALUE; 159 160 for (int i = 0; i < ops.length; i++) { 161 MBeanOperationInfo op = ops[i]; 162 163 if (! name.equals(op.getName())) 164 continue; 165 166 if (op.getSignature().length == sig.length) { 167 long cost = calculateCost(op.getSignature(), sig); 168 169 if (cost < bestCost) { 170 bestCost = cost; 171 bestOp = op; 172 } 173 } 174 } 175 176 if (bestOp != null) { 177 String []mbeanSig = new String [sig.length]; 178 179 MBeanParameterInfo []params = bestOp.getSignature(); 180 181 for (int j = 0; j < params.length; j++) { 182 mbeanSig[j] = params[j].getType(); 183 } 184 185 return mbeanSig; 186 } 187 188 return null; 189 } 190 191 private static long calculateCost(MBeanParameterInfo []paramInfo, 192 String []args) 193 { 194 long cost = 0; 195 196 for (int i = 0; i < paramInfo.length; i++) { 197 String param = paramInfo[i].getType(); 198 String arg = args[i]; 199 200 if (param.equals(arg)) { 201 } 202 else if ((param.indexOf('[') >= 0) != (arg.indexOf('[') >= 0)) { 203 cost += 100; 204 } 205 else 206 cost += 1; 207 } 208 209 return cost; 210 } 211 212 private void marshall(Object []args, String []sig) 213 { 214 for (int i = 0; i < sig.length; i++) { 215 args[i] = findMarshall(sig[i]).marshall(args[i]); 216 } 217 } 218 219 private Object unmarshall(Object value) 220 { 221 if (value instanceof ObjectName ) { 222 ObjectName name = (ObjectName ) value; 223 224 return new MBean(_server, name); 225 } 226 else if (value instanceof ObjectName []) { 227 ObjectName []names = (ObjectName []) value; 228 229 MBean []mbeans = new MBean[names.length]; 230 231 for (int i = 0; i < names.length; i++) 232 mbeans[i] = new MBean(_server, names[i]); 233 234 return mbeans; 235 } 236 else 237 return value; 238 } 239 240 private Marshall findMarshall(String sig) 241 { 242 Marshall marshall = _marshallMap.get(sig); 243 244 if (marshall != null) 245 return marshall; 246 else 247 return Marshall.MARSHALL; 248 } 249 250 public String toString() 251 { 252 if (_name == null) 253 return "MBean[]"; 254 else 255 return "MBean[" + _name.getCanonicalName() + "]"; 256 } 257 258 static class Marshall { 259 static final Marshall MARSHALL = new Marshall(); 260 261 public Object marshall(Object value) 262 { 263 return value; 264 } 265 } 266 267 static class IntMarshall extends Marshall { 268 static final Marshall MARSHALL = new IntMarshall(); 269 270 public Object marshall(Object value) 271 { 272 if (value instanceof Integer ) 273 return value; 274 else if (value instanceof Number ) 275 return new Integer (((Number ) value).intValue()); 276 else if (value == null) 277 return new Integer (0); 278 else { 279 try { 280 return new Integer (Integer.parseInt(String.valueOf(value))); 281 } catch (Exception e) { 282 return new Integer (0); 283 } 284 } 285 } 286 } 287 288 static class LongMarshall extends Marshall { 289 static final Marshall MARSHALL = new LongMarshall(); 290 291 public Object marshall(Object value) 292 { 293 if (value instanceof Long ) 294 return value; 295 else if (value instanceof Number ) 296 return new Long (((Number ) value).longValue()); 297 else if (value == null) 298 return new Long (0); 299 else { 300 try { 301 return new Long (Long.parseLong(String.valueOf(value))); 302 } catch (Exception e) { 303 return new Long (0); 304 } 305 } 306 } 307 } 308 309 static class StringMarshall extends Marshall { 310 static final Marshall MARSHALL = new StringMarshall(); 311 312 public Object marshall(Object value) 313 { 314 if (value == null) 315 return null; 316 else 317 return value.toString(); 318 } 319 } 320 321 static { 322 _marshallMap.put("int", IntMarshall.MARSHALL); 323 _marshallMap.put("java.lang.Integer", IntMarshall.MARSHALL); 324 325 _marshallMap.put("long", LongMarshall.MARSHALL); 326 _marshallMap.put("java.lang.Long", LongMarshall.MARSHALL); 327 328 _marshallMap.put("java.lang.String", StringMarshall.MARSHALL); 329 } 330 } 331 | Popular Tags |