View Javadoc

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 		//request.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
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 }