b8559b1eb7b280f72a0130d84e54e6656ac431cb
[taxeditor.git] / eu.etaxonomy.taxeditor.test / src / test / java / eu / etaxonomy / taxeditor / httpinvoker / BaseRemotingTest.java
1 /**
2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.httpinvoker;
10
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.InputStream;
14 import java.lang.reflect.Field;
15 import java.net.URL;
16 import java.util.Map;
17 import java.util.Properties;
18
19 import net.sf.ehcache.CacheManager;
20
21 import org.apache.log4j.Logger;
22 import org.eclipse.core.runtime.FileLocator;
23 import org.eclipse.core.runtime.Platform;
24 import org.junit.Assert;
25 import org.junit.BeforeClass;
26 import org.osgi.framework.Bundle;
27 import org.springframework.core.io.ClassPathResource;
28 import org.springframework.core.io.Resource;
29 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
30 import org.springframework.security.core.Authentication;
31 import org.springframework.security.core.context.SecurityContextHolder;
32 import org.springframework.security.core.context.SecurityContextImpl;
33 import org.unitils.UnitilsJUnit4;
34 import org.unitils.database.DatabaseUnitils;
35 import org.unitils.database.annotations.Transactional;
36 import org.unitils.database.util.TransactionMode;
37 import org.unitils.spring.annotation.SpringApplicationContext;
38
39 import eu.etaxonomy.cdm.api.application.CdmApplicationRemoteController;
40 import eu.etaxonomy.cdm.api.application.CdmApplicationState;
41 import eu.etaxonomy.cdm.api.application.CdmDataChangeService;
42 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
43 import eu.etaxonomy.taxeditor.remoting.cache.CdmRemoteCacheManager;
44 import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
45 import eu.etaxonomy.taxeditor.remoting.source.CdmPersistentRemoteSource;
46 import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;
47 import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSourceException;
48 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
49 import eu.etaxonomy.taxeditor.session.CdmEntitySession;
50 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
51 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
52
53
54 /**
55 * Base class for remoting tests, responsible for
56 * - starting / stop the cdm server
57 * - running some basic connection tests
58 * - setting up the remote configuration.
59 *
60 */
61 @Transactional(TransactionMode.DISABLED)
62 @SpringApplicationContext("file:./target/classes/eu/etaxonomy/cdm/testRemotingApplicationContext.xml")
63 public abstract class BaseRemotingTest extends UnitilsJUnit4 {
64 private static final Logger logger = Logger.getLogger(BaseRemotingTest.class);
65
66
67 public static final Resource SERVER_PROPERTIES_FILE =
68 new ClassPathResource("server.properties");
69
70 private static ICdmRemoteSource cdmRemoteSource;
71 private static CdmPersistentRemoteSource remotePersistentSource;
72
73 public static boolean useManagedServer = true;
74
75
76 protected static ICdmEntitySessionManager cdmEntitySessionManager;
77
78 private final static String DEFAULT_USER = "admin";
79 private final static String DEFAULT_PASSWORD = "00000";
80
81 private static String userHomeKey = "user.home";
82
83 private static String user = DEFAULT_USER;
84 private static String password = DEFAULT_PASSWORD;
85
86 protected static CDMServer cdmServer;
87
88 @BeforeClass
89 public static void initializeBaseRemotingTest() {
90
91 DatabaseUnitils.disableConstraints();
92
93 try {
94 String userHomeDirPath;
95 Bundle bundle = Platform.getBundle("eu.etaxonomy.taxeditor.test");
96
97 URL userHomeDirURL = bundle.getEntry("src/test/resources");
98 File userHomeDir = new File(FileLocator.resolve(userHomeDirURL).toURI());
99 userHomeDirPath = userHomeDir.getAbsolutePath();
100
101 URL serverPropertiesURL = bundle.getEntry("src/test/resources/server.properties");
102 File serverPropertiesFile = new File(FileLocator.resolve(serverPropertiesURL).toURI());
103 InputStream inputStream = new FileInputStream(serverPropertiesFile);
104
105 Properties prop = new Properties();
106 if (inputStream != null) {
107 prop.load(inputStream);
108 inputStream.close();
109 }
110
111 logger.info("Setting user.home to " + userHomeDirPath);
112 System.setProperty(userHomeKey, userHomeDirPath);
113
114 cdmServer = new CDMServer("cdmTest");
115
116
117 if(prop.getProperty("user") != null) {
118 user = prop.getProperty("user");
119 }
120
121 if(prop.getProperty("password") != null) {
122 password = prop.getProperty("password");
123 }
124
125 initializeController(cdmServer.getName(),
126 cdmServer.getHost(),
127 cdmServer.getPort(),
128 cdmServer.getContextPath(),
129 NomenclaturalCode.ICNAFP,
130 user,
131 password);
132 } catch (Exception e) {
133 e.printStackTrace();
134 // Assert.fail("Server failed to start. Reason : " + e.getMessage());
135 }
136
137 logger.info("Emptying all caches (except model cache) ");
138 //emptyAllCachesExceptModelCache();
139 }
140
141 public static void emptyAllCachesExceptModelCache() {
142 CacheManager cm = CacheManager.create();
143 String[] cacheNames = CacheManager.create().getCacheNames();
144 for(String cacheName : cacheNames) {
145 if(!cacheName.equals(CdmRemoteCacheManager.CDM_MODEL_CACHE_NAME)) {
146 cm.removeCache(cacheName);
147 }
148 }
149 }
150
151
152 public static void initializeController(String sourceName, String host, int port, String contextPath, NomenclaturalCode ncode, String username, String password) {
153
154 if(CdmApplicationState.getCurrentAppConfig() != null) {
155 return;
156 }
157 cdmRemoteSource = CdmRemoteSource.NewInstance(sourceName, host, port, contextPath, ncode);
158 CdmApplicationRemoteController remoteApplicationController =
159 CdmApplicationRemoteController.NewInstance(cdmRemoteSource,
160 null,
161 null);
162 CdmApplicationState.setCurrentAppConfig(remoteApplicationController);
163 try {
164 remotePersistentSource = CdmPersistentRemoteSource.NewInstance(sourceName);
165 } catch (CdmRemoteSourceException e) {
166 Assert.fail("Default Remote Persistent Source failed to load. Reason : " + e.getMessage());
167 }
168 cdmEntitySessionManager = getRemoteApplicationController().getCdmEntitySessionManager();
169
170 CdmApplicationState.setCurrentDataChangeService(new CdmDataChangeService());
171
172 //FIXME:Remoting the authentication code should be replaced by a method call which actually
173 // does the authentication in the editor code so that the 'real' authentication can be tested
174 SecurityContextHolder.clearContext();
175 SecurityContextImpl sc = new SecurityContextImpl();
176 Authentication token = new UsernamePasswordAuthenticationToken(username,password);
177 Authentication authentication = getRemoteApplicationController().getAuthenticationManager().authenticate(token);
178 authentication = new UsernamePasswordAuthenticationToken(username,password, authentication.getAuthorities());
179 sc.setAuthentication(authentication);
180
181 SecurityContextHolder.setContext(sc);
182 CdmApplicationState.setCurrentSecurityContext(SecurityContextHolder.getContext());
183 }
184
185
186
187 protected static CdmApplicationRemoteController getRemoteApplicationController() {
188 return (CdmApplicationRemoteController) CdmApplicationState.getCurrentAppConfig();
189 }
190
191 protected static ICdmRemoteSource getCdmRemoteSource() {
192 return cdmRemoteSource;
193 }
194
195 protected static CdmPersistentRemoteSource getCdmPersistentRemoteSource() {
196 return remotePersistentSource;
197 }
198
199 protected static ICdmEntitySessionManager getCdmEntitySessionManager() {
200 return cdmEntitySessionManager;
201 }
202
203
204 protected static CdmEntitySession getSession(ICdmEntitySessionEnabled sessionOwner) {
205 Map<ICdmEntitySessionEnabled, CdmEntitySession> ownerSessionMap =
206 (Map<ICdmEntitySessionEnabled, CdmEntitySession>) getFieldValueViaReflection(cdmEntitySessionManager, "ownerSessionMap");
207 return ownerSessionMap.get(sessionOwner);
208 }
209
210 protected static CdmEntitySession getActiveSession() {
211 return (CdmEntitySession) getFieldValueViaReflection(cdmEntitySessionManager, "activeSession");
212 }
213
214 protected static CdmTransientEntityCacher getCacher(ICdmEntitySessionEnabled sessionOwner) {
215 return (CdmTransientEntityCacher) getFieldValueViaReflection(getSession(sessionOwner), "cdmTransientEntityCacher");
216 }
217
218
219 protected static Object getFieldValueViaReflection(Object object, String fieldName) {
220 Class<?> clazz = object.getClass();
221 try {
222 Field field = clazz.getDeclaredField(fieldName);
223 field.setAccessible(true);
224 return field.get(object);
225 } catch (NoSuchFieldException e) {
226 e.printStackTrace();
227 } catch (SecurityException e) {
228 e.printStackTrace();
229 } catch (IllegalArgumentException e) {
230 e.printStackTrace();
231 } catch (IllegalAccessException e) {
232 e.printStackTrace();
233 }
234 return null;
235 }
236
237
238
239
240 }