1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.ximtec.igesture.tool.util;
28
29 import java.lang.reflect.InvocationHandler;
30 import java.lang.reflect.InvocationTargetException;
31 import java.lang.reflect.Method;
32 import java.lang.reflect.Proxy;
33 import java.util.List;
34
35 import org.ximtec.igesture.core.DataObject;
36 import org.ximtec.igesture.core.Visitor;
37 import org.ximtec.igesture.storage.IStorageManager;
38 import org.ximtec.igesture.storage.StorageManager;
39
40
41 public class StorageManagerProxy implements InvocationHandler {
42
43 private StorageManager storageManager;
44
45 private Visitor visitor;
46
47
48 private StorageManagerProxy(StorageManager manager, Visitor visitor) {
49 this.storageManager = manager;
50 this.visitor = visitor;
51 }
52
53
54 @Override
55 public Object invoke(Object proxy, Method method, Object[] args)
56 throws Throwable {
57
58 Object result = null;
59
60 if (args != null && args.length > 0) {
61 if (args[0] instanceof DataObject) {
62 ((DataObject)args[0]).accept(visitor);
63 }
64 }
65
66 try {
67 result = method.invoke(storageManager, args);
68 }
69 catch (InvocationTargetException e) {
70 e.printStackTrace();
71 }
72 catch (Exception e) {
73
74 }
75
76 if (result instanceof DataObject) {
77 ((DataObject)result).accept(visitor);
78 }
79 else if (result instanceof List) {
80 for (Object listElement : (List< ? >)result) {
81 if (listElement instanceof DataObject) {
82 try {
83 ((DataObject)listElement).accept(visitor);
84 }
85 catch (ClassCastException e) {
86 e.printStackTrace();
87 }
88 }
89 }
90 }
91 return result;
92 }
93
94
95 public static IStorageManager newInstance(StorageManager storageManager,
96 Visitor visitor) {
97 return (IStorageManager)Proxy.newProxyInstance(StorageManager.class
98 .getClassLoader(), StorageManager.class.getInterfaces(),
99 new StorageManagerProxy(storageManager, visitor));
100 }
101
102 }