]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/canvas/impl/HintReflection.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / canvas / impl / HintReflection.java
index 2f701cc5718996bdb700915634cc5091c8170be6..80c86c05d93b2a0dfe1cde9e36351ff732961bc3 100644 (file)
-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- *     VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.g2d.canvas.impl;\r
-\r
-import java.lang.annotation.ElementType;\r
-import java.lang.annotation.Retention;\r
-import java.lang.annotation.RetentionPolicy;\r
-import java.lang.annotation.Target;\r
-import java.lang.reflect.Field;\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.lang.reflect.Method;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.simantics.utils.datastructures.hints.IHintListener;\r
-import org.simantics.utils.datastructures.hints.IHintObservable;\r
-import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
-\r
-/**\r
- * @author Toni Kalajainen\r
- */\r
-public class HintReflection {\r
-\r
-       private final static HintListenerDefinition[] EMPTY = new HintListenerDefinition[0]; \r
-       \r
-       @Retention(RetentionPolicy.RUNTIME)\r
-       @Target(ElementType.METHOD)\r
-       public static @interface HintListener {\r
-               Class<?>        Class();\r
-               String          Field();                \r
-       }\r
-       \r
-       /**\r
-        * Scans an object for reflections of hint listeners  \r
-        * <p>\r
-        * Example:\r
-        * \r
-        *  @HintListener(Class=Hints.class, Field="KEY_CANVAS_TRANSFORM")\r
-        *      public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {\r
-        *     ...\r
-        *      }\r
-        *      @HintListener(Class=Hints.class, Field="KEY_CANVAS_TRANSFORM")\r
-        *      public void hintRemoved(IHintObservable sender, Key key, Object oldValue) { \r
-        *     ...\r
-        *  }\r
-        * \r
-        * @param obj object to scan\r
-        * @return an array of painters and their priorities\r
-        */\r
-    public static HintListenerDefinition[] getDependencies(final Object obj)\r
-       {\r
-               Map<Key, HintListenerDefinition> result = new HashMap<Key, HintListenerDefinition>();\r
-               Class<?> clazz = obj.getClass();\r
-               _add(obj, clazz, result);\r
-               //if (result==null) return EMPTY;\r
-               return result.values().toArray(EMPTY);\r
-       }\r
-\r
-    private static void _add(final Object obj, Class<?> clazz, Map<Key, HintListenerDefinition> result)\r
-       {\r
-               try {\r
-                       for (final Method m : clazz.getDeclaredMethods()) {\r
-                               HintListener anno = (HintListener) m\r
-                                               .getAnnotation(HintListener.class);\r
-                               if (anno == null)\r
-                                       continue;\r
-\r
-                               Class<?> keyContainerClass = anno.Class();\r
-                               assert (keyContainerClass != null);\r
-                               String fieldName = anno.Field();\r
-                               assert (fieldName != null);\r
-                               Field field;\r
-                               field = keyContainerClass.getField(fieldName);\r
-                               assert (field != null);\r
-                               field.setAccessible(true);\r
-                               Object value = field.get(field != null);\r
-                               assert (value != null);\r
-                               assert (value instanceof Key);\r
-                               Key key = (Key) value;\r
-\r
-                               Class<?> returnType = m.getReturnType();\r
-                               assert (returnType == void.class);\r
-                               Class<?>[] params = m.getParameterTypes();\r
-                               assert (params.length == 4 || params.length == 3);\r
-                               assert (params[0].equals(IHintObservable.class));\r
-                               assert (params[1].equals(Key.class));\r
-                               assert (params[2].equals(Object.class));\r
-\r
-                               if (params.length == 4) \r
-                                       assert (params[3].equals(Object.class));\r
-\r
-                               HintListenerDefinition def = result.get(key);\r
-                               if (def==null) {\r
-                                       def = new HintListenerDefinition(key, obj);\r
-                                       result.put(key, def);\r
-                               }                                       \r
-                               \r
-                               m.setAccessible(true);                                  \r
-                               if (params.length == 4)\r
-                                       def.changedHandlerMethod = m;\r
-                               else\r
-                                       def.removedHandlerMethod = m;\r
-                       }\r
-               } catch (SecurityException e) {\r
-                       throw new Error(e);\r
-               } catch (NoSuchFieldException e) {\r
-                       throw new Error(e);\r
-               } catch (IllegalAccessException e) {\r
-                       throw new Error(e);\r
-               }\r
-               /*\r
-               for (final Field f : clazz.getDeclaredFields()) {\r
-                       Class c = f.getType();\r
-                       Dependency dep = (Dependency) f.getAnnotation(Dependency.class);\r
-                       Reference ref = (Reference) f.getAnnotation(Reference.class);\r
-                       if (dep==null && ref==null) continue;\r
-                       assert(ICanvasParticipant.class.isAssignableFrom( c ));                         \r
-                       assert(!(dep!=null && ref!=null));\r
-                       ReferenceDefinition rd = new ReferenceDefinition();\r
-                       rd.dependency = dep!=null;\r
-                       rd.field = f;\r
-                       rd.requirement = c;\r
-                       f.setAccessible(true);\r
-                       result.add(rd);\r
-               }\r
-               */\r
-               \r
-               Class<?> superClass = clazz.getSuperclass();\r
-               if (superClass!=null)\r
-                       _add(obj, superClass, result);\r
-       }\r
-\r
-       \r
-       public final static class HintListenerDefinition implements IHintListener {\r
-               public final Key key;\r
-               public final Object object;\r
-               public Method changedHandlerMethod;\r
-               public Method removedHandlerMethod;\r
-               \r
-               public HintListenerDefinition(Key key, Object object) {\r
-                       this.key = key;\r
-                       this.object = object;\r
-               }\r
-               \r
-               @Override\r
-               public void hintChanged(IHintObservable sender, Key key,\r
-                               Object oldValue, Object newValue) {\r
-                       if (changedHandlerMethod==null) return;\r
-                       try {\r
-                               changedHandlerMethod.invoke(object, sender, key, oldValue, newValue);\r
-                       } catch (IllegalArgumentException e) {\r
-                               throw new Error(e);\r
-                       } catch (IllegalAccessException e) {\r
-                               throw new Error(e);\r
-                       } catch (InvocationTargetException e) {\r
-                               throw new RuntimeException(e.getCause());\r
-                       }\r
-               }\r
-               @Override\r
-               public void hintRemoved(IHintObservable sender, Key key, Object oldValue) {\r
-                       if (removedHandlerMethod==null) return;\r
-                       try {\r
-                               removedHandlerMethod.invoke(object, sender, key, oldValue);\r
-                       } catch (IllegalArgumentException e) {\r
-                               throw new Error(e);\r
-                       } catch (IllegalAccessException e) {\r
-                               throw new Error(e);\r
-                       } catch (InvocationTargetException e) {\r
-                               throw new RuntimeException(e.getCause());\r
-                       }\r
-               }\r
-               \r
-               \r
-       }       \r
-       \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.g2d.canvas.impl;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.simantics.utils.datastructures.hints.IHintListener;
+import org.simantics.utils.datastructures.hints.IHintObservable;
+import org.simantics.utils.datastructures.hints.IHintContext.Key;
+
+/**
+ * @author Toni Kalajainen
+ */
+public class HintReflection {
+
+       private final static HintListenerDefinition[] EMPTY = new HintListenerDefinition[0]; 
+       
+       @Retention(RetentionPolicy.RUNTIME)
+       @Target(ElementType.METHOD)
+       public static @interface HintListener {
+               Class<?>        Class();
+               String          Field();                
+       }
+       
+       /**
+        * Scans an object for reflections of hint listeners  
+        * <p>
+        * Example:
+        * 
+        *  @HintListener(Class=Hints.class, Field="KEY_CANVAS_TRANSFORM")
+        *      public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
+        *     ...
+        *      }
+        *      @HintListener(Class=Hints.class, Field="KEY_CANVAS_TRANSFORM")
+        *      public void hintRemoved(IHintObservable sender, Key key, Object oldValue) { 
+        *     ...
+        *  }
+        * 
+        * @param obj object to scan
+        * @return an array of painters and their priorities
+        */
+    public static HintListenerDefinition[] getDependencies(final Object obj)
+       {
+               Map<Key, HintListenerDefinition> result = new HashMap<Key, HintListenerDefinition>();
+               Class<?> clazz = obj.getClass();
+               _add(obj, clazz, result);
+               //if (result==null) return EMPTY;
+               return result.values().toArray(EMPTY);
+       }
+
+    private static void _add(final Object obj, Class<?> clazz, Map<Key, HintListenerDefinition> result)
+       {
+               try {
+                       for (final Method m : clazz.getDeclaredMethods()) {
+                               HintListener anno = (HintListener) m
+                                               .getAnnotation(HintListener.class);
+                               if (anno == null)
+                                       continue;
+
+                               Class<?> keyContainerClass = anno.Class();
+                               assert (keyContainerClass != null);
+                               String fieldName = anno.Field();
+                               assert (fieldName != null);
+                               Field field;
+                               field = keyContainerClass.getField(fieldName);
+                               assert (field != null);
+                               field.setAccessible(true);
+                               Object value = field.get(field != null);
+                               assert (value != null);
+                               assert (value instanceof Key);
+                               Key key = (Key) value;
+
+                               Class<?> returnType = m.getReturnType();
+                               assert (returnType == void.class);
+                               Class<?>[] params = m.getParameterTypes();
+                               assert (params.length == 4 || params.length == 3);
+                               assert (params[0].equals(IHintObservable.class));
+                               assert (params[1].equals(Key.class));
+                               assert (params[2].equals(Object.class));
+
+                               if (params.length == 4) 
+                                       assert (params[3].equals(Object.class));
+
+                               HintListenerDefinition def = result.get(key);
+                               if (def==null) {
+                                       def = new HintListenerDefinition(key, obj);
+                                       result.put(key, def);
+                               }                                       
+                               
+                               m.setAccessible(true);                                  
+                               if (params.length == 4)
+                                       def.changedHandlerMethod = m;
+                               else
+                                       def.removedHandlerMethod = m;
+                       }
+               } catch (SecurityException e) {
+                       throw new Error(e);
+               } catch (NoSuchFieldException e) {
+                       throw new Error(e);
+               } catch (IllegalAccessException e) {
+                       throw new Error(e);
+               }
+               /*
+               for (final Field f : clazz.getDeclaredFields()) {
+                       Class c = f.getType();
+                       Dependency dep = (Dependency) f.getAnnotation(Dependency.class);
+                       Reference ref = (Reference) f.getAnnotation(Reference.class);
+                       if (dep==null && ref==null) continue;
+                       assert(ICanvasParticipant.class.isAssignableFrom( c ));                         
+                       assert(!(dep!=null && ref!=null));
+                       ReferenceDefinition rd = new ReferenceDefinition();
+                       rd.dependency = dep!=null;
+                       rd.field = f;
+                       rd.requirement = c;
+                       f.setAccessible(true);
+                       result.add(rd);
+               }
+               */
+               
+               Class<?> superClass = clazz.getSuperclass();
+               if (superClass!=null)
+                       _add(obj, superClass, result);
+       }
+
+       
+       public final static class HintListenerDefinition implements IHintListener {
+               public final Key key;
+               public final Object object;
+               public Method changedHandlerMethod;
+               public Method removedHandlerMethod;
+               
+               public HintListenerDefinition(Key key, Object object) {
+                       this.key = key;
+                       this.object = object;
+               }
+               
+               @Override
+               public void hintChanged(IHintObservable sender, Key key,
+                               Object oldValue, Object newValue) {
+                       if (changedHandlerMethod==null) return;
+                       try {
+                               changedHandlerMethod.invoke(object, sender, key, oldValue, newValue);
+                       } catch (IllegalArgumentException e) {
+                               throw new Error(e);
+                       } catch (IllegalAccessException e) {
+                               throw new Error(e);
+                       } catch (InvocationTargetException e) {
+                               throw new RuntimeException(e.getCause());
+                       }
+               }
+               @Override
+               public void hintRemoved(IHintObservable sender, Key key, Object oldValue) {
+                       if (removedHandlerMethod==null) return;
+                       try {
+                               removedHandlerMethod.invoke(object, sender, key, oldValue);
+                       } catch (IllegalArgumentException e) {
+                               throw new Error(e);
+                       } catch (IllegalAccessException e) {
+                               throw new Error(e);
+                       } catch (InvocationTargetException e) {
+                               throw new RuntimeException(e.getCause());
+                       }
+               }
+               
+               
+       }       
+       
+}