X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=webservices%2Fcompbio%2Fws%2Fserver%2FRegistryWS.java;h=3898b884ff4c0aafebf46091dba76faba3f3a945;hb=140e024c6b00451dd933a9c25feac2d170d5f9f6;hp=869807b5202c7f26dc6183e8ee2fb52d8a18245f;hpb=a2619dbd95b874abd03ae551c02524fe09e9f631;p=jabaws.git diff --git a/webservices/compbio/ws/server/RegistryWS.java b/webservices/compbio/ws/server/RegistryWS.java index 869807b..3898b88 100644 --- a/webservices/compbio/ws/server/RegistryWS.java +++ b/webservices/compbio/ws/server/RegistryWS.java @@ -1,3 +1,20 @@ +/* Copyright (c) 2011 Peter Troshin + * + * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0 + * + * This library is free software; you can redistribute it and/or modify it under the terms of the + * Apache License version 2 as published by the Apache Software Foundation + * + * This library 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 Apache + * License for more details. + * + * A copy of the license is in apache_license.txt. It is also available here: + * @see: http://www.apache.org/licenses/LICENSE-2.0.txt + * + * Any republication or derived work distributed in source code form + * must include this copyright and license notice. + */ package compbio.ws.server; import java.io.PrintWriter; @@ -17,37 +34,34 @@ 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 + * JABAWS services registry * * @author pvtroshin * */ -@WebService(endpointInterface = "compbio.data.msa.RegistryWS", targetNamespace = "http://msa.data.compbio/01/12/2010/", serviceName = "RegistryWS") +@WebService(endpointInterface = "compbio.data.msa.RegistryWS", targetNamespace = JABAService.V2_SERVICE_NAMESPACE, 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); + /** + * Stores tested and passed (the test) services and their testing time + */ 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 + * Indicate whether the services were tested at all */ + private static boolean allTested = false; + @Override public Set getSupportedServices() { init(); @@ -55,28 +69,91 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService { } private void init() { - // This can be run concurrently - if (operating.isEmpty()) { - testAllServices(); + // Do not allow tests to run concurrently + if (timeToTest()) { + synchronized (operating) { + if (timeToTest()) { + testAllServices(); + allTested = true; + } + } + } + } + + private boolean timeToTest() { + if (!allTested) { + return true; + } + // 24 h + if (getLongestUntestedServiceTime() > 3600 * 24) { + return true; + } + return false; + } + + /** + * Return time in seconds for the test for the oldest unchecked service + * + * @return + */ + private int getLongestUntestedServiceTime() { + int timePassed = 0; + for (Services serv : operating.keySet()) { + int lasttimepassed = getLastTested(serv); + if (timePassed < lasttimepassed) { + timePassed = lasttimepassed; + } } + return timePassed; } + + @Override + public int getLastTested(Services service) { + Date testedOn = getLastTestedOn(service); + if (testedOn != null) { + return (int) ((System.currentTimeMillis() - testedOn.getTime()) / 1000); + } + return 0; + } + + /** + * Can potentially return null if the service has not been tested yet. + */ @Override public Date getLastTestedOn(Services service) { - return operating.get(service); + if (operating.containsKey(service)) { + return operating.get(service); + } + return null; } + /** + * TODO improve reporting. stop testing service on unsupported runtime env + * exception + */ @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()); + WSTester tester = new WSTester(getServicePath(), writer); + // This is done deliberately to prevent malicious user from overloading + // the server + synchronized (operating) { + for (Services service : Services.values()) { + try { + if (tester.checkService(service)) { + operating.put(service, new Date()); + } + } catch (Exception e) { + log.info(e, e.getCause()); + writer.println("Fails to connect to a web service: " + + service + " With " + e.getLocalizedMessage() + + "\nDetails: "); + e.printStackTrace(writer); + } } } + writer.close(); return testlog.toString(); } @@ -96,22 +173,19 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService { 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!"); + WSTester tester = new WSTester(server, writer); 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"); + synchronized (operating) { + boolean succeed = tester.checkService(service); + if (succeed) { + operating.put(service, new Date()); + } } + } catch (Exception e) { + log.info(e, e.getCause()); + writer.println("Fails to connect to a web service: " + service + + " With " + e.getLocalizedMessage() + "\nDetails: "); + e.printStackTrace(writer); } finally { writer.close(); } @@ -123,4 +197,14 @@ public class RegistryWS implements compbio.data.msa.RegistryWS, JABAService { return operating.containsKey(service); } + @Override + public String getServiceDescription(Services service) { + return service.getServiceInfo(); + } + + @Override + public Set getServiceCategories() { + return Category.getCategories(); + } + }