--- /dev/null
+/**\r
+ * This document is a part of the source code and related artifacts\r
+ * for CollectionSpace, an open source collections management system\r
+ * for museums and related institutions:\r
+\r
+ * http://www.collectionspace.org\r
+ * http://wiki.collectionspace.org\r
+\r
+ * Copyright 2009 University of California at Berkeley\r
+\r
+ * Licensed under the Educational Community License (ECL), Version 2.0.\r
+ * You may not use this file except in compliance with this License.\r
+\r
+ * You may obtain a copy of the ECL 2.0 License at\r
+\r
+ * https://source.collectionspace.org/collection-space/LICENSE.txt\r
+ */\r
+package org.collectionspace.services.common;\r
+\r
+import java.lang.reflect.Constructor;\r
+import java.lang.reflect.Method;\r
+\r
+/** User: laramie\r
+ * $LastChangedRevision: $\r
+ * $LastChangedDate: $\r
+ */\r
+public class ReflectionMapper {\r
+\r
+ public static boolean isSetter(Method method) {\r
+ if (!method.getName().startsWith("set")) return false;\r
+ if (method.getParameterTypes().length != 1) return false;\r
+ return true;\r
+ }\r
+\r
+ public static Object fireSetMethod(Method setMethod, Object target, Object arg) throws Exception {\r
+ if (target != null && setMethod != null) {\r
+ return setMethod.invoke(target, arg);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public static Object fireGetMethod(Method getMethod, Object target) throws Exception {\r
+ if (target != null && getMethod != null) {\r
+ Object[] arg = new Object[0];\r
+ //System.out.println("\r\n~~~~~~~~ fireGetMethod("+getMethod+")");\r
+ return getMethod.invoke(target, arg);\r
+ }\r
+ return null;\r
+ }\r
+\r
+ public static enum STATUS {OK, NO_SUCH_METHOD, EXCEPTION};\r
+ \r
+ public static STATUS callSetterUncaught(Object target, String name, Object arg) throws Exception {\r
+ if (Tools.isEmpty(name)){\r
+ return STATUS.NO_SUCH_METHOD;\r
+ }\r
+ if (target==null){\r
+ return STATUS.EXCEPTION;\r
+ }\r
+ Class aClass = target.getClass();\r
+ Method m;\r
+\r
+ Class[] cls = new Class[1];\r
+ cls[0] = String.class;\r
+ try {\r
+ m = aClass.getMethod(name, cls);\r
+ } catch (NoSuchMethodException nsm){\r
+ m = null;\r
+ }\r
+ if (m==null){\r
+ m = aClass.getMethod(name, Object.class); //throws NoSuchMethodException if not found.\r
+ }\r
+ //todo: if m==null, call callSetterCaseInsensitive().\r
+ fireSetMethod(m, target, arg);\r
+ return STATUS.OK;\r
+ }\r
+\r
+ public static STATUS callSetter(Object target, String name, Object arg) {\r
+ try {\r
+ callSetterUncaught(target, name, arg);\r
+ } catch (NoSuchMethodException nsm) {\r
+ System.out.println("ERROR in ReflectionMapper.callSetter(target:"+target+", name:"+name+", arg:"+arg+"): "+nsm);\r
+ return STATUS.NO_SUCH_METHOD;\r
+ } catch (Exception e) {\r
+ System.out.println("ERROR in ReflectionMapper.callSetter(target:"+target+", name:"+name+", arg:"+arg+"): "+e);\r
+ return STATUS.EXCEPTION;\r
+ }\r
+ return STATUS.OK;\r
+ }\r
+\r
+ public static Object instantiate(String classname) throws Exception {\r
+ Class cl = Class.forName(classname);\r
+ Class [] classParm = null;\r
+ Object [] objectParm = null;\r
+ Constructor co = cl.getConstructor(classParm);\r
+ Object item = co.newInstance(objectParm);\r
+ return item;\r
+ }\r
+\r
+ // EXPERIMENTAL:\r
+ public static void callSetterCaseInsensitive(Class aClass, Object target, Object args){\r
+ boolean showInheritedMethods = false;\r
+ Method[] methods = aClass.getMethods();\r
+ for (Method method : methods) {\r
+ Class dc = method.getDeclaringClass();\r
+ boolean sameClass = aClass.equals(dc);\r
+ if (showInheritedMethods || sameClass) {\r
+ if (isSetter(method) && method.getParameterTypes().length==1) {\r
+ String id = method.getName();\r
+ Method setMethod = method;\r
+ String dataClass = method.getParameterTypes()[0].getName();\r
+\r
+ args = "MyNewValue";\r
+ //todo: fireSetMethod(setMethod, target, args);\r
+ System.out.println("setter: " + method + " in class: " + dc);\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r