001    package org.broadinstitute.genee.client;
002    
003    import java.io.IOException;
004    import java.io.InputStream;
005    import java.io.OutputStream;
006    import java.io.OutputStreamWriter;
007    import java.io.PrintWriter;
008    import java.text.NumberFormat;
009    
010    import org.apache.http.Header;
011    import org.apache.http.HttpEntity;
012    import org.apache.http.HttpResponse;
013    import org.apache.http.client.HttpClient;
014    import org.apache.http.client.methods.HttpGet;
015    import org.apache.http.client.methods.HttpPost;
016    import org.apache.http.entity.mime.MultipartEntity;
017    import org.apache.http.entity.mime.content.AbstractContentBody;
018    import org.apache.http.entity.mime.content.StringBody;
019    import org.apache.http.impl.client.DefaultHttpClient;
020    import org.apache.http.util.EntityUtils;
021    import org.broadinstitute.genee.io.matrix.gct.GctDatasetWriter13;
022    import org.broadinstitute.genee.io.matrix.gct.GctReader;
023    import org.broadinstitute.genee.io.util.StringConverter;
024    import org.broadinstitute.genee.matrix.Dataset;
025    
026    /**
027     * 
028     * Class for interacting with GENE-E.
029     * 
030     */
031    public class GeneeClient {
032    
033        private String server;
034        private int port;
035        private String format = "gct";
036        static {
037            System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.Jdk14Logger");
038        }
039    
040        /**
041         * Constructs a client to interact with GENE-E on localhost:9998.
042         * 
043         */
044        public GeneeClient() {
045            this("localhost", 9998);
046        }
047    
048        /**
049         * Constructs a client to interact with GENE-E.
050         * 
051         * @param server
052         *            The server to connect to
053         * @param port
054         *            The port to connect to
055         */
056        public GeneeClient(String server, int port) {
057            this.server = server;
058            this.port = port;
059        }
060    
061        /**
062         * Views the given dataset in GENE-E.
063         * 
064         * @param dataset
065         *            The dataset to view
066         * @throws IOException
067         *             If an error occurs
068         */
069        public void toGenee(Dataset dataset) throws IOException {
070            HttpClient httpclient = new DefaultHttpClient();
071    
072            try {
073                HttpPost post = new HttpPost("http://" + server + ":" + port + "/api/to");
074                final Dataset _dataset = dataset;
075                MultipartEntity reqEntity = new MultipartEntity();
076                reqEntity.addPart("fileData", new AbstractContentBody(format) {
077    
078                    @Override
079                    public String getFilename() {
080                        return "fileData";
081                    }
082    
083                    @Override
084                    public void writeTo(OutputStream os) throws IOException {
085                        PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
086                        final NumberFormat nf = NumberFormat.getInstance();
087                        nf.setMaximumFractionDigits(2);
088                        GctDatasetWriter13 writer = new GctDatasetWriter13(new StringConverter() {
089    
090                            @Override
091                            public String toString(Object value) {
092                                if (value instanceof Float) {
093                                    return nf.format(((Float) value).floatValue());
094                                }
095                                return String.valueOf(value);
096                            }
097    
098                            @Override
099                            public String format(float value) {
100                                return nf.format(value);
101                            }
102                        });
103                        writer.write(_dataset, pw);
104                        pw.flush();
105                    }
106    
107                    @Override
108                    public String getCharset() {
109                        return null;
110                    }
111    
112                    @Override
113                    public long getContentLength() {
114                        return -1;
115                    }
116    
117                    @Override
118                    public String getTransferEncoding() {
119                        return "binary";
120                    }
121                });
122    
123                reqEntity.addPart("fileType", new StringBody(format));
124                reqEntity.addPart("fileName", new StringBody(dataset.getName()));
125                post.setEntity(reqEntity);
126                HttpResponse response = httpclient.execute(post);
127                HttpEntity resEntity = response.getEntity();
128                EntityUtils.consume(resEntity);
129            } finally {
130                httpclient.getConnectionManager().shutdown();
131            }
132        }
133    
134        /**
135         * Returns the selection from GENE-E. If no rows or columns are selected,
136         * the full dataset is returned.
137         * 
138         * @return The dataset from GENE-E
139         * @throws IOException
140         *             If an error occurs
141         */
142        public Dataset fromGenee() throws IOException {
143            HttpClient httpclient = new DefaultHttpClient();
144            try {
145                HttpGet get = new HttpGet("http://" + server + ":" + port + "/api/from?fileType=" + format);
146                HttpResponse response = httpclient.execute(get);
147                HttpEntity resEntity = response.getEntity();
148                Header name = response.getFirstHeader("filename");
149                InputStream is = resEntity.getContent();
150                GctReader reader = new GctReader();
151                Dataset dataset = reader.read(name != null ? name.getValue() : "GENE-E", is);
152                is.close();
153                return dataset;
154            } finally {
155                httpclient.getConnectionManager().shutdown();
156    
157            }
158    
159        }
160    
161    }