1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/src/share/classes/com/sun/jmx/mbeanserver/IntrospectorProxy.java Mon Jun 22 12:49:51 2009 +0200
1.3 @@ -0,0 +1,85 @@
1.4 +/*
1.5 + * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1.7 + *
1.8 + * This code is free software; you can redistribute it and/or modify it
1.9 + * under the terms of the GNU General Public License version 2 only, as
1.10 + * published by the Free Software Foundation. Sun designates this
1.11 + * particular file as subject to the "Classpath" exception as provided
1.12 + * by Sun in the LICENSE file that accompanied this code.
1.13 + *
1.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
1.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1.16 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1.17 + * version 2 for more details (a copy is included in the LICENSE file that
1.18 + * accompanied this code).
1.19 + *
1.20 + * You should have received a copy of the GNU General Public License version
1.21 + * 2 along with this work; if not, write to the Free Software Foundation,
1.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1.23 + *
1.24 + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
1.25 + * CA 95054 USA or visit www.sun.com if you need additional information or
1.26 + * have any questions.
1.27 + */
1.28 +
1.29 +package com.sun.jmx.mbeanserver;
1.30 +
1.31 +import java.lang.reflect.InvocationTargetException;
1.32 +import java.lang.reflect.Method;
1.33 +import java.util.Iterator;
1.34 +import java.util.Map;
1.35 +import java.util.ServiceLoader;
1.36 +import java.util.TreeMap;
1.37 +
1.38 +public abstract class IntrospectorProxy {
1.39 + public static IntrospectorProxy getDefault() {
1.40 + Iterator<IntrospectorProxy> it = ServiceLoader.load(IntrospectorProxy.class).iterator();
1.41 + return it.hasNext() ? it.next() : new SimpleIntrospector();
1.42 + }
1.43 +
1.44 + /** Either fills the map with inspected Method objects (if values == null)
1.45 + * or with real values of those methods called on the values target
1.46 + */
1.47 + public abstract Map<String, Object> inspectClass(Class<?> type, Object values);
1.48 +
1.49 + private static final class SimpleIntrospector extends IntrospectorProxy {
1.50 + @Override
1.51 + public Map<String,Object> inspectClass(Class<?> type, Object values) {
1.52 + Map<String, Object> map = new TreeMap<String, Object>();
1.53 + try {
1.54 + for (Method get : type.getMethods()) {
1.55 + if (get.getName().equals("getClass")) {
1.56 + continue;
1.57 + }
1.58 + if (get.getParameterTypes().length != 0) {
1.59 + continue;
1.60 + }
1.61 + String name;
1.62 + if (get.getName().startsWith("get")) {
1.63 + name = get.getName().substring(3);
1.64 + } else {
1.65 + if (get.getName().startsWith("is")) {
1.66 + name = get.getName().substring(2);
1.67 + } else {
1.68 + continue;
1.69 + }
1.70 + }
1.71 + if (values == null) {
1.72 + map.put(name, get);
1.73 + } else {
1.74 + map.put(name, get.invoke(values));
1.75 + }
1.76 + }
1.77 + } catch (Exception e) {
1.78 + Throwable t = e;
1.79 + if (t instanceof InvocationTargetException) {
1.80 + t = t.getCause();
1.81 + }
1.82 + map.put("Exception", t);
1.83 + }
1.84 + return map;
1.85 + }
1.86 +
1.87 + }
1.88 +}
1.89 \ No newline at end of file