Refactoring: rename duplicated Util classes
[jabaws.git] / webservices / compbio / ws / client / Services.java
index 6840916..42d282e 100644 (file)
@@ -26,7 +26,6 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.namespace.QName;\r
 import javax.xml.ws.Service;\r
 \r
 import javax.xml.namespace.QName;\r
 import javax.xml.ws.Service;\r
 \r
-import compbio.data.msa.FoldWS;\r
 import compbio.data.msa.JABAService;\r
 import compbio.data.msa.MsaWS;\r
 import compbio.data.msa.SequenceAnnotation;\r
 import compbio.data.msa.JABAService;\r
 import compbio.data.msa.MsaWS;\r
 import compbio.data.msa.SequenceAnnotation;\r
@@ -40,7 +39,7 @@ public enum Services {
         * Make sure this class has NO references to runners or engines as it is a\r
         * part of minimal client package. Such things should go into ServicesUtil\r
         */\r
         * Make sure this class has NO references to runners or engines as it is a\r
         * part of minimal client package. Such things should go into ServicesUtil\r
         */\r
-       MafftWS, MuscleWS, ClustalWS, ClustalOWS, TcoffeeWS, ProbconsWS, AAConWS, JronnWS, DisemblWS, GlobPlotWS, IUPredWS, RNAalifoldWS;\r
+       MafftWS, MuscleWS, ClustalWS, ClustalOWS, TcoffeeWS, ProbconsWS, AAConWS, JronnWS, DisemblWS, GlobPlotWS, IUPredWS, JpredWS, RNAalifoldWS;\r
 \r
        public static Services getService(String servName) {\r
                servName = servName.trim().toLowerCase();\r
 \r
        public static Services getService(String servName) {\r
                servName = servName.trim().toLowerCase();\r
@@ -59,28 +58,29 @@ public enum Services {
 \r
        public static String toString(Set<Services> services) {\r
                if (services == null || services.isEmpty()) {\r
 \r
        public static String toString(Set<Services> services) {\r
                if (services == null || services.isEmpty()) {\r
-                       return "";\r
+                       return "No known services...\n";\r
                }\r
                String value = "";\r
                }\r
                String value = "";\r
-               String delim = ", ";\r
                for (Services serv : services) {\r
                for (Services serv : services) {\r
-                       value += serv.toString() + delim;\r
+                       if (null != serv) {\r
+                               value += serv + "\n";\r
+                       } else {\r
+                               value += "Unknown Service\n";\r
+                       }\r
                }\r
                }\r
-               value = value.substring(0, value.length() - delim.length());\r
                return value;\r
        }\r
 \r
        Class<? extends JABAService> getServiceType() {\r
                switch (this) {\r
                return value;\r
        }\r
 \r
        Class<? extends JABAService> getServiceType() {\r
                switch (this) {\r
-                       // deliberate leaking\r
                        case AAConWS :\r
                        case JronnWS :\r
                        case DisemblWS :\r
                        case GlobPlotWS :\r
                        case IUPredWS :\r
                        case AAConWS :\r
                        case JronnWS :\r
                        case DisemblWS :\r
                        case GlobPlotWS :\r
                        case IUPredWS :\r
+                       case RNAalifoldWS :\r
                                return SequenceAnnotation.class;\r
                                return SequenceAnnotation.class;\r
-\r
-                               // deliberate leaking\r
+                       case JpredWS :\r
                        case ClustalWS :\r
                        case ClustalOWS :\r
                        case MafftWS :\r
                        case ClustalWS :\r
                        case ClustalOWS :\r
                        case MafftWS :\r
@@ -88,125 +88,252 @@ public enum Services {
                        case ProbconsWS :\r
                        case TcoffeeWS :\r
                                return MsaWS.class;\r
                        case ProbconsWS :\r
                        case TcoffeeWS :\r
                                return MsaWS.class;\r
-                               \r
-                       case RNAalifoldWS :\r
-                               return FoldWS.class;\r
+\r
                        default :\r
                        default :\r
-                               throw new RuntimeException("Unrecognised Web Service Type "\r
-                                               + this + " - Should never happened!");\r
+                               throw new RuntimeException("Unrecognised Web Service Type " + this + " - Should never happen!");\r
                }\r
        }\r
 \r
                }\r
        }\r
 \r
+       \r
+       String getServiceNamespace() {\r
+               switch (this) {\r
+                       case RNAalifoldWS :\r
+                       case AAConWS :\r
+                       case JronnWS :\r
+                       case DisemblWS :\r
+                       case GlobPlotWS :\r
+                       case IUPredWS :\r
+                               return JABAService.V2_SERVICE_NAMESPACE;\r
+                       case ClustalOWS :\r
+                       case JpredWS :\r
+                       case ClustalWS :\r
+                       case MafftWS :\r
+                       case MuscleWS :\r
+                       case ProbconsWS :\r
+                       case TcoffeeWS :\r
+                               return JABAService.SERVICE_NAMESPACE;\r
+                       default :\r
+                               throw new RuntimeException("Unrecognised JABAWS Namespace for service " + this +"!");\r
+               }\r
+       }\r
+       \r
        JABAService getInterface(Service service) {\r
                assert service != null;\r
 \r
        JABAService getInterface(Service service) {\r
                assert service != null;\r
 \r
-               QName portName = new QName(service.getServiceName().getNamespaceURI(),\r
-                               this.toString() + "Port");\r
+               QName portName = new QName(service.getServiceName().getNamespaceURI(), this.toString() + "Port");\r
                return service.getPort(portName, this.getServiceType());\r
        }\r
 \r
        public String getServiceInfo() {\r
                switch (this) {\r
                        case AAConWS :\r
                return service.getPort(portName, this.getServiceType());\r
        }\r
 \r
        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.toString();\r
+                       case ClustalOWS :\r
+                               return CLUSTAL_OMEGA_INFO.toString();\r
+                       case ClustalWS :\r
+                               return CLUSTAL_INFO.toString();\r
+                       case DisemblWS :\r
+                               return DISEMBL_INFO.toString();\r
+                       case GlobPlotWS :\r
+                               return GLOBPLOT_INFO.toString();\r
+                       case IUPredWS :\r
+                               return IUPRED_INFO.toString();\r
+                       case JronnWS :\r
+                               return JRONN_INFO.toString();\r
+                       case MafftWS :\r
+                               return MAFFT_INFO.toString();\r
+                       case MuscleWS :\r
+                               return MUSCLE_INFO.toString();\r
+                       case ProbconsWS :\r
+                               return PROBCONS_INFO.toString();\r
+                       case TcoffeeWS :\r
+                               return TCOFFEE_INFO.toString();\r
+                       case RNAalifoldWS :\r
+                               return RNAALIFOLD_INFO.toString();\r
+                       default :\r
+                               throw new RuntimeException("Unrecognised Web Service Type " + this + " - Should never happen!");\r
+               }\r
+       }\r
+\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
                        case ClustalOWS :\r
-                               return CLUSTAL_OMEGA_INFO;\r
+                               return CLUSTAL_OMEGA_INFO.getReference();\r
                        case ClustalWS :\r
                        case ClustalWS :\r
-                               return CLUSTAL_INFO;\r
+                               return CLUSTAL_INFO.getReference();\r
                        case DisemblWS :\r
                        case DisemblWS :\r
-                               return DISEMBL_INFO;\r
+                               return DISEMBL_INFO.getReference();\r
                        case GlobPlotWS :\r
                        case GlobPlotWS :\r
-                               return GLOBPLOT_INFO;\r
+                               return GLOBPLOT_INFO.getReference();\r
                        case IUPredWS :\r
                        case IUPredWS :\r
-                               return IUPRED_INFO;\r
+                               return IUPRED_INFO.getReference();\r
                        case JronnWS :\r
                        case JronnWS :\r
-                               return JRONN_INFO;\r
+                               return JRONN_INFO.getReference();\r
                        case MafftWS :\r
                        case MafftWS :\r
-                               return MAFFT_INFO;\r
+                               return MAFFT_INFO.getReference();\r
                        case MuscleWS :\r
                        case MuscleWS :\r
-                               return MUSCLE_INFO;\r
+                               return MUSCLE_INFO.getReference();\r
                        case ProbconsWS :\r
                        case ProbconsWS :\r
-                               return PROBCONS_INFO;\r
+                               return PROBCONS_INFO.getReference();\r
                        case TcoffeeWS :\r
                        case TcoffeeWS :\r
-                               return TCOFFEE_INFO;\r
+                               return TCOFFEE_INFO.getReference();\r
                        case RNAalifoldWS :\r
                        case RNAalifoldWS :\r
-                               return RNAALIFOLD_INFO;\r
+                               return RNAALIFOLD_INFO.getReference();\r
                        default :\r
                        default :\r
-                               throw new RuntimeException("Unrecognised Web Service Type "\r
-                                               + this + " - Should never happened!");\r
+                               throw new RuntimeException("Unrecognised Web Service Type " + this + " - Should never happen!");\r
                }\r
        }\r
 \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")\r
-                       .toString();\r
-       public static final String CLUSTAL_INFO = new ServiceInfo(\r
-                       ClustalWS,\r
-                       "Larkin MA, Blackshields G, Brown NP, Chenna R, McGettigan PA, McWilliam H, Valentin F, Wallace IM, Wilm A, Lopez R, Thompson JD, Gibson TJ, Higgins DG.\r\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
-       public static final String CLUSTAL_OMEGA_INFO = new ServiceInfo(\r
-                       ClustalOWS,\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.3", "http://www.compbio.dundee.ac.uk/www-jpred");\r
+       \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/");\r
+\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
                        "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
-       public static final String DISEMBL_INFO = new ServiceInfo(\r
-                       DisemblWS,\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");\r
+\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
                        "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
-       public static final String GLOBPLOT_INFO = new ServiceInfo(\r
-                       GlobPlotWS,\r
-                       "Rune Linding, Robert B. Russell, Victor Neduva and Toby J. Gibson "\r
-                                       + "'GlobPlot: exploring protein sequences for globularity and disorder.' Nucl. Acids Res. (2003) 31 (13): 3701-3708. doi: 10.1093/nar/gkg519\r\n",\r
-                       "2.3", "http://globplot.embl.de/").toString();\r
-       public static final String IUPRED_INFO = new ServiceInfo(\r
-                       IUPredWS,\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/");\r
+\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/");\r
+\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
                        "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
-       public static final String TCOFFEE_INFO = new ServiceInfo(TcoffeeWS,\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/");\r
+\r
+       static ServiceInfo TCOFFEE_INFO = new ServiceInfo(TcoffeeWS,\r
                        "T-Coffee: A novel method for multiple sequence alignments  "\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")\r
-                       .toString();\r
-       public static final String MUSCLE_INFO = new ServiceInfo(\r
-                       MuscleWS,\r
+                       + "Notredame, Higgins, Heringa, JMB, 302 (205-217) 2000",\r
+                       "8.99", "http://tcoffee.crg.cat/apps/tcoffee/index.html");\r
+\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
                        "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
-       public static final String PROBCONS_INFO = new ServiceInfo(\r
-                       ProbconsWS,\r
+                       + "doi:10.1093/nar/gkh340", "3.8.31",\r
+                       "http://www.drive5.com/muscle/");\r
+\r
+       static ServiceInfo PROBCONS_INFO = new ServiceInfo(ProbconsWS,\r
                        "Do, C.B., Mahabhashyam, M.S.P., Brudno, M., and Batzoglou, S. 2005. PROBCONS: "\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
-       public static final String JRONN_INFO = new ServiceInfo(\r
-                       JronnWS,\r
+                       + "Probabilistic Consistency-based Multiple Sequence Alignment. Genome Research 15: 330-340. ",\r
+                       "1.12", "http://probcons.stanford.edu/");\r
+\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
                        "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
-       public static final String MAFFT_INFO = new ServiceInfo(\r
-                       MafftWS,\r
+                       "1.0", "http://www.compbio.dundee.ac.uk/jabaws/");\r
+\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
                        "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
-\r
-       // TODO reference\r
-       public static final String RNAALIFOLD_INFO = new ServiceInfo(\r
-                       RNAalifoldWS,\r
-                       "Reference to come", "2.1.2",\r
-                       "http://www.tbi.univie.ac.at/RNA/").toString();;\r
-                       \r
+                       "6.8.57", "http://mafft.cbrc.jp/alignment/software/");\r
+\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/");\r
+\r
        @XmlAccessorType(XmlAccessType.FIELD)\r
        static class ServiceInfo {\r
                Services service;\r
                String reference;\r
                String version;\r
                String moreinfo;\r
        @XmlAccessorType(XmlAccessType.FIELD)\r
        static class ServiceInfo {\r
                Services service;\r
                String reference;\r
                String version;\r
                String moreinfo;\r
-               final static String jabaws_version = "2.0";\r
+               final static String jabaws_version = "2.5";\r
                final static String line_delimiter = "\n";\r
 \r
                private ServiceInfo() {\r
                final static String line_delimiter = "\n";\r
 \r
                private ServiceInfo() {\r
@@ -222,16 +349,23 @@ public enum Services {
 \r
                @Override\r
                public String toString() {\r
 \r
                @Override\r
                public String toString() {\r
-                       String value = "SERVICE: " + service + " version " + version\r
-                                       + line_delimiter;\r
+                       String value = "SERVICE: " + service + " version " + version + line_delimiter + "\n";\r
                        value += "JABAWS v. " + jabaws_version + line_delimiter;\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
                        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
                System.out.println(MUSCLE_INFO);\r
        }\r
        }\r
 \r
        public static void main(String[] args) {\r
                System.out.println(MUSCLE_INFO);\r
        }\r
-}
\ No newline at end of file
+}\r