001package csheets.ext.share.core; 002 003import java.io.*; 004import java.net.Socket; 005import java.util.*; 006import java.util.logging.*; 007 008import csheets.core.Cell; 009 010/** 011 * Class that implement the client to can receives updates from server 012 * 013 * @author Tiago 014 * 015 */ 016public class ThreadClient extends Observable implements Runnable { 017 /** the cells we will pass throw network */ 018 private Cell cellStart; 019 /** server socket */ 020 private Socket sock; 021 /** the observer class */ 022 private Observer observer; 023 /** CellNetowrkListenerClient's object */ 024 private CellNetworkListenerClient listenerClient; 025 026 /** 027 * ThreadClient's builder 028 * 029 * @param cellStart 030 * cell to start writing (cell selected by user when he decide to 031 * receive share 032 * @param sock 033 * socket to communicate with server 034 * @param listener 035 * listener to client's cells 036 * @param observer 037 * observer 038 */ 039 public ThreadClient(Cell cellStart, Socket sock, 040 CellNetworkListenerClient listener, Observer observer) { 041 this.cellStart = cellStart; 042 this.sock = sock; 043 this.listenerClient = listener; 044 this.observer = observer; 045 } 046 047 /** 048 * Method to wait from message of server to update client's information 049 * 050 * @param cellStart 051 * cell to start writing (cell selected by user when he decide to 052 * receive share 053 * @param cli 054 * socket to communicate with server 055 * @throws Exception 056 */ 057 private synchronized void receiveUpdates(Cell cellStart, Socket cli) 058 throws Exception { 059 while (true) { 060 Thread.sleep(100); 061 boolean isCell = true; 062 int cellStartRow = cellStart.getAddress().getRow(); 063 int cellStartColumn = cellStart.getAddress().getColumn(); 064 065 DataInputStream in = new DataInputStream(sock.getInputStream()); 066 067 if (in.readUTF().equals("server- send me updated data")) { 068 listenerClient.setFlag(false); 069 070 while (isCell) { 071 if (listenerClient.getFlag() == false) { 072 ObjectInputStream inStream = new ObjectInputStream( 073 cli.getInputStream()); 074 CellNetwork cell = (CellNetwork) inStream.readObject(); 075 if (cell.isCell()) { 076 077 this.cellStart 078 .getSpreadsheet() 079 .getCell( 080 cellStartColumn + cell.getColumn(), 081 cellStartRow + cell.getRow()) 082 .removeCellListener(listenerClient); 083 this.cellStart 084 .getSpreadsheet() 085 .getCell( 086 cellStartColumn + cell.getColumn(), 087 cellStartRow + cell.getRow()) 088 .setContent(cell.getContent()); 089 090 this.cellStart 091 .getSpreadsheet() 092 .getCell( 093 cellStartColumn + cell.getColumn(), 094 cellStartRow + cell.getRow()) 095 .addCellListener(listenerClient); 096 listenerClient.setFlag(false); 097 098 } else { 099 isCell = false; 100 } 101 } 102 } 103 } 104 } 105 106 } 107 108 /** 109 * Running thread 110 */ 111 @Override 112 public void run() { 113 try { 114 addObserver(observer); 115 while (true) { 116 receiveUpdates(cellStart, sock); 117 } 118 119 } catch (Exception e) { 120 121 Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, 122 null, e); 123 setChanged(); 124 notifyObservers(); 125 clearChanged(); 126 } 127 } 128}