7bc5b2703c7bb8c991ad9219b31bd4814d9b555b
[utils] / system / general / src / main / java / org / wamblee / system / DefaultRequiredInterface.java
1 package org.wamblee.system;
2
3 import java.util.Arrays;
4
5 public class DefaultRequiredInterface implements RequiredInterface {
6
7         private String _name;
8         private Class[] _required;
9         private ProvidedInterface _provider; 
10         
11         public DefaultRequiredInterface(String aName, Class aInterface) {
12                 this(aName, new Class[] { aInterface }); 
13         }
14
15         public DefaultRequiredInterface(String aName, Class[] aInterfaces) {
16                 _name = aName; 
17                 _required = aInterfaces; 
18         }
19
20         @Override
21         public String getName() {
22                 return _name;
23         }
24         
25         @Override
26         public boolean implementedBy(ProvidedInterface aDescriptor) {
27                 Class[] provided = aDescriptor.getInterfaceTypes();
28                 for (Class required : _required) {
29                         if ( !serviceProvided(required, provided)) { 
30                                 return false; 
31                         }
32                 }
33                 // all required interfaces are provided.
34                 return true; 
35         }
36         
37         /**
38          * Check if the required interface is implemented by one of the provided interfaces. 
39          * @param aRequired required interface
40          * @param aProvided Provided interfaces.
41          * @return
42          */
43         private boolean serviceProvided(Class aRequired, Class[] aProvided) { 
44                 for (Class provided: aProvided) {
45                         try {
46                                 provided.asSubclass(aRequired);
47                                 return true; 
48                         } catch (ClassCastException e) {
49                                 // No match, try the next one.
50                         }
51                 }
52                 return false; 
53         }
54         
55         @Override
56         public ProvidedInterface getProvider() {
57                 return _provider; 
58         }
59         
60         @Override
61         public void setProvider(ProvidedInterface aProvider) {
62                 _provider = aProvider;  
63         }
64
65         @Override
66         public <T> T getImplementation(Class<T> aClass) {
67                 if ( _provider == null ) { 
68                         return null; 
69                 }
70                 return (T)_provider.getImplementation();
71         }
72         
73         @Override
74         public boolean equals(Object obj) {
75                 if ( !(obj instanceof DefaultRequiredInterface)) { 
76                         return false; 
77                 }
78                 DefaultRequiredInterface descr = (DefaultRequiredInterface)obj;
79                 if ( _required.length != descr._required.length ) { 
80                         return false; 
81                 }
82                 String[] interfaces1 = new String[_required.length];
83                 String[] interfaces2 = new String[_required.length];
84                 for (int i = 0; i < _required.length; i++) {  
85                         interfaces1[i] = _required[i].getName();
86                         interfaces2[i] = descr._required[i].getName();
87                 }
88                 Arrays.sort(interfaces1);
89                 Arrays.sort(interfaces2);
90                 return Arrays.equals(interfaces1, interfaces2);
91         }
92
93         @Override
94         public int hashCode() {
95                 return _required.hashCode(); 
96         }
97         
98         @Override
99         public String toString() {
100                 StringBuffer buf = new StringBuffer();
101                 for (Class intf: _required) { 
102                         buf.append("." + intf.getName());
103                 }
104                 return buf.toString();
105         }
106 }