View Javadoc

1   package org.csc.phynixx.connection;
2   
3   /*
4    * #%L
5    * phynixx-connection
6    * %%
7    * Copyright (C) 2014 csc
8    * %%
9    * Licensed under the Apache License, Version 2.0 (the "License");
10   * you may not use this file except in compliance with the License.
11   * You may obtain a copy of the License at
12   * 
13   *      http://www.apache.org/licenses/LICENSE-2.0
14   * 
15   * Unless required by applicable law or agreed to in writing, software
16   * distributed under the License is distributed on an "AS IS" BASIS,
17   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18   * See the License for the specific language governing permissions and
19   * limitations under the License.
20   * #L%
21   */
22  
23  
24  import java.lang.reflect.Method;
25  
26  class AbstractDynaProxyFactory {
27  
28      private Class[] supportedInterfaces = null;
29      private Class[] requiredInterfaces = null;
30      private Class[] optionalInterfaces = null;
31      private Class[] implementedInterfaces = null;   
32  
33  
34      /**
35       * @param supportedInterfaces
36       * @param requiredInterfaces
37       * @param optionalInterfaces
38       * @param synchronize
39       */
40      protected AbstractDynaProxyFactory(Class[] supportedInterfaces, Class[] requiredInterfaces, Class[] optionalInterfaces, boolean synchronize) {
41          if (supportedInterfaces == null || supportedInterfaces.length == 0) {
42              throw new IllegalArgumentException("supportedInterfaces are missing");
43          }
44          this.supportedInterfaces = supportedInterfaces;
45          this.requiredInterfaces = requiredInterfaces;
46          this.implementedInterfaces = supportedInterfaces;
47          this.optionalInterfaces = optionalInterfaces;
48          if (requiredInterfaces == null) {
49              return;
50          }
51          for (int i = 0; i < requiredInterfaces.length; i++) {
52              this.implementedInterfaces = this.addRequiredInterface(this.implementedInterfaces, requiredInterfaces[i]);
53          }
54  
55      }
56  
57  
58      private Class[] addRequiredInterface(Class[] implementedInterfaces, Class requiredInterface) {
59          for (int i = 0; i < implementedInterfaces.length; i++) {
60              if (implementedInterfaces[i].isInterface() &&
61                      requiredInterface.isAssignableFrom(implementedInterfaces[i])) {
62                  return implementedInterfaces;
63              }
64          }
65  
66          // if not found extend the array of supported interfaces
67          Class[] xImplementedInterfaces = new Class[implementedInterfaces.length + 1];
68          xImplementedInterfaces[0] = requiredInterface;
69          for (int i = 0; i < implementedInterfaces.length; i++) {
70              xImplementedInterfaces[i + 1] = implementedInterfaces[i];
71          }
72          return xImplementedInterfaces;
73  
74      }
75  
76  
77      protected Class[] getSupportedInterfaces() {
78          return supportedInterfaces;
79      }
80  
81  
82      protected Class[] getImplementedInterfaces() {
83          return implementedInterfaces;
84      }
85  
86      protected Class[] getRequiredInterfaces() {
87          return requiredInterfaces;
88      }
89  
90  
91      public Class[] getOptionalInterfaces() {
92          return optionalInterfaces;
93      }
94  
95      private boolean declaredBy(Method method, Class[] interfaces) {
96          Class declaringClass = method.getDeclaringClass();
97          for (int i = 0; i < interfaces.length; i++) {
98              if (declaringClass.equals(interfaces[i])) {
99                  return true;
100             }
101         }
102         return false;
103     }
104 
105     protected boolean declaredBySupportedInterface(Method method) {
106         return declaredBy(method, this.getSupportedInterfaces());
107     }
108 
109     protected boolean declaredBySystemInterface(Method method) {
110         return declaredBy(method, this.getRequiredInterfaces()) || declaredBy(method, this.getOptionalInterfaces());
111     }
112 
113 }