Re-design the ServiceStatus JSP page
authorSasha Sherstnev <a.sherstnev@dundee.ac.uk>
Mon, 16 Sep 2013 14:17:02 +0000 (15:17 +0100)
committerSasha Sherstnev <a.sherstnev@dundee.ac.uk>
Mon, 16 Sep 2013 14:17:02 +0000 (15:17 +0100)
statpages/ServicesStatus.jsp
webservices/compbio/stat/servlet/ServiceTestResult.java
webservices/compbio/ws/client/Services.java

index b9c4fb2..7f5ffcd 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="ISO-8859-1" ?>\r
-<%@ page language="java" contentType="text/html; charset=ISO-8859-1"\r
-    pageEncoding="ISO-8859-1"%>\r
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>\r
 <%--\r
 Author: Peter Troshin\r
 Date: May 2011\r
@@ -13,64 +12,170 @@ TODO refactor
 <%@ taglib uri="http://displaytag.sf.net" prefix="dt" %>\r
 \r
 <c:import url="header.jsp" >\r
-       <c:param name="title">JABAWS Services Status</c:param>\r
-</c:import>  \r
+       <c:param name="title">JABAWS Web Services Status</c:param>\r
+</c:import>\r
 <div style="margin: 20px ">\r
 <h2 style="text-align: center;">JABAWS Services Status</h2>\r
-<h2 style="text-align: center;">Server: \r
-<a href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}">\r
-<span style="color: green">${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}</span></a></h2>\r
+\r
+<ul style="font-weight: bold;">\r
+  <li>All the services are tested while this page is being loaded</li>\r
+  <li>If you want to test the services again, just reload this page.</li>\r
+  <li>Click on the service status to see the results of the testing.</li>\r
+  <li>Server tested: <a href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}">\r
+       ${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}\r
+       </a> </li>\r
+</ul>\r
+\r
+<br/>\r
 <br/>\r
-<p>All the services were tested while this page was loading. If you want to test the services again, just reload this page. Click on the service status to see the results of the testing.</p>\r
+<h2 style="text-align: center;color: green">\r
+       Alignment Web Services\r
+</h2>\r
 <table class="its" >\r
 <thead>\r
-<tr>\r
-<th title="The name of the service" width="100px">Service</th>\r
-<th title="Service status">Status</th>\r
-</tr>\r
+       <tr>\r
+               <th title="Service name" width="100px">Service</th>\r
+               <th title="Service status">Version</th>\r
+               <th title="Service status">Status</th>\r
+               <th title="Service details">Reference and more details</th>\r
+       </tr>\r
 </thead>\r
 <c:forEach items="${results}" var="res" varStatus="status">\r
-  <c:choose>\r
-       <c:when test="${status.count%2==0}">\r
-               <tr class="even">\r
-       </c:when>\r
-       <c:otherwise>\r
-               <tr class="odd">\r
-       </c:otherwise>\r
-</c:choose>\r
-  <td width="100px">${res.service}</td>\r
-  \r
-  <td>\r
-  <c:choose>\r
-       <c:when test="${res.status}">\r
-               \r
-               <div class="source">\r
-               <div class="header collapsed" onclick=\r
-               "$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
-               title="Click to open/close"><span style="color: green">OK</span></div>\r
+<c:if test="${res.group=='alignment'}">\r
+       <c:if test="${status.count%2==0}">\r
+       <tr class="even">\r
+       </c:if><c:if test="${status.count%2!=0}">\r
+       <tr class="odd">\r
+       </c:if>\r
+               <td width="100px">${res.service}</td>\r
+               <td>${res.version}</td>\r
+               <c:if test="${res.status}">\r
+                       <td><div class="source">\r
+                       <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                               title="Click to open/close"><span style="color: green">OK</span></div>\r
+                       <div class="body collapsed">\r
+                       <pre>${res.details}</pre>\r
+                       </div></div></td>\r
+               </c:if>\r
+               <c:if test="false == ${res.status}">\r
+                       <td><div class="source">\r
+                       <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                               title="Click to open/close"><span style="color: red">Fail</span></div>\r
+                       <div class="body collapsed">\r
+                       <pre>${res.details}</pre>\r
+                       </div></div></td>\r
+               </c:if>\r
+               <td><div class="source">\r
+               <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                       title="Click to open/close"><span style="color: brown">INFO</span></div>\r
                <div class="body collapsed">\r
