package com.tlabs.labeltool.gui; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; import java.net.URLDecoder; import java.net.UnknownHostException; import java.nio.charset.Charset; import java.util.Collections; import java.util.Iterator; import java.util.StringTokenizer; import java.util.Vector; import com.tlabs.labeltool.Constants; import com.tlabs.labeltool.Recording; import com.tlabs.labeltool.Util; /** * gets the list of available resordings from the server and displays in the * table. * * @version 1.0 * @author Felix Burkhardt */ public class UpdateFileListThread extends Thread { private String _charEncoding; /** * name of server's host. */ String servername; /** * tmp var to read name and size from server. */ String receivedString; /** * name of recording. */ String fileName; /** * size of recording. */ String fileSize; /** * help bool to know whether name or size is expected. */ boolean expectName = true; /** * input from server. */ DataInputStream in; /** * output to server. Needed to send the mode number. */ DataOutputStream out; /** * to read string from input stream. */ BufferedReader stringReader; /** * to get a connection. */ Socket s; /** * list of recordings. */ Recorder rec; /** * num of port where server listens. */ int portNum; /** * determine whether audio file manager must be updated (new recordings from * outside the system) as well. */ boolean _updateAFM = false; boolean _sortOrderAscending = true, _sorting = false; /** * * @param servername * name of server's host. * @param portNum * num of port where server listens. * @param recordings * list of recordings. */ public UpdateFileListThread(String servername, int portNum, Recorder rec, boolean updateAFM, String charEnc, boolean sorting, boolean sortORderAscending) { this.servername = servername; this.rec = rec; this.portNum = portNum; _updateAFM = updateAFM; _charEncoding = charEnc; _sortOrderAscending = sortORderAscending; _sorting = sorting; } /** * called by thread.start(). */ public void run() { System.out.println("Starte Update"); rec.getRecordings().clear(); // open a connection if (!openConnection(Constants.MODE_SEND_LIST)) { return; } try { out.writeBytes(String.valueOf(_updateAFM) + '\n'); } catch (IOException e) { System.out.println("unable to send data " + e); } // receive file-list stringReader = new BufferedReader(new InputStreamReader(in, Charset.forName(_charEncoding))); Vector<Recording> tmp = new Vector<Recording>(); int ind = 0; try { String version = stringReader.readLine(); rec.setServerVersion(version); System.out.println("server version: " + version); while (!(receivedString = stringReader.readLine()) .equals("finished")) { // System.out.println(receivedString); ind++; StringTokenizer st = new StringTokenizer(receivedString, ";"); String words = "", prediction, recognition = ""; double lab[]; String filePath = st.nextToken(); fileSize = st.nextToken(); String input = st.nextToken(); String tokens[] = Util.stringToArray(input); lab = new double[tokens.length]; for (int i = 0; i < tokens.length; i++) { lab[i] = Double.parseDouble(tokens[i]); } prediction = st.nextToken(); words = URLDecoder.decode(st.nextToken(), _charEncoding); recognition = URLDecoder.decode(st.nextToken(), _charEncoding); Recording r = new Recording(filePath, fileSize, words.trim(), lab, prediction, rec.getParameter("categories"), rec); r.recognition = recognition; if (ind % 10 == 0) { System.out.print("."); } tmp.add(r); } rec.setDataDescription(stringReader.readLine()); System.out.println(); } catch (IOException e) { System.out.println("unable to receive data: " + e); } if (_sorting) { Collections.sort(tmp); if (_sortOrderAscending) { for (int i = tmp.size() - 1; i >= 0; i--) { rec.getRecordings().insertRecording(tmp.elementAt(i)); } } else { for (Recording r : tmp) { rec.getRecordings().insertRecording(r); } } } else { for (Recording r : tmp) { rec.getRecordings().insertRecording(r); } } rec.setNrOfRecordings(); // close connection try { in.close(); out.close(); s.close(); System.out.println("Socket closed"); } catch (IOException e) { System.err.println("problem closing streams and socket: " + e); e.printStackTrace(); } if (rec._table.getRowCount() > 0) { try { rec._table.setRowSelectionInterval(0, 0); } catch (Exception e) { System.err .println("not possible to set: rec.table.setRowSelectionInterval(0, 0) : " + e.getMessage()); } rec._table.requestFocus(); } rec.repaintView(); } /** * opens a connection to the server and sends mode number. */ private boolean openConnection(int modus) { try { s = new Socket(servername, portNum); System.out.println("Verbindung mit: " + s.getInetAddress()); out = new DataOutputStream(s.getOutputStream()); in = new DataInputStream(s.getInputStream()); out.writeInt(modus); return true; } catch (UnknownHostException e) { System.err.println("Don't know about host: " + servername + ", " + e); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to host: " + servername + ", " + e); rec.setMessage("Couldn't get I/O for the connection to host: " + servername + ", " + e); } return false; } }