package compbio.ws.server; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Resource; import javax.jws.WebService; import javax.servlet.http.HttpServletRequest; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; import org.apache.log4j.Logger; import compbio.data.msa.JABAService; import compbio.ws.client.Jws2Client; import compbio.ws.client.Services; import compbio.ws.client.WSTester; /** * TODO * * @author pvtroshin * */ @WebService(endpointInterface = "compbio.data.msa.RegistryWS", targetNamespace = "http://msa.data.compbio/01/12/2010/", serviceName = "RegistryWS") public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService { // Ask for resource injection @Resource WebServiceContext wsContext; private static Logger statLog = Logger.getLogger("RegistryWS-stats"); private static Logger log = Logger.getLogger(RegistryWS.class); private final static Map operating = new ConcurrentHashMap(); /** * 1) Check that the actual executable is configured * * 2) Check whether the service is enabled? * * 3) Attempt to execute? * * @return */ @Override public Set getSupportedServices() { init(); return operating.keySet(); } private void init() { // This can be run concurrently if (operating.isEmpty()) { testAllServices(); } } @Override public Date getLastTestedOn(Services service) { return operating.get(service); } @Override public String testAllServices() { Writer testlog = new StringWriter(); PrintWriter writer = new PrintWriter(testlog, true); WSTester tester = new WSTester(writer); for (Services service : Services.values()) { JABAService ws = Jws2Client.connect(getServicePath(), service); if (tester.checkService(ws)) { operating.put(service, new Date()); } } return testlog.toString(); } private String getServicePath() { assert wsContext != null : "WS context injection failed!"; MessageContext msContext = wsContext.getMessageContext(); HttpServletRequest request = (HttpServletRequest) msContext .get(MessageContext.SERVLET_REQUEST); StringBuffer server = request.getRequestURL(); server = server.delete(server.lastIndexOf("/"), server.length()); return server.toString(); } @Override public String testService(Services service) { String server = getServicePath(); Writer testlog = new StringWriter(); PrintWriter writer = new PrintWriter(testlog, true); WSTester tester = new WSTester(writer); writer.println("Attempting to connect to the service " + service + " on the server " + server + "..."); JABAService ws = Jws2Client.connect(server, service); writer.println("Connected successfully!"); try { boolean succeed = tester.checkService(ws); if (succeed) { // TODO extract messages (see WSTester main) writer.println("Check is completed. The Service " + service.toString() + " IS WORKING"); operating.put(service, new Date()); } else { writer.println("Check is completed. The Service " + service.toString() + " HAS SOME PROBLEMS"); } } finally { writer.close(); } return testlog.toString(); } @Override public boolean isOperating(Services service) { init(); return operating.containsKey(service); } }