/**
* GRANITE DATA SERVICES
* Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S.
*
* This file is part of the Granite Data Services Platform.
*
* Granite Data Services is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Granite Data Services is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA, or see <http://www.gnu.org/licenses/>.
*/
package org.granite.test.tide.ejb;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.granite.config.GraniteConfig;
import org.granite.config.ServletGraniteConfig;
import org.granite.config.api.Configuration;
import org.granite.config.api.internal.ConfigurationImpl;
import org.granite.config.flex.ServicesConfig;
import org.granite.config.flex.ServletServicesConfig;
import org.granite.context.GraniteContext;
import org.granite.gravity.Gravity;
import org.granite.messaging.webapp.HttpGraniteContext;
import org.granite.test.gravity.MockGravity;
import org.granite.test.tide.MockHttpServletRequest;
import org.granite.test.tide.MockHttpServletResponse;
import org.granite.test.tide.MockHttpSession;
import org.granite.test.tide.MockServletContext;
import org.granite.test.tide.ejb.service.Hello2Service;
import org.granite.test.tide.ejb.service.Hello2ServiceBean;
import org.granite.test.tide.ejb.service.HelloMerge2Service;
import org.granite.test.tide.ejb.service.HelloMerge2ServiceBean;
import org.granite.test.tide.ejb.service.HelloMerge3Service;
import org.granite.test.tide.ejb.service.HelloMerge3ServiceBean;
import org.granite.test.tide.ejb.service.HelloMerge4Service;
import org.granite.test.tide.ejb.service.HelloMerge4ServiceBean;
import org.granite.test.tide.ejb.service.HelloMergeService;
import org.granite.test.tide.ejb.service.HelloMergeServiceBean;
import org.granite.test.tide.ejb.service.HelloServiceBean;
import org.granite.tide.ejb.EjbServiceFactory;
import org.granite.tide.invocation.ContextResult;
import org.granite.tide.invocation.ContextUpdate;
import org.granite.tide.invocation.InvocationCall;
import org.granite.tide.invocation.InvocationResult;
import org.granite.util.XMap;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.After;
import org.junit.Before;
import flex.messaging.messages.Message;
import flex.messaging.messages.RemotingMessage;
public class AbstractTideTestCase {
private ServletContext servletContext = null;
private EJBContainer ejbContainer = null;
private EjbServiceFactory ejbServiceFactory = null;
private HttpServletRequest request = null;
private HttpServletResponse response = null;
private MockGravity mockGravity = new MockGravity();
@Before
public void setUp() throws Exception {
servletContext = initServletContext();
final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "tests.jar")
.addClasses(HelloServiceBean.class, Hello2Service.class, Hello2ServiceBean.class)
.addClasses(HelloMergeService.class, HelloMergeServiceBean.class)
.addClasses(HelloMerge2Service.class, HelloMerge2ServiceBean.class)
.addClasses(HelloMerge3Service.class, HelloMerge3ServiceBean.class)
.addClasses(HelloMerge4Service.class, HelloMerge4ServiceBean.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "services-config.properties");
String ejbContainerClassName = System.getProperty("ejb.container.className");
ejbContainer = (EJBContainer)Class.forName(ejbContainerClassName).newInstance();
ejbContainer.start(archive);
servletContext.setAttribute(Gravity.class.getName(), mockGravity);
MockHttpSession session = new MockHttpSession("TEST$SESSION", servletContext);
request = new MockHttpServletRequest(session);
response = new MockHttpServletResponse();
Configuration cfg = new ConfigurationImpl();
cfg.setFlexServicesConfig("/WEB-INF/flex/services-config-ejb.xml");
cfg.setGraniteConfig("/WEB-INF/granite/granite-config-ejb.xml");
servletContext.setAttribute(ServletGraniteConfig.GRANITE_CONFIG_CONFIGURATION_KEY, cfg);
GraniteConfig graniteConfig = ServletGraniteConfig.loadConfig(servletContext);
ServicesConfig servicesConfig = ServletServicesConfig.loadConfig(servletContext);
HttpGraniteContext.createThreadIntance(graniteConfig, servicesConfig, servletContext, request, response);
ejbServiceFactory = new EjbServiceFactory();
XMap props = new XMap();
props.put("lookup", "java:global/tests/{capitalized.component.name}Bean");
ejbServiceFactory.configure(props);
ejbServiceFactory.setInitialContext(ejbContainer.getInitialContext());
}
protected ServletContext initServletContext() {
return new MockServletContext();
}
@After
public void tearDown() throws Exception {
ejbContainer.stop();
ejbContainer = null;
GraniteContext.release();
}
protected Message getLastMessage() {
return mockGravity.getLastMessage();
}
protected InvocationResult invokeComponent(String componentName, String componentClassName, String operation, Object[] params) {
return invokeComponent(componentName, componentClassName, operation, params, null, null, null);
}
protected InvocationResult invokeComponent(String componentName, String componentClassName, String operation, Object[] params, Object[] updates, String[] results, String conversationId) {
return invokeComponent(componentName, componentClassName, operation, params, null, updates, results, conversationId);
}
protected InvocationResult invokeComponent(String componentName, String componentClassName, String operation, Object[] params, String[] listeners, Object[] updates, String[] results, String conversationId) {
RemotingMessage callMessage = new RemotingMessage();
callMessage.setDestination("ejb");
callMessage.setOperation("invokeComponent");
Object[] args = new Object[5];
args[0] = componentName;
args[1] = componentClassName;
args[2] = operation;
args[3] = params;
InvocationCall call = new InvocationCall();
if (listeners != null)
call.setListeners(Arrays.asList(listeners));
else
call.setListeners(new ArrayList<String>());
List<ContextUpdate> cus = new ArrayList<ContextUpdate>();
if (updates != null) {
for (int i = 0; i < updates.length; i++) {
Object[] u = (Object[])updates[i];
boolean inConv = u.length > 3 ? (Boolean)u[3] : false;
ContextUpdate cu = new ContextUpdate((String)u[0], (String)u[1], u[2], inConv ? 2 : 1, false);
cus.add(cu);
}
}
call.setUpdates(cus);
Object[] res = results != null ? new Object[results.length] : new Object[] {};
if (results != null) {
for (int i = 0; i < results.length; i++) {
int idx = results[i].indexOf(".");
if (idx > 0)
res[i] = new ContextResult(results[i].substring(0, idx), results[i].substring(idx+1));
else
res[i] = new ContextResult(results[i], null);
}
}
call.setResults(res);
args[4] = call;
callMessage.setBody(args);
return (InvocationResult)ejbServiceFactory.getServiceInstance(callMessage).invoke(callMessage);
}
}