-               <pre>${res.details}</pre>\r
-               </div>\r
-               </div>\r
-       </c:when>\r
-       <c:otherwise>\r
-       <div class="source">\r
-               <div class="header collapsed" onclick=\r
-               "$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
-               title="Click to open/close"><span style="color: red">Fail</span></div>\r
-               <div class="body collapsed">\r
-               <pre>${res.details}</pre>\r
-               </div>\r
-       </div>\r
+               <pre>${res.reference}</pre>\r
+               </div></div></td>\r
+       </tr>\r
+</c:if>\r
+</c:forEach>\r
+</table>\r
 \r
-       </c:otherwise>\r
-       </c:choose>\r
-  </td>\r
-  \r
-</tr>\r
+<br/>\r
+<br/>\r
+<h2 style="text-align: center;color: green;">\r
+       Disorder Web Services\r
+</h2>\r
+<table class="its" >\r
+<thead>\r
+       <tr>\r
+               <th title="Service name" width="100px">Service</th>\r
+               <th title="Service status">Version</th>\r
+               <th title="Service status">Status</th>\r
+               <th title="Service details">Reference and more details</th>\r
+       </tr>\r
+</thead>\r
+<c:forEach items="${results}" var="res" varStatus="status">\r
+<c:if test="${res.group=='disorder'}">\r
+       <c:if test="${status.count%2==0}">\r
+       <tr class="even">\r
+       </c:if><c:if test="${status.count%2!=0}">\r
+       <tr class="odd">\r
+       </c:if>\r
+               <td width="100px">${res.service}</td>\r
+               <td>${res.version}</td>\r
+               <c:if test="${res.status}">\r
+                       <td><div class="source">\r
+                       <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                               title="Click to open/close"><span style="color: green">OK</span></div>\r
+                       <div class="body collapsed">\r
+                       <pre>${res.details}</pre>\r
+                       </div></div></td>\r
+               </c:if>\r
+               <c:if test="false == ${res.status}">\r
+                       <td><div class="source">\r
+                       <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                               title="Click to open/close"><span style="color: red">Fail</span></div>\r
+                       <div class="body collapsed">\r
+                       <pre>${res.details}</pre>\r
+                       </div></div></td>\r
+               </c:if>\r
+               <td><div class="source">\r
+               <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                       title="Click to open/close"><span style="color: brown">INFO</span></div>\r
+               <div class="body collapsed">\r
+               <pre>${res.reference}</pre>\r
+               </div></div></td>\r
+       </tr>\r
+</c:if>\r
+</c:forEach>\r
+</table>\r
 \r
+<br/>\r
+<br/>\r
+<h2 style="text-align: center;color: green;">\r
+       Other Web Services\r
+</h2>\r
+<table class="its" >\r
+<thead>\r
+       <tr>\r
+               <th title="Service name" width="100px">Service</th>\r
+               <th title="Service status">Version</th>\r
+               <th title="Service status">Status</th>\r
+               <th title="Service details">Reference and more details</th>\r
+       </tr>\r
+</thead>\r
+<c:forEach items="${results}" var="res" varStatus="status">\r
+<c:if test="${res.group!='alignment' and res.group!='disorder'}">\r
+       <c:if test="${status.count%2==0}">\r
+       <tr class="even">\r
+       </c:if><c:if test="${status.count%2!=0}">\r
+       <tr class="odd">\r
+       </c:if>\r
+               <td width="100px">${res.service}</td>\r
+               <td>${res.version}</td>\r
+               <c:if test="${res.status}">\r
+                       <td><div class="source">\r
+                       <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                               title="Click to open/close"><span style="color: green">OK</span></div>\r
+                       <div class="body collapsed">\r
+                       <pre>${res.details}</pre>\r
+                       </div></div></td>\r
+               </c:if>\r
+               <c:if test="false == ${res.status}">\r
+                       <td><div class="source">\r
+                       <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                               title="Click to open/close"><span style="color: red">Fail</span></div>\r
+                       <div class="body collapsed">\r
+                       <pre>${res.details}</pre>\r
+                       </div></div></td>\r
+               </c:if>\r
+               <td><div class="source">\r
+               <div class="header collapsed" onclick="$(this).toggleClassName('collapsed'); $(this).next('.body').toggleClassName('collapsed');"\r
+                       title="Click to open/close"><span style="color: brown">INFO</span></div>\r
+               <div class="body collapsed">\r
+               <pre>${res.reference}</pre>\r
+               </div></div></td>\r
+       </tr>\r
+</c:if>\r
 </c:forEach>\r
 </table>\r
