]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-3332
authorLaramie Crocker <laramie@berkeley.edu>
Wed, 15 Dec 2010 21:09:55 +0000 (21:09 +0000)
committerLaramie Crocker <laramie@berkeley.edu>
Wed, 15 Dec 2010 21:09:55 +0000 (21:09 +0000)
services/common/src/main/java/org/collectionspace/services/common/ReflectionMapper.java [new file with mode: 0755]

diff --git a/services/common/src/main/java/org/collectionspace/services/common/ReflectionMapper.java b/services/common/src/main/java/org/collectionspace/services/common/ReflectionMapper.java
new file mode 100755 (executable)
index 0000000..50eb637
--- /dev/null
@@ -0,0 +1,120 @@
+/**\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