</goals>
<configuration>
<wait>false</wait>
- <pause>30000</pause>
+ <!-- <pause>30000</pause>-->
<argsToAppend>
<arg>-clean</arg>
</argsToAppend>
<!-- TEST -->
<dependency>
<groupId>org.argeo.slc.runtime</groupId>
- <artifactId>org.argeo.slc.support.equinox</artifactId>
+ <artifactId>org.argeo.slc.server</artifactId>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.springframework.osgi</groupId>
- <artifactId>org.springframework.osgi.test</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.argeo.slc.runtime</groupId>
<artifactId>org.argeo.slc.osgiboot</artifactId>
<scope>test</scope>
</dependency>
-
</dependencies>
</project>
\ No newline at end of file
package org.argeo.slc.it.webapp;
-import java.net.InetAddress;
-
import org.argeo.slc.msg.ObjectList;
-import org.argeo.slc.runtime.SlcAgentDescriptor;
import org.argeo.slc.server.client.SlcServerHttpClient;
-import org.argeo.slc.unit.AbstractSpringTestCase;
+import org.argeo.slc.server.unit.AbstractHttpClientTestCase;
-public class AgentTest extends AbstractSpringTestCase {
+public class AgentTest extends AbstractHttpClientTestCase{
public void testListAgents() throws Exception {
+ waitForServerToBeReady();
SlcServerHttpClient httpClient = getBean(SlcServerHttpClient.class);
ObjectList objectList = httpClient.callService("listAgents.service",
null);
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-lazy-init="true">
- <import resource="classpath:org/argeo/slc/castor/spring.xml" />
+ <import resource="classpath:org/argeo/slc/server/client/spring.xml" />
- <!-- Http client -->
- <bean id="slcDefault.serverHttpClient"
- class="org.argeo.slc.server.client.SlcServerHttpClient" lazy-init="true">
- <property name="unmarshaller" ref="slcDefault.castor.marshaller" />
- </bean>
</beans>
\ No newline at end of file
<version.equinox>3.4.2.R34x_v20080826-1230</version.equinox>
<version.maven-bundle-plugin>2.0.0</version.maven-bundle-plugin>
<version.activemq>5.2.0.0006</version.activemq>
- <!-- <version.activemq-web>5.2.0.0005</version.activemq-web> -->
<version.maven-argeo-osgi>0.1.10</version.maven-argeo-osgi>
</properties>
<scm>
<artifactId>org.argeo.slc.server</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.argeo.slc.runtime</groupId>
+ <artifactId>org.argeo.slc.server</artifactId>
+ <version>${project.version}</version>
+ <classifier>tests</classifier>
+ </dependency>
<dependency>
<groupId>org.argeo.slc.runtime</groupId>
<artifactId>org.argeo.slc.osgiboot</artifactId>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>test-jar</goal>
+ </goals>
+ </execution>
+ </executions>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
</dependency>
<!-- Spring -->
- <!--
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>org.springframework.ws</artifactId>
- </dependency>
- -->
+ <!--
+ <dependency> <groupId>org.springframework.ws</groupId>
+ <artifactId>org.springframework.ws</artifactId> </dependency>
+ -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web.servlet</artifactId>
package org.argeo.slc.server.client;
+import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.transform.stream.StreamSource;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.argeo.slc.SlcException;
import org.springframework.oxm.Unmarshaller;
+import org.springframework.util.Assert;
public class SlcServerHttpClient {
+ private final static Log log = LogFactory.getLog(SlcServerHttpClient.class);
+
private Unmarshaller unmarshaller;
- private String baseUrl = "http://localhost:7070/org.argeo.slc.webapp/";
+ private String baseUrl;
+
+ private Long retryPeriod = 1000l;
@SuppressWarnings(value = { "unchecked" })
public <T> T callService(String path, Map<String, String> parameters) {
+ try {
+ return (T) callServiceLowLevel(path, parameters);
+ } catch (Exception e) {
+ throw new SlcException("Cannot call service " + path + " on "
+ + baseUrl, e);
+ }
+ }
+ @SuppressWarnings(value = { "unchecked" })
+ public <T> T callServiceSafe(String path, Map<String, String> parameters,
+ long timeout) {
+ long begin = System.currentTimeMillis();
+ try {
+ Object obj = null;
+ long duration = System.currentTimeMillis() - begin;
+ while (duration < timeout) {
+ try {
+ obj = callServiceLowLevel(path, parameters);
+ } catch (IOException e) {
+ if (log.isTraceEnabled())
+ log.trace("Exception when calling service " + path
+ + " on " + baseUrl, e);
+ }
+
+ if (obj != null)
+ break;
+
+ // wait a bit
+ try {
+ Thread.sleep(retryPeriod);
+ } catch (InterruptedException e) {
+ // silent
+ }
+ }
+
+ if (obj == null)
+ throw new SlcException(
+ "Service "
+ + path
+ + " on "
+ + baseUrl
+ + " did not return an answer after calling it safely for "
+ + duration + " ms.");
+ return (T) obj;
+ } catch (Exception e) {
+ throw new SlcException(
+ "Unexpected exception when safely calling service " + path
+ + " on " + baseUrl, e);
+ }
+ }
+
+ protected Object callServiceLowLevel(String path,
+ Map<String, String> parameters) throws IOException {
+ Assert.notNull(baseUrl, "base url");
InputStream in = null;
try {
URL url = new URL(baseUrl + path);
in = connection.getInputStream();
StreamSource source = new StreamSource(in);
Object obj = unmarshaller.unmarshal(source);
- return (T) obj;
- } catch (Exception e) {
- throw new SlcException("Cannot call service " + path + " on "
- + baseUrl, e);
+ return obj;
} finally {
IOUtils.closeQuietly(in);
}
this.baseUrl = baseUrl;
}
+ public Long getRetryPeriod() {
+ return retryPeriod;
+ }
+
+ /** Retry period in ms when accessing service safely. Default is 1000 ms. */
+ public void setRetryPeriod(Long retryPeriod) {
+ this.retryPeriod = retryPeriod;
+ }
+
}
--- /dev/null
+package org.argeo.slc.web.mvc.management;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import org.argeo.slc.web.mvc.AbstractServiceController;\r
+import org.springframework.web.servlet.ModelAndView;\r
+\r
+/** . */\r
+public class IsServerReady extends AbstractServiceController {\r
+ @Override\r
+ protected void handleServiceRequest(HttpServletRequest request,\r
+ HttpServletResponse response, ModelAndView modelAndView)\r
+ throws Exception {\r
+ // Does nothing for now, it will return an OK answer.\r
+ }\r
+\r
+}\r
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-lazy-init="true">
- <import resource="classpath:org/argeo/slc/server/client/spring.xml" />
+ <import resource="classpath:org/argeo/slc/castor/spring.xml" />
+
+ <!-- Http client -->
+ <bean id="slcDefault.serverHttpClient" class="org.argeo.slc.server.client.SlcServerHttpClient"
+ lazy-init="true">
+ <property name="unmarshaller" ref="slcDefault.castor.marshaller" />
+ <property name="baseUrl" value="http://localhost:7070/org.argeo.slc.webapp/" />
+ </bean>
</beans>
\ No newline at end of file
--- /dev/null
+package org.argeo.slc.server.unit;
+
+import org.argeo.slc.SlcException;
+import org.argeo.slc.msg.ExecutionAnswer;
+import org.argeo.slc.server.client.SlcServerHttpClient;
+import org.argeo.slc.unit.AbstractSpringTestCase;
+
+public abstract class AbstractHttpClientTestCase extends AbstractSpringTestCase {
+ private SlcServerHttpClient httpClient = null;
+
+ private String isServerReadyService = "isServerReady.service";
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ httpClient = createHttpClient();
+ }
+
+ protected void waitForServerToBeReady() {
+ ExecutionAnswer answer = httpClient.callServiceSafe(
+ isServerReadyService, null, getServerReadyTimeout());
+ if (!answer.isOk())
+ throw new SlcException("Server is not ready: " + answer);
+ }
+
+ protected SlcServerHttpClient createHttpClient() {
+ SlcServerHttpClient httpClient = getBean(SlcServerHttpClient.class);
+ return httpClient;
+ }
+
+ protected SlcServerHttpClient getHttpClient() {
+ return httpClient;
+ }
+
+ /** Default is 120s */
+ protected Long getServerReadyTimeout() {
+ return 120 * 1000l;
+ }
+}
this.message = message;
}
+ public Boolean isOk() {
+ return status.equals(OK);
+ }
+
+ public Boolean isError() {
+ return status.equals(ERROR);
+ }
+
public static ExecutionAnswer error(String message) {
return new ExecutionAnswer(ERROR, message);
}
<import resource="classpath:/org/argeo/slc/castor/spring/applicationContext.xml" />
+ <bean name="/isServerReady.service" class="org.argeo.slc.web.mvc.management.IsServerReady">
+ </bean>
+
<bean name="/getResult.service" class="org.argeo.slc.web.mvc.result.GetResultController">
<constructor-arg ref="testResultDao" />
</bean>