+\r
 <p>If you would like to integrate JABAWS with automated health check system you may want to use \r
 the HTTP code response service checker. It responds with HTTP status code depending on the status \r
 of the web service.\r
index e616f57..d03e6bd 100644 (file)
@@ -14,15 +14,20 @@ public class ServiceTestResult {
        final Services service;\r
        boolean failed;\r
        String details;\r
+       String group;\r
+       String version;\r
+       String reference;\r
 \r
        public ServiceTestResult(Services service) {\r
                this.service = service;\r
+               this.group = service.getServiceGroup();\r
+               this.version = service.getServiceVersion();\r
+               this.reference = service.getServiceReference();\r
        }\r
 \r
        @Override\r
        public String toString() {\r
-               return "ServiceTestResult [service=" + service + ", failed=" + failed\r
-                               + ", details=" + details.toString() + "]";\r
+               return "ServiceTestResult [service=" + service + ", failed=" + failed + ", details=" + details.toString() + "]";\r
        }\r
 \r
        @Override\r
@@ -59,4 +64,15 @@ public class ServiceTestResult {
                return details;\r
        }\r
 \r
+       public String getGroup() {\r
+               return group;\r
+       }\r
+\r
+       public String getVersion() {\r
+               return version;\r
+       }\r
+\r
+       public String getReference() {\r
+               return reference;\r
+       }\r
 }\r
