001/**
002 *                    BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence.  This should
006 * be distributed with the code.  If you do not have a copy,
007 * see:
008 *
009 *      http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors.  These should be listed in @author doc comments.
013 *
014 * For more information on the BioJava project and its aims,
015 * or to join the biojava-l mailing list, visit the home page
016 * at:
017 *
018 *      http://www.biojava.org/
019 *
020 * Created on Aug 30, 2011
021 * Created by Andreas Prlic
022 *
023 * @since 3.0.2
024 */
025package org.biojava.nbio.structure.scop;
026
027import org.biojava.nbio.structure.align.client.JFatCatClient;
028import org.biojava.nbio.structure.align.util.HTTPConnectionTools;
029import org.biojava.nbio.structure.scop.server.ScopDescriptions;
030import org.biojava.nbio.structure.scop.server.ScopDomains;
031import org.biojava.nbio.structure.scop.server.ScopNodes;
032import org.biojava.nbio.structure.scop.server.XMLUtil;
033
034import java.io.IOException;
035import java.io.InputStream;
036import java.net.URL;
037import java.util.List;
038
039
040/** A class that fetches information about SCOP from a remote data-source. It requires port 80 to open for HTTP connection.
041 *
042 * @author Andreas Prlic
043 *
044 */
045public class RemoteScopInstallation implements ScopDatabase {
046
047        public static final String DEFAULT_SERVER = "http://source.rcsb.org/jfatcatserver/domains/";
048
049        String server = DEFAULT_SERVER;
050
051        private String version = null;
052
053        public static void main(String[] args){
054
055                ScopDatabase scop = new RemoteScopInstallation();
056                ScopFactory.setScopDatabase(scop);
057
058                //System.out.println(scop.getByCategory(ScopCategory.Superfamily));
059
060                System.out.println(scop.getDomainsForPDB("4HHB"));
061        }
062
063
064        public String getServer() {
065                return server;
066        }
067
068        public void setServer(String server) {
069                this.server = server;
070        }
071
072        @Override
073        public List<ScopDescription> getByCategory(ScopCategory category) {
074                List<ScopDescription> results = null;
075                try {
076                        URL u = new URL(server + "getByCategory?category="+category+"&version="+getScopVersion());
077                        InputStream response = HTTPConnectionTools.getInputStream(u);
078                        String xml = JFatCatClient.convertStreamToString(response);
079
080                        if(! xml.trim().isEmpty()) {
081                                ScopDescriptions container = ScopDescriptions.fromXML(xml);
082                                results = container.getScopDescription();
083                        }
084                } catch (IOException e) {
085                        throw new RuntimeException("Unable to reach "+ server + "getByCategory?category="+category+"&version="+getScopVersion(), e);
086                }
087                return results;
088        }
089
090        @Override
091        public List<ScopDescription> filterByClassificationId(String query) {
092                List<ScopDescription> results = null;
093                try {
094                        URL u = new URL(server + "filterByClassificationId?query="+query+"&version="+getScopVersion());
095                        InputStream response = HTTPConnectionTools.getInputStream(u);
096                        String xml = JFatCatClient.convertStreamToString(response);
097
098                        if(! xml.trim().isEmpty()) {
099                                ScopDescriptions container = ScopDescriptions.fromXML(xml);
100                                results = container.getScopDescription();
101                        }
102                } catch (Exception e){
103                        throw new RuntimeException("Unable to reach "+ server + "filterByClassificationId?query="+query+"&version="+getScopVersion(), e);
104                }
105                return results;
106        }
107
108        @Override
109        public List<ScopNode> getTree(ScopDomain domain) {
110                List<ScopNode> results = null;
111                try {
112                        URL u = new URL(server + "getTree?scopId="+domain.getScopId()+"&version="+getScopVersion());
113                        InputStream response = HTTPConnectionTools.getInputStream(u);
114                        String xml = JFatCatClient.convertStreamToString(response);
115
116                        if(! xml.trim().isEmpty()) {
117                                ScopNodes container = ScopNodes.fromXML(xml);
118                                results = container.getScopNode();
119                        }
120                } catch (Exception e){
121                        throw new RuntimeException("Unable to reach "+ server + "getTree?scopId="+domain.getScopId()+"&version="+getScopVersion(), e);
122                }
123                return results;
124        }
125
126        @Override
127        public List<ScopDomain> filterByDomainName(String query) {
128                query = query.trim();
129                List<ScopDomain> results = null;
130                try {
131                        URL u = new URL(server + "filterByDomainName?query="+query+"&version="+getScopVersion());
132                        //System.out.println(u);
133                        InputStream response = HTTPConnectionTools.getInputStream(u);
134                        String xml = JFatCatClient.convertStreamToString(response);
135
136                        if(! xml.trim().isEmpty()) {
137                                ScopDomains container = ScopDomains.fromXML(xml);
138                                results = container.getScopDomain();
139                        }
140                } catch (Exception e){
141                        throw new RuntimeException("Unable to reach "+ server + "filterByDomainName?query="+query+"&version="+getScopVersion(), e);
142                }
143                return results;
144        }
145
146        @Override
147        public List<ScopDescription> filterByDescription(String query) {
148                List<ScopDescription> results = null;
149                try {
150                        URL u = new URL(server + "filterByDescription?query="+query+"&version="+getScopVersion());
151                        InputStream response = HTTPConnectionTools.getInputStream(u);
152                        String xml = JFatCatClient.convertStreamToString(response);
153
154                        if(! xml.trim().isEmpty()) {
155                                ScopDescriptions container = ScopDescriptions.fromXML(xml);
156                                results = container.getScopDescription();
157                        }
158                } catch (Exception e){
159                        throw new RuntimeException("Unable to reach "+ server + "filterByDescription?query="+query+"&version="+getScopVersion(), e);
160                }
161                return results;
162        }
163
164        @Override
165        public ScopDescription getScopDescriptionBySunid(int sunid) {
166
167                ScopDescription desc = null;
168
169
170                try {
171
172                        URL u = new URL(server + "getScopDescriptionBySunid?sunid="+sunid+"&version="+getScopVersion());
173                        InputStream response = HTTPConnectionTools.getInputStream(u);
174                        String xml = JFatCatClient.convertStreamToString(response);
175
176                        if(! xml.trim().isEmpty()) {
177                                desc = XMLUtil.getScopDescriptionFromXML(xml);
178                        }
179
180                } catch (Exception e){
181                        throw new RuntimeException("Unable to reach "+ server + "getScopDescriptionBySunid?sunid="+sunid+"&version="+getScopVersion(), e);
182                }
183                return desc;
184        }
185
186        @Override
187        public List<ScopDomain> getDomainsForPDB(String pdbId) {
188                List<ScopDomain> results = null;
189                try {
190                        URL u = new URL(server + "getDomainsForPDB?pdbId="+pdbId+"&version="+getScopVersion());
191                        InputStream response = HTTPConnectionTools.getInputStream(u);
192                        String xml = JFatCatClient.convertStreamToString(response);
193
194                        if( !xml.trim().isEmpty()) {
195                                ScopDomains container = ScopDomains.fromXML(xml);
196                                results = container.getScopDomain();
197                        }
198                } catch (Exception e){
199                        throw new RuntimeException("Unable to reach "+ server + "getDomainsForPDB?pdbId="+pdbId+"&version="+getScopVersion(), e);
200                }
201                return results;
202        }
203
204        private ScopDomain requestRemoteDomainByScopID(String scopId)
205                        throws IOException{
206                scopId = scopId.trim();
207                URL u = new URL(server + "getDomainByScopID?scopId="+scopId+"&version="+getScopVersion());
208                InputStream response = HTTPConnectionTools.getInputStream(u);
209                String xml = JFatCatClient.convertStreamToString(response);
210
211                if( !xml.trim().isEmpty()) {
212                        return XMLUtil.getScopDomainFromXML(xml);
213                }
214                return null;
215        }
216
217        @Override
218        public ScopDomain getDomainByScopID(String scopId) {
219                try {
220                        return requestRemoteDomainByScopID(scopId);
221                } catch (Exception e){
222                        throw new RuntimeException("Unable to reach "+ server + "getDomainByScopID?scopId="+scopId+"&version="+getScopVersion(), e);
223                }
224        }
225
226        @Override
227        public ScopNode getScopNode(int sunid) {
228                ScopNode desc = null;
229                try {
230                        URL u = new URL(server + "getScopNode?sunid="+sunid+"&version="+getScopVersion());
231                        InputStream response = HTTPConnectionTools.getInputStream(u);
232                        String xml = JFatCatClient.convertStreamToString(response);
233
234                        if( !xml.trim().isEmpty()) {
235                                desc = XMLUtil.getScopNodeFromXML(xml);
236                        }
237                } catch (Exception e){
238                        throw new RuntimeException("Unable to reach "+ server + "getScopNode?sunid="+sunid+"&version="+getScopVersion(), e);
239                }
240                return desc;
241        }
242
243        @Override
244        public String getScopVersion() {
245                // If no version is set, request the default version from the website
246                if( version == null) {
247                        try {
248                                URL u = new URL(server + "getScopVersion");
249                                InputStream response = HTTPConnectionTools.getInputStream(u);
250                                version = JFatCatClient.convertStreamToString(response);
251                                if( version != null)
252                                        version = version.trim();
253
254                        } catch (Exception e){
255                                throw new RuntimeException("Unable to reach "+ server + "getScopVersion", e);
256                        }
257                }
258                return version;
259        }
260
261        @Override
262        public void setScopVersion(String version) {
263                this.version = version;
264        }
265
266        @Override
267        public List<ScopDomain> getScopDomainsBySunid(Integer sunid) {
268                List<ScopDomain> results = null;
269                try {
270                        URL u = new URL(server + "getScopDomainsBySunid?sunid="+sunid+"&version="+getScopVersion());
271                        InputStream response = HTTPConnectionTools.getInputStream(u);
272                        String xml = JFatCatClient.convertStreamToString(response);
273
274                        if( !xml.trim().isEmpty()) {
275                                ScopDomains container = ScopDomains.fromXML(xml);
276                                results = container.getScopDomain();
277                        }
278                } catch (Exception e){
279                        throw new RuntimeException("Unable to reach "+ server + "getScopDomainsBySunid?sunid="+sunid+"&version="+getScopVersion(), e);
280                }
281                return results;
282        }
283
284
285        @Override
286        public List<String> getComments(int sunid) {
287                List<String> results = null;
288                try {
289                        URL u = new URL(server + "getComments?sunid="+sunid+"&version="+getScopVersion());
290                        InputStream response = HTTPConnectionTools.getInputStream(u);
291                        String xml = JFatCatClient.convertStreamToString(response);
292
293                        if( !xml.trim().isEmpty()) {
294                                results = XMLUtil.getCommentsFromXML(xml);
295                        }
296                } catch (Exception e){
297                        throw new RuntimeException("Unable to reach "+ server + "getComments?sunid="+sunid+"&version="+getScopVersion(), e);
298                }
299                return results;
300        }
301
302}