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