index 741f6d5..42d282e 100644 (file)
@@ -127,111 +127,205 @@ public enum Services {
        public String getServiceInfo() {\r
                switch (this) {\r
                        case AAConWS :\r
-                               return AACON_INFO;\r
+                               return AACON_INFO.toString();\r
                        case JpredWS :\r
-                               return JPRED_INFO;\r
+                               return JPRED_INFO.toString();\r
                        case ClustalOWS :\r
-                               return CLUSTAL_OMEGA_INFO;\r
+                               return CLUSTAL_OMEGA_INFO.toString();\r
                        case ClustalWS :\r
-                               return CLUSTAL_INFO;\r
+                               return CLUSTAL_INFO.toString();\r
                        case DisemblWS :\r
-                               return DISEMBL_INFO;\r
+                               return DISEMBL_INFO.toString();\r
                        case GlobPlotWS :\r
-                               return GLOBPLOT_INFO;\r
+                               return GLOBPLOT_INFO.toString();\r
                        case IUPredWS :\r
-                               return IUPRED_INFO;\r
+                               return IUPRED_INFO.toString();\r
                        case JronnWS :\r
-                               return JRONN_INFO;\r
+                               return JRONN_INFO.toString();\r
                        case MafftWS :\r
-                               return MAFFT_INFO;\r
+                               return MAFFT_INFO.toString();\r
                        case MuscleWS :\r
-                               return MUSCLE_INFO;\r
+                               return MUSCLE_INFO.toString();\r
                        case ProbconsWS :\r
-                               return PROBCONS_INFO;\r
+                               return PROBCONS_INFO.toString();\r
                        case TcoffeeWS :\r
-                               return TCOFFEE_INFO;\r
+                               return TCOFFEE_INFO.toString();\r
                        case RNAalifoldWS :\r
-                               return RNAALIFOLD_INFO;\r
+                               return RNAALIFOLD_INFO.toString();\r
                        default :\r
                                throw new RuntimeException("Unrecognised Web Service Type " + this + " - Should never happen!");\r
                }\r
        }\r
 \r
-       public static final String AACON_INFO = new ServiceInfo(AAConWS,\r
-                       "in preparation", "1.0", "http://www.compbio.dundee.ac.uk/aacon").toString();\r
+       public String getServiceReference() {\r
+               switch (this) {\r
+                       case AAConWS :\r
+                               return AACON_INFO.getReference();\r
+                       case JpredWS :\r
+                               return JPRED_INFO.getReference();\r
+                       case ClustalOWS :\r
+                               return CLUSTAL_OMEGA_INFO.getReference();\r
+                       case ClustalWS :\r
+                               return CLUSTAL_INFO.getReference();\r
+                       case DisemblWS :\r
+                               return DISEMBL_INFO.getReference();\r
+                       case GlobPlotWS :\r
+                               return GLOBPLOT_INFO.getReference();\r
+                       case IUPredWS :\r
+                               return IUPRED_INFO.getReference();\r
+                       case JronnWS :\r
+                               return JRONN_INFO.getReference();\r
+                       case MafftWS :\r
+                               return MAFFT_INFO.getReference();\r
+                       case MuscleWS :\r
+                               return MUSCLE_INFO.getReference();\r
+                       case ProbconsWS :\r
+                               return PROBCONS_INFO.getReference();\r
+                       case TcoffeeWS :\r
+                               return TCOFFEE_INFO.getReference();\r
+                       case RNAalifoldWS :\r
+                               return RNAALIFOLD_INFO.getReference();\r
+                       default :\r
+                               throw new RuntimeException("Unrecognised Web Service Type " + this + " - Should never happen!");\r
+               }\r
+       }\r
 \r
-       public static final String JPRED_INFO = new ServiceInfo(JpredWS,\r
+       public String getServiceVersion() {\r
+               switch (this) {\r
+                       case AAConWS :\r
+                               return AACON_INFO.getVersion();\r
+                       case JpredWS :\r
+                               return JPRED_INFO.getVersion();\r
+                       case ClustalOWS :\r
+                               return CLUSTAL_OMEGA_INFO.getVersion();\r
+                       case ClustalWS :\r
+                               return CLUSTAL_INFO.getVersion();\r
+                       case DisemblWS :\r
+                               return DISEMBL_INFO.getVersion();\r
+                       case GlobPlotWS :\r
+                               return GLOBPLOT_INFO.getVersion();\r
+                       case IUPredWS :\r
+                               return IUPRED_INFO.getVersion();\r
+                       case JronnWS :\r
+                               return JRONN_INFO.getVersion();\r
+                       case MafftWS :\r
+                               return MAFFT_INFO.getVersion();\r
+                       case MuscleWS :\r
+                               return MUSCLE_INFO.getVersion();\r
+                       case ProbconsWS :\r
+                               return PROBCONS_INFO.getVersion();\r
+                       case TcoffeeWS :\r
+                               return TCOFFEE_INFO.getVersion();\r
+                       case RNAalifoldWS :\r
+                               return RNAALIFOLD_INFO.getVersion();\r
+                       default :\r
+                               throw new RuntimeException("Unrecognised Web Service Type " + this + " - Should never happen!");\r
+               }\r
+       }\r
+\r
+       public String getServiceGroup() {\r
+               switch (this) {\r
+                       case AAConWS :\r
+                               return "annotation";\r
+                       case JpredWS :\r
+                               return "annotation";\r
+                       case ClustalOWS :\r
+                               return "alignment";\r
+                       case ClustalWS :\r
+                               return "alignment";\r
+                       case DisemblWS :\r
+                               return "disorder";\r
+                       case GlobPlotWS :\r
+                               return "disorder";\r
+                       case IUPredWS :\r
+                               return "disorder";\r
+                       case JronnWS :\r
+                               return "disorder";\r
+                       case MafftWS :\r
+                               return "alignment";\r
+                       case MuscleWS :\r
+                               return "alignment";\r
+                       case ProbconsWS :\r
+                               return "alignment";\r
+                       case TcoffeeWS :\r
+                               return "alignment";\r
+                       case RNAalifoldWS :\r
+                               return "annotation";\r
+                       default :\r
+                               throw new RuntimeException("Unrecognised Web Service Type " + this + " - Should never happen!");\r
+               }\r
+       }\r
+       \r
+       static ServiceInfo AACON_INFO = new ServiceInfo(AAConWS,\r
+                       "in preparation", "1.0", "http://www.compbio.dundee.ac.uk/aacon");\r
+\r
+       static ServiceInfo JPRED_INFO = new ServiceInfo(JpredWS,\r
                        "Cole C, Barber JD, Barton GJ.reparation" + \r
                        "The Jpred 3 secondary structure prediction server\n" +\r
                        "Nucl. Acids Res. (2008) 36 (suppl 2): W197-W201., doi: 10.1093/nar/gkn238", \r
-                       "3.0", "http://www.compbio.dundee.ac.uk/www-jpred").toString();\r
+                       "3.0.3", "http://www.compbio.dundee.ac.uk/www-jpred");\r
        \r
-       public static final String CLUSTAL_INFO = new ServiceInfo(ClustalWS,\r
+       static ServiceInfo CLUSTAL_INFO = new ServiceInfo(ClustalWS,\r
                        "Larkin MA, Blackshields G, Brown NP, Chenna R, McGettigan PA, McWilliam H, Valentin F, " + \r
                        "Wallace IM, Wilm A, Lopez R, Thompson JD, Gibson TJ, Higgins DG.\n" +\r
                        "(2007). Clustal W and Clustal X version 2.0. Bioinformatics, 23, 2947-2948.",\r
-                       "2.0.12", "http://www.clustal.org/clustal2/").toString();\r
+                       "2.0.12", "http://www.clustal.org/clustal2/");\r
 \r
-       public static final String CLUSTAL_OMEGA_INFO = new ServiceInfo(ClustalOWS,\r
+       static ServiceInfo CLUSTAL_OMEGA_INFO = new ServiceInfo(ClustalOWS,\r
                        "Fast, scalable generation of high quality protein multiple sequence alignments using Clustal Omega\r\n"\r
                        + "Fabian Sievers, Andreas Wilm, David Dineen, Toby J. Gibson, Kevin Karplus, Weizhong Li, Rodrigo Lopez, Hamish McWilliam, Michael Remmert, Johannes Söding, Julie D. Thompson, Desmond G. Higgins",\r
-                       "1.0.2", "http://www.clustal.org/omega").toString();\r
+                       "1.0.2", "http://www.clustal.org/omega");\r
 \r
-       public static final String DISEMBL_INFO = new ServiceInfo(DisemblWS,\r
+       static ServiceInfo DISEMBL_INFO = new ServiceInfo(DisemblWS,\r
                        "R. Linding, L.J. Jensen, F. Diella, P. Bork, T.J. Gibson and R.B. Russell\r\n"\r
                        + "Protein disorder prediction: implications for structural proteomics\r\n"\r
                        + "Structure Vol 11, Issue 11, 4 November 2003", "1.5",\r
-                       "http://dis.embl.de/").toString();\r
+                       "http://dis.embl.de/");\r
 \r
-       public static final String GLOBPLOT_INFO = new ServiceInfo(GlobPlotWS,\r
+       static ServiceInfo GLOBPLOT_INFO = new ServiceInfo(GlobPlotWS,\r
                        "Rune Linding, Robert B. Russell, Victor Neduva and Toby J. Gibson " +\r
                        "'GlobPlot: exploring protein sequences for globularity and disorder.' " + \r
                        "Nucl. Acids Res. (2003) 31 (13): 3701-3708. doi: 10.1093/nar/gkg519\r\n",\r
-                       "2.3", "http://globplot.embl.de/").toString();\r
+                       "2.3", "http://globplot.embl.de/");\r
 \r
-       public static final String IUPRED_INFO = new ServiceInfo(IUPredWS,\r
+       static ServiceInfo IUPRED_INFO = new ServiceInfo(IUPredWS,\r
                        "The Pairwise Energy Content Estimated from Amino Acid Composition Discriminates between Folded and Intrinsically Unstructured Proteins\r\n"\r
                        + "Zsuzsanna Dosztányi, Veronika Csizmók, Péter Tompa and István Simon\r\n"\r
                        + "J. Mol. Biol. (2005) 347, 827-839.", "1.0",\r
-                       "http://iupred.enzim.hu/").toString();\r
+                       "http://iupred.enzim.hu/");\r
 \r
-       public static final String TCOFFEE_INFO = new ServiceInfo(TcoffeeWS,\r
+       static ServiceInfo TCOFFEE_INFO = new ServiceInfo(TcoffeeWS,\r
                        "T-Coffee: A novel method for multiple sequence alignments  "\r
                        + "Notredame, Higgins, Heringa, JMB, 302 (205-217) 2000",\r
-                       "8.99", "http://tcoffee.crg.cat/apps/tcoffee/index.html").toString();\r
+                       "8.99", "http://tcoffee.crg.cat/apps/tcoffee/index.html");\r
 \r
-       public static final String MUSCLE_INFO = new ServiceInfo(\r
-                       MuscleWS,\r
+       static ServiceInfo MUSCLE_INFO = new ServiceInfo(MuscleWS,\r
                        "Edgar, R.C. (2004) MUSCLE: multiple sequence alignment with high accuracy and high throughput.Nucleic Acids Res. 32(5):1792-1797.\r\n"\r
                        + "doi:10.1093/nar/gkh340", "3.8.31",\r
-                       "http://www.drive5.com/muscle/").toString();\r
+                       "http://www.drive5.com/muscle/");\r
 \r
-       public static final String PROBCONS_INFO = new ServiceInfo(\r
-                       ProbconsWS,\r
+       static ServiceInfo PROBCONS_INFO = new ServiceInfo(ProbconsWS,\r
                        "Do, C.B., Mahabhashyam, M.S.P., Brudno, M., and Batzoglou, S. 2005. PROBCONS: "\r
                        + "Probabilistic Consistency-based Multiple Sequence Alignment. Genome Research 15: 330-340. ",\r
-                       "1.12", "http://probcons.stanford.edu/").toString();\r
+                       "1.12", "http://probcons.stanford.edu/");\r
 \r
-       public static final String JRONN_INFO = new ServiceInfo(\r
-                       JronnWS,\r
+       static ServiceInfo JRONN_INFO = new ServiceInfo(JronnWS,\r
                        "unpublished, original algorithm Yang,Z.R., Thomson,R., McMeil,P. and Esnouf,R.M. (2005) "\r
                                        + "RONN: the bio-basis function neural network technique applied to the "\r
                                        + "dectection of natively disordered regions in proteins Bioinformatics 21: 3369-3376\r\n",\r
-                       "1.0", "http://www.compbio.dundee.ac.uk/jabaws/").toString();\r
+                       "1.0", "http://www.compbio.dundee.ac.uk/jabaws/");\r
 \r
-       public static final String MAFFT_INFO = new ServiceInfo(\r
-                       MafftWS,\r
+       static ServiceInfo MAFFT_INFO = new ServiceInfo(MafftWS,\r
                        "Katoh, Toh 2010 (Bioinformatics 26:1899-1900)\r\n"\r
                                        + "Parallelization of the MAFFT multiple sequence alignment program. ",\r
-                       "6.8.57", "http://mafft.cbrc.jp/alignment/software/").toString();\r
+                       "6.8.57", "http://mafft.cbrc.jp/alignment/software/");\r
 \r
-       public static final String RNAALIFOLD_INFO = new ServiceInfo(\r
-                       RNAalifoldWS,\r
+       static ServiceInfo RNAALIFOLD_INFO = new ServiceInfo(RNAalifoldWS,\r
                        "Ivo L. Hofacker, Martin Fekete, and Peter F. Stadler 'Secondary Structure Prediction"\r
                        + " for Aligned RNA Sequences'. J.Mol.Biol. 319: 1059-1066, 2002. Stephan H. Bernhart,"\r
                        + " Ivo L. Hofacker, Sebastian Will, Andreas R. Gruber, and Peter F. Stadler. "\r
                        + "'RNAalifold: Improved consensus structure prediction for RNA alignments'. BMC Bioinformatics, 9:474, 2008.\r\n",\r
-                       "2.1.2", "http://www.tbi.univie.ac.at/RNA/").toString();\r
+                       "2.1.2", "http://www.tbi.univie.ac.at/RNA/");\r
 \r
        @XmlAccessorType(XmlAccessType.FIELD)\r
        static class ServiceInfo {\r
@@ -255,12 +349,20 @@ public enum Services {
 \r
                @Override\r
                public String toString() {\r
-                       String value = "SERVICE: " + service + " version " + version + line_delimiter;\r
+                       String value = "SERVICE: " + service + " version " + version + line_delimiter + "\n";\r
                        value += "JABAWS v. " + jabaws_version + line_delimiter;\r
-                       value += "REFERENCES: " + reference + line_delimiter;\r
+                       value += "REFERENCE: " + reference + line_delimiter + "\n";\r
                        value += "MORE INFORMATION: " + moreinfo + line_delimiter;\r
                        return value;\r
                }\r
+\r
+               public String getReference() {\r
+                       return "REFERENCE: " + reference + line_delimiter + "<br>MORE INFORMATION: " + moreinfo + line_delimiter;\r
+               }\r
+\r
+               public String getVersion() {\r
+                       return version;\r
+               }\r
        }\r
 \r
        public static void main(String[] args) {\r