1f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/**
2f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * Copyright (C) 2009 Google Inc.
3f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin *
4f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * Licensed under the Apache License, Version 2.0 (the "License");
5f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * you may not use this file except in compliance with the License.
6f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * You may obtain a copy of the License at
7f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin *
8f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * http://www.apache.org/licenses/LICENSE-2.0
9f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin *
10f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * Unless required by applicable law or agreed to in writing, software
11f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * distributed under the License is distributed on an "AS IS" BASIS,
12f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * See the License for the specific language governing permissions and
14f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * limitations under the License.
15f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin */
16f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
17f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinpackage com.googlecode.guice.bundle;
18f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
19f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinimport static com.google.inject.name.Names.named;
20f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
21f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinimport com.google.inject.AbstractModule;
22f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinimport com.google.inject.Guice;
23f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinimport com.google.inject.Inject;
24f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinimport com.google.inject.Injector;
25f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinimport com.google.inject.Key;
26f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlinimport com.google.inject.matcher.AbstractMatcher;
27f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
28b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport org.osgi.framework.Bundle;
29b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport org.osgi.framework.BundleActivator;
30b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport org.osgi.framework.BundleContext;
31b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport org.osgi.framework.BundleException;
32b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
33b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport java.lang.reflect.Method;
34b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport java.lang.reflect.Modifier;
35b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport java.util.Random;
36b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
37f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/**
38f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * Test Guice from inside an OSGi bundle activator.
39f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin *
40f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin * @author mcculls@gmail.com (Stuart McCulloch)
41f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin */
42f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin@SuppressWarnings("unused") public class OSGiTestActivator
43f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    implements BundleActivator {
44f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
45f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  // varying visibilities to test our code-generation support
46f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
47ac3cf7c16fe991c6b027d1061034990802dff480cushon  public static class Undefined {}
48f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
49f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  public interface A {}
50f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
51f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  protected interface B {}
52f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
53f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  interface C {}
54f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
55f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  private interface D {}
56f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
57f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  public static class AA
58f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements A {
59f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
60f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    public AA() {}
61f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
62ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
63f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
64ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
65f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
66ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
67f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
68ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
69f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
70ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
71f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
72ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
73f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
74ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
75f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
76ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
77f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
78f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
79f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  protected static class AB
80f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements A {
81f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
82f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    public AB() {}
83f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
84ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
85f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
86ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
87f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
88ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
89f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
90ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
91f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
92ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
93f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
94ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
95f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
96ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
97f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
98ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
99f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
100f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
101f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  static class AC
102f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements A {
103f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
104f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    public AC() {}
105f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
106ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
107f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
108ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
109f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
110ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
111f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
112ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
113f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
114ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
115f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
116ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
117f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
118ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
119f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
120ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
121f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
122f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
123f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  private static class AD
124f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements A {
125f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
126f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    public AD() {}
127f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
128ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
129f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
130ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
131f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
132ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
133f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
134ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
135f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
136ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
137f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
138ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
139f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
140ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
141f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
142ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
143f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
144f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
145f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  public static class BA
146f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements B {
147f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
148f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    protected BA() {}
149f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
150ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
151f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
152ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
153f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
154ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
155f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
156ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
157f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
158ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
159f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
160ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
161f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
162ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
163f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
164ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
165f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
166f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
167f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  protected static class BB
168f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements B {
169f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
170f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    protected BB() {}
171f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
172ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
173f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
174ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
175f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
176ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
177f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
178ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
179f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
180ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
181f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
182ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
183f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
184ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
185f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
186ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
187f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
188f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
189f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  static class BC
190f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements B {
191f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
192f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    protected BC() {}
193f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
194ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
195f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
196ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
197f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
198ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
199f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
200ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
201f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
202ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
203f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
204ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
205f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
206ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
207f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
208ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
209f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
210f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
211f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  private static class BD
212f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements B {
213f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
214f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    protected BD() {}
215f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
216ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
217f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
218ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
219f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
220ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
221f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
222ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
223f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
224ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
225f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
226ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
227f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
228ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
229f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
230ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
231f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
232f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
233f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  public static class CA
234f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements C {
235f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
236f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    CA() {}
237f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
238ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
239f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
240ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
241f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
242ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
243f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
244ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
245f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
246ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
247f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
248ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
249f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
250ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
251f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
252ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
253f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
254f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
255f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  protected static class CB
256f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements C {
257f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
258f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    CB() {}
259f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
260ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
261f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
262ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
263f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
264ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
265f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
266ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
267f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
268ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
269f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
270ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
271f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
272ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
273f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
274ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
275f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
276f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
277f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  static class CC
278f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements C {
279f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
280f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    CC() {}
281f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
282ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
283f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
284ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
285f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
286ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
287f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
288ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
289f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
290ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
291f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
292ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
293f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
294ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
295f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
296ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
297f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
298f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
299f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  private static class CD
300f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements C {
301f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
302f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    CD() {}
303f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
304ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
305f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
306ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
307f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
308ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
309f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
310ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
311f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
312ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
313f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
314ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
315f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
316ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
317f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
318ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
319f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
320f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
321f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  public static class DA
322f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements D {
323f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
324f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    @Inject private DA() {}
325f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
326ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
327f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
328ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
329f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
330ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
331f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
332ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
333f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
334ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
335f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
336ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
337f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
338ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
339f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
340ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
341f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
342f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
343f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  protected static class DB
344f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements D {
345f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
346f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    @Inject private DB() {}
347f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
348ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
349f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
350ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
351f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
352ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
353f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
354ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
355f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
356ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
357f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
358ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
359f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
360ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
361f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
362ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
363f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
364f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
365f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  static class DC
366f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements D {
367f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
368f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    @Inject private DC() {}
369f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
370ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
371f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
372ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
373f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
374ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
375f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
376ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
377f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
378ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
379f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
380ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
381f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
382ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
383f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
384ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
385f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
386f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
387f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  private static class DD
388f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      implements D {
389f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
390f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    private DD() {}
391f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
392ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public void setA(Undefined undefined) {}
393f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
394ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected void setB(Undefined undefined) {}
395f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
396ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject void setC(Undefined undefined) {}
397f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
398ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private void setD(Undefined undefined) {}
399f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
400ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject public Undefined a;
401f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
402ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject protected Undefined b;
403f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
404ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject Undefined c;
405f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
406ac3cf7c16fe991c6b027d1061034990802dff480cushon    @Inject private Undefined d;
407f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
408f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
409f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  enum Visibility {
410f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    PUBLIC, PROTECTED, PACKAGE_PRIVATE, PRIVATE
411f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
412f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
413f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  static final Class<?>[] TEST_CLAZZES = {A.class, B.class, C.class, D.class};
414f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
415f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  // registers all the class combinations
416f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  static class TestModule
417f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      extends AbstractModule {
418f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
419f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    final Bundle bundle;
420f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
421f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    TestModule(Bundle bundle) {
422f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      this.bundle = bundle;
423f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    }
424f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
425f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    @Override @SuppressWarnings("unchecked") protected void configure() {
426f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      for (Class<?> api : TEST_CLAZZES) {
427f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        for (Visibility visibility : Visibility.values()) {
428f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          try {
429f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
430f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            // this registers: A + PUBLIC -> AA, A + PROTECTED -> AB, etc...
431f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            String suffix = TEST_CLAZZES[visibility.ordinal()].getSimpleName();
432f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            Class imp = bundle.loadClass(api.getName() + suffix);
433f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            bind(api).annotatedWith(named(visibility.name())).to(imp);
434f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
435f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          } catch (ClassNotFoundException e) {
436f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            throw new RuntimeException("Unable to load test class", e);
437f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          }
438f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        }
439f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      }
440f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    }
441f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
442f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
443f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*if[AOP]*/
444f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  // applies method-interception to classes with enough visibility
445f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  static class InterceptorModule
446f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      extends AbstractModule {
447f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    @Override protected void configure() {
448f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      bindInterceptor(new AbstractMatcher<Class<?>>() {
449f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        public boolean matches(Class<?> clazz) {
450f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          try {
451f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
452f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            // the class and constructor must be visible
453f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            int clazzModifiers = clazz.getModifiers();
454f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            int ctorModifiers = clazz.getConstructor().getModifiers();
455f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            return (clazzModifiers & (Modifier.PUBLIC | Modifier.PROTECTED)) != 0
456f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin                && (ctorModifiers & (Modifier.PUBLIC | Modifier.PROTECTED)) != 0;
457f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
458f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          } catch (NoSuchMethodException e) {
459f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            return false;
460f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          }
461f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        }
462f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      }, new AbstractMatcher<Method>() {
463f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        public boolean matches(Method method) {
464f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
465f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          // the intercepted method must also be visible
466f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          int methodModifiers = method.getModifiers();
467f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          return (methodModifiers & (Modifier.PUBLIC | Modifier.PROTECTED)) != 0;
468f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
469f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        }
470ac4cdbe137274fd83a7e8e7100653f261618eb94mcculls      }, new org.aopalliance.intercept.MethodInterceptor() {
471ac4cdbe137274fd83a7e8e7100653f261618eb94mcculls        public Object invoke(org.aopalliance.intercept.MethodInvocation mi)
472f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin            throws Throwable {
473f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
474f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin          return mi.proceed();
475f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        }
476f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      });
477f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    }
478f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
479f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*end[AOP]*/
480f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
481f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  // called from OSGi when bundle starts
482f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  public void start(BundleContext context)
483f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      throws BundleException {
484f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
485f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    final Bundle bundle = context.getBundle();
486f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
487f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    Injector injector = Guice.createInjector(new TestModule(bundle));
488f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*if[AOP]*/
489f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    Injector aopInjector = Guice.createInjector(new TestModule(bundle), new InterceptorModule());
490f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*end[AOP]*/
491f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
492f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    // test code-generation support
493f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    for (Class<?> api : TEST_CLAZZES) {
494f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      for (Visibility vis : Visibility.values()) {
495f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        injector.getInstance(Key.get(api, named(vis.name())));
496f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*if[AOP]*/
497f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin        aopInjector.getInstance(Key.get(api, named(vis.name())));
498f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*end[AOP]*/
499f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin      }
500f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    }
501f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
502f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    // test injection of system class (issue 343)
503f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    injector.getInstance(Random.class);
504f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*if[AOP]*/
505f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin    aopInjector.getInstance(Random.class);
506f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin/*end[AOP]*/
507f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  }
508f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin
509f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  // called from OSGi when bundle stops
510f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin  public void stop(BundleContext context) {}
511f7ac6ea677ccfff6c3bec7db1d3621e6b6cf4097sberlin}
512