1 package org.eclipse.jetty.annotations;
2
3 import java.util.HashSet;
4 import java.util.List;
5 import java.util.Set;
6
7 import javax.servlet.ServletContextEvent;
8 import javax.servlet.ServletContextListener;
9
10 import org.eclipse.jetty.annotations.AnnotationConfiguration;
11 import org.eclipse.jetty.plus.annotation.ContainerInitializer;
12 import org.eclipse.jetty.util.MultiMap;
13 import org.eclipse.jetty.webapp.WebAppContext;
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public class ServletContainerInitializerListener implements ServletContextListener
34 {
35 WebAppContext _context = null;
36
37
38 public void setWebAppContext (WebAppContext context)
39 {
40 _context = context;
41 }
42
43
44
45
46 public void contextInitialized(ServletContextEvent sce)
47 {
48 List<ContainerInitializer> initializers = (List<ContainerInitializer>)_context.getAttribute(AnnotationConfiguration.CONTAINER_INITIALIZERS);
49 MultiMap classMap = (MultiMap)_context.getAttribute(AnnotationConfiguration.CLASS_INHERITANCE_MAP);
50
51 if (initializers != null)
52 {
53 for (ContainerInitializer i : initializers)
54 {
55
56
57
58 if (i.getAnnotatedTypeNames() != null)
59 {
60 Set<String> annotatedClassNames = new HashSet<String>(i.getAnnotatedTypeNames());
61 for (String name : annotatedClassNames)
62 {
63
64 i.addApplicableTypeName(name);
65
66 if (classMap != null)
67 {
68 List<String> implementsOrExtends = (List<String>)classMap.getValues(name);
69 if (implementsOrExtends != null && !implementsOrExtends.isEmpty())
70 addInheritedTypes(classMap, i, implementsOrExtends);
71 }
72 }
73 }
74
75
76
77
78 if (i.getInterestedTypes() != null)
79 {
80 for (Class c : i.getInterestedTypes())
81 {
82 if (!c.isAnnotation())
83 {
84
85
86 if (classMap != null)
87 {
88 List<String> implementsOrExtends = (List<String>)classMap.getValues(c.getName());
89 if (implementsOrExtends != null && !implementsOrExtends.isEmpty())
90 addInheritedTypes(classMap, i, implementsOrExtends);
91 }
92 }
93 }
94 }
95
96
97 try
98 {
99 i.callStartup(_context);
100 }
101 catch (Exception e)
102 {
103
104 e.printStackTrace();
105 }
106 }
107
108
109
110
111 }
112
113 }
114
115
116 void addInheritedTypes (MultiMap classMap, ContainerInitializer initializer, List<String> applicableTypes)
117 {
118 for (String s : applicableTypes)
119 {
120
121 initializer.addApplicableTypeName(s);
122
123
124 List<String> implementsOrExtends = (List<String>)classMap.getValues(s);
125 if (implementsOrExtends != null && !implementsOrExtends.isEmpty())
126 addInheritedTypes (classMap, initializer, implementsOrExtends);
127 }
128 }
129
130
131
132
133
134 public void contextDestroyed(ServletContextEvent sce)
135 {
136
137
138 }
139
140 }