1 package org.cateproject.view;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.InputStreamReader;
8 import java.io.OutputStream;
9 import java.io.OutputStreamWriter;
10 import java.nio.charset.Charset;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Locale;
16 import java.util.Map;
17 import java.util.Set;
18
19 import javax.servlet.RequestDispatcher;
20 import javax.servlet.ServletException;
21 import javax.xml.transform.stream.StreamSource;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.cateproject.controller.description.FeatureNodeWithLevel;
26 import org.cateproject.view.mock.MockLinkTool;
27 import org.cateproject.view.mock.MockRequestDispatcher;
28 import org.junit.AfterClass;
29 import org.junit.Before;
30 import org.junit.BeforeClass;
31 import org.springframework.context.i18n.LocaleContextHolder;
32 import org.springframework.mock.web.MockHttpServletRequest;
33 import org.springframework.mock.web.MockHttpServletResponse;
34 import org.springframework.mock.web.MockServletConfig;
35 import org.springframework.mock.web.MockServletContext;
36 import org.springframework.security.authentication.AuthenticationManager;
37 import org.springframework.security.authentication.TestingAuthenticationToken;
38 import org.springframework.security.core.Authentication;
39 import org.springframework.security.core.GrantedAuthority;
40 import org.springframework.security.core.authority.GrantedAuthorityImpl;
41 import org.springframework.security.core.context.SecurityContextHolder;
42 import org.springframework.security.core.context.SecurityContextImpl;
43 import org.springframework.security.web.context.HttpSessionContextIntegrationFilter;
44 import org.springframework.security.authentication.AuthenticationManager;
45 import org.springframework.security.authentication.TestingAuthenticationToken;
46 import org.springframework.validation.DataBinder;
47 import org.springframework.validation.Validator;
48 import org.springframework.web.servlet.DispatcherServlet;
49 import org.springframework.web.servlet.ModelAndView;
50 import org.unitils.UnitilsJUnit4;
51
52 import eu.etaxonomy.cdm.io.jaxb.CdmDocumentBuilder;
53 import eu.etaxonomy.cdm.io.jaxb.DataSet;
54 import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;
55 import eu.etaxonomy.cdm.model.common.User;
56 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
57 import eu.etaxonomy.cdm.model.description.Feature;
58 import eu.etaxonomy.cdm.model.description.FeatureNode;
59 import eu.etaxonomy.cdm.model.description.FeatureTree;
60 import eu.etaxonomy.cdm.model.view.AuditEvent;
61 import eu.etaxonomy.cdm.model.view.context.AuditEventContextHolder;
62
63 public abstract class CATEViewTest extends UnitilsJUnit4 {
64
65 private static Log log = LogFactory.getLog(CATEViewTest.class);
66
67 protected static DispatcherServlet dispatcherServlet;
68 protected static MockServletContext servletContext;
69 protected static MockController mockController;
70 protected static MockFormController formController;
71 protected MockHttpServletRequest request;
72 protected MockHttpServletResponse response;
73 protected static DataSet dataSet;
74
75 protected Set<Feature> getFeatures(FeatureNode node, Set<Feature> features) {
76 if(features == null) {
77 features = new HashSet<Feature>();
78 }
79 if(node.getFeature() != null) {
80 features.add(node.getFeature());
81 }
82 for(FeatureNode child : node.getChildren()) {
83 getFeatures(child,features);
84 }
85 return features;
86 }
87
88 protected List<FeatureNode> constructDescriptionElementsWithLevels(List<? extends DescriptionElementBase> descriptionElements,Set<Feature> features,FeatureTree featureTree) {
89 Map<Feature,List<DescriptionElementBase>> elements = new HashMap<Feature,List<DescriptionElementBase>>();
90 for(Feature f : features) {
91 elements.put(f, new ArrayList<DescriptionElementBase>());
92 }
93 for(DescriptionElementBase t : descriptionElements) {
94 elements.get(t.getFeature()).add(t);
95 }
96 List<FeatureNode> textDataWithLevels = new ArrayList<FeatureNode>();
97 constructDescriptionElementWithLevels(elements,textDataWithLevels,featureTree.getRoot(), 0);
98
99 return textDataWithLevels;
100 }
101
102 private void constructDescriptionElementWithLevels(Map<Feature, List<DescriptionElementBase>> elements, List<FeatureNode> descriptionElementsWithLevels, FeatureNode featureNode, int level) {
103 FeatureNodeWithLevel featureNodeWithLevel = new FeatureNodeWithLevel(featureNode, level);
104 descriptionElementsWithLevels.add(featureNodeWithLevel);
105
106 for(DescriptionElementBase t : elements.get(featureNode.getFeature())) {
107 featureNodeWithLevel.addElement(t);
108 }
109 featureNodeWithLevel.sortElements();
110
111 for(FeatureNode child : featureNode.getChildren()) {
112 constructDescriptionElementWithLevels(elements,descriptionElementsWithLevels,child, level + 1);
113 }
114 }
115
116 @BeforeClass
117 public static void setUp() {
118 DefaultTermInitializer initalizer = new DefaultTermInitializer();
119 initalizer.initialize();
120
121 servletContext = new MockServletContext() {
122 public RequestDispatcher getRequestDispatcher(String resource) {
123 MockRequestDispatcher mockRequestDispatcher = new MockRequestDispatcher(
124 dispatcherServlet);
125 mockRequestDispatcher.setResource(resource);
126 return mockRequestDispatcher;
127 }
128 };
129 servletContext.setContextPath("target/test-classes");
130 MockServletConfig servletConfig = new MockServletConfig(servletContext,
131 "cate");
132
133 dispatcherServlet = new DispatcherServlet();
134
135 try {
136 CdmDocumentBuilder cateDocumentBuilder = new CdmDocumentBuilder();
137 try {
138 cateDocumentBuilder.afterPropertiesSet();
139 } catch (Exception e) {
140 log.error(e);
141 for (StackTraceElement ste : e.getStackTrace()) {
142 log.error(ste);
143 }
144 }
145 File file = new File(CATEViewTest.class.getResource(
146 CATEViewTest.getDataset()).getFile());
147 if (!file.exists()) {
148 log.error(file.getAbsolutePath() + " cannot be found");
149 }
150
151 StreamSource source = new StreamSource(new InputStreamReader(
152 new FileInputStream(file), "UTF-8"));
153 source.setSystemId(file);
154 dataSet = (DataSet) cateDocumentBuilder.unmarshal(source);
155 dispatcherServlet.init(servletConfig);
156 LocaleContextHolder.setLocale(Locale.getDefault());
157
158 mockController = (MockController) dispatcherServlet
159 .getWebApplicationContext().getBean("mockController",
160 MockController.class);
161 formController = (MockFormController) dispatcherServlet
162 .getWebApplicationContext().getBean("formController",
163 MockFormController.class);
164 } catch (ServletException e) {
165 log.error(e);
166 for (StackTraceElement ste : e.getStackTrace()) {
167 log.error(ste);
168 }
169 } catch (Exception e) {
170 log.error(e);
171 for (StackTraceElement ste : e.getStackTrace()) {
172 log.error(ste);
173 }
174 }
175 }
176
177 @AfterClass
178 public static void tearDown() {
179 dataSet = null;
180 servletContext = null;
181 mockController = null;
182 formController = null;
183
184 dispatcherServlet.destroy();
185 dispatcherServlet = null;
186 }
187
188 @Before
189 public void onSetUp() {
190 request = new MockHttpServletRequest(servletContext, "GET",
191 "/mockController.do");
192
193 response = new MockHttpServletResponse();
194 User principal = User.NewInstance("ben","passwd");
195 TestingAuthenticationToken token = new TestingAuthenticationToken(
196 principal, "test", new GrantedAuthority[] {
197 new GrantedAuthorityImpl("PERMISSION_ADMINISTRATE"),
198 new GrantedAuthorityImpl("PERMISSION_ANNOTATE"),
199 new GrantedAuthorityImpl("PERMISSION_EDIT"),
200 new GrantedAuthorityImpl("PERMISSION_PUBLISH") });
201 SecurityContextImpl secureContext = new SecurityContextImpl();
202 AuthenticationManager authenticationManager = (AuthenticationManager) dispatcherServlet
203 .getWebApplicationContext().getBean("authenticationManager",
204 AuthenticationManager.class);
205 Authentication authentication = authenticationManager
206 .authenticate(token);
207 secureContext.setAuthentication(authentication);
208 SecurityContextHolder.setContext(secureContext);
209 request
210 .getSession()
211 .setAttribute(
212 HttpSessionContextIntegrationFilter.SPRING_SECURITY_CONTEXT_KEY,
213 secureContext);
214 AuditEventContextHolder.getContext().setAuditEvent(
215 AuditEvent.CURRENT_VIEW);
216 }
217
218 protected void outputSingleRequest(ModelAndView modelAndView, String fileName) {
219
220 try {
221 File file = new File(fileName);
222 File parent = file.getParentFile();
223 if (!parent.exists()) {
224 if (parent.mkdirs()) {
225 log.info("Created Parent Directory " + file.getParent());
226 } else {
227 log.error("Could not create Parent Directory"
228 + file.getParent());
229 }
230 }
231 MockLinkTool link = new MockLinkTool();
232 link.setXHTML(false);
233 link.setRoot(parent);
234 link.setResponse(response);
235 modelAndView.addObject("link", link);
236 mockController.setModelAndView(modelAndView);
237 dispatcherServlet.service(request, response);
238
239 OutputStream outputStream = new FileOutputStream(file);
240 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
241 outputStream, Charset.forName("UTF-8"));
242 outputStreamWriter.write(response.getContentAsString());
243 outputStreamWriter.close();
244 } catch (ServletException e) {
245 log.error(e);
246 for (StackTraceElement ste : e.getStackTrace()) {
247 log.error(ste);
248 }
249 } catch (IOException e) {
250 log.error(e);
251 for (StackTraceElement ste : e.getStackTrace()) {
252 log.error(ste);
253 }
254 }
255
256 }
257
258 protected void outputMock(ModelAndView modelAndView, String fileName) {
259 outputMock(modelAndView,fileName,"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",null);
260 }
261
262 protected void outputMock(ModelAndView modelAndView, String fileName, String contentType, Map<String,String> params) {
263 request.addHeader("Accept", contentType);
264 if(params != null) {
265 for(String key : params.keySet()) {
266 request.addParameter(key, params.get(key));
267 }
268 }
269
270 try {
271 File file = new File(fileName);
272 File parent = file.getParentFile();
273 if (!parent.exists()) {
274 if (parent.mkdirs()) {
275 log.info("Created Parent Directory " + file.getParent());
276 } else {
277 log.error("Could not create Parent Directory"
278 + file.getParent());
279 }
280 }
281 MockLinkTool link = new MockLinkTool();
282 link.setXHTML(false);
283 link.setRoot(parent);
284 link.setResponse(response);
285 modelAndView.addObject("link", link);
286 mockController.setModelAndView(modelAndView);
287 dispatcherServlet.service(request, response);
288 if(response.getForwardedUrl() != null) {
289 request.setRequestURI(response.getForwardedUrl());
290 dispatcherServlet.service(request, response);
291 }
292
293 OutputStream outputStream = new FileOutputStream(file);
294 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
295 outputStream, Charset.forName("UTF-8"));
296 outputStreamWriter.write(response.getContentAsString());
297 outputStreamWriter.close();
298 } catch (ServletException e) {
299 log.error(e);
300 for (StackTraceElement ste : e.getStackTrace()) {
301 log.error(ste);
302 }
303 } catch (IOException e) {
304 log.error(e);
305 for (StackTraceElement ste : e.getStackTrace()) {
306 log.error(ste);
307 }
308 }
309
310 }
311
312 protected void outputMockPdfPage(ModelAndView modelAndView, String fileName) {
313
314 try {
315 File file = new File(fileName);
316 File parent = file.getParentFile();
317 if (!parent.exists()) {
318 if (parent.mkdirs()) {
319 log.info("Created Parent Directory " + file.getParent());
320 } else {
321 log.error("Could not create Parent Directory"
322 + file.getParent());
323 }
324 }
325
326 mockController.setModelAndView(modelAndView);
327 request.addHeader("Accept", "application/pdf");
328 dispatcherServlet.service(request, response);
329 OutputStream outputStream = new FileOutputStream(file);
330 outputStream.write(response.getContentAsByteArray());
331 outputStream.close();
332 } catch (ServletException e) {
333 log.error(e);
334 for (StackTraceElement ste : e.getStackTrace()) {
335 log.error(ste);
336 }
337 } catch (IOException e) {
338 log.error(e);
339 for (StackTraceElement ste : e.getStackTrace()) {
340 log.error(ste);
341 }
342 }
343
344 }
345
346 protected void outputForm(String formView, String fileName, String commandName, Class commandClass, Map<String, Object> referenceData, String method,
347 Validator mockValidator, Map<String, String> postValues) {
348 for (String param : postValues.keySet()) {
349 request.addParameter(param, postValues.get(param));
350 }
351
352 request.setMethod(method);
353 File file = new File(fileName);
354 File parent = file.getParentFile();
355 if (!parent.exists()) {
356 if (parent.mkdirs()) {
357 log.info("Created Parent Directory " + file.getParent());
358 } else {
359 log.error("Could not create Parent Directory"
360 + file.getParent());
361 }
362 }
363 MockLinkTool link = new MockLinkTool();
364 link.setXHTML(false);
365 link.setRoot(parent);
366 link.setResponse(response);
367 referenceData.put("link", link);
368 ModelAndView modelAndView = new ModelAndView(formView);
369 for(String key : referenceData.keySet()) {
370 modelAndView.addObject(key, referenceData.get(key));
371 }
372
373
374 mockController.setModelAndView(modelAndView);
375 try {
376 dispatcherServlet.service(request, response);
377 if(response.getForwardedUrl() != null) {
378 request.setRequestURI(response.getForwardedUrl());
379 System.out.println(response.getForwardedUrl());
380 dispatcherServlet.service(request, response);
381 }
382
383
384 OutputStream outputStream = new FileOutputStream(file);
385 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
386 outputStream, Charset.forName("UTF-8"));
387 outputStreamWriter.write(response.getContentAsString());
388 outputStreamWriter.close();
389 } catch (ServletException e) {
390 log.error(e);
391 for (StackTraceElement ste : e.getStackTrace()) {
392 log.error(ste);
393 }
394 } catch (IOException e) {
395 log.error(e);
396 for (StackTraceElement ste : e.getStackTrace()) {
397 log.error(ste);
398 }
399 }
400 }
401
402 private static String getDataset() {
403 return "/org/cateproject/view/CATEViewTest.xml";
404 }
405 }