001package csheets.ext.share.core; 002 003import java.io.*; 004import java.net.Socket; 005import java.util.*; 006import java.util.logging.*; 007 008/** 009 * Class that implement the client to can receives updates from server 010 * 011 * @author Tiago 012 * 013 */ 014public class ThreadServerReceiving extends Observable implements Runnable { 015 /** server socket */ 016 private Socket sock; 017 /** the observer class */ 018 private Observer observer; 019 /** the cell listener */ 020 private CellNetworkListenerServer listenerServer; 021 022 /** 023 * Creates a new thread for the server receive updates 024 * 025 * @param sock 026 * server socket 027 * @param listenerServer 028 * listener server 029 * @param observer 030 * the observer class 031 */ 032 public ThreadServerReceiving(Socket sock, 033 CellNetworkListenerServer listenerServer, Observer observer) { 034 035 this.sock = sock; 036 this.listenerServer = listenerServer; 037 this.observer = observer; 038 } 039 040 /** 041 * Method to wait from message of server to update client's information 042 * 043 * @param cli 044 * the socket server 045 * @throws Exception 046 * throws if any exception occurs 047 */ 048 private synchronized void receiveUpdates(Socket cli) throws Exception { 049 while (true) { 050 Thread.sleep(100); 051 052 DataInputStream in = new DataInputStream(sock.getInputStream()); 053 if (in.readUTF().equals("send me updated data")) { 054 055 ObjectInputStream inStream = new ObjectInputStream( 056 cli.getInputStream()); 057 CellNetwork cell = (CellNetwork) inStream.readObject(); 058 059 for (int i = 0; i < Server.getInstance().getCells().length; i++) { 060 for (int j = 0; j < Server.getInstance().getCells()[i].length; j++) { 061 if ((Server.getInstance().getCells()[i][j].getAddress() 062 .getColumn() == cell.getColumn()) 063 && (Server.getInstance().getCells()[i][j] 064 .getAddress().getRow() == cell.getRow())) { 065 Server.getInstance().getCells()[i][j] 066 .getSpreadsheet() 067 068 .getCell(cell.getColumn(), cell.getRow()) 069 .removeCellListener(listenerServer); 070 071 Server.getInstance().getCells()[i][j] 072 .getSpreadsheet() 073 074 .getCell(cell.getColumn(), cell.getRow()) 075 .setContent(cell.getContent()); 076 077 Server.getInstance().getCells()[i][j] 078 .getSpreadsheet() 079 080 .getCell(cell.getColumn(), cell.getRow()) 081 .addCellListener(listenerServer); 082 083 Server.getInstance().getCells()[i][j] 084 .setContent(cell.getContent()); 085 listenerServer.setFlag(true); 086 087 } 088 } 089 } 090 091 } 092 093 } 094 095 } 096 097 @Override 098 public void run() { 099 try { 100 addObserver(observer); 101 while (true) { 102 receiveUpdates(sock); 103 } 104 105 } catch (Exception e) { 106 // JOptionPane.showMessageDialog(null, "Connection Error"); 107 Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, 108 null, e); 109 e.printStackTrace(); 110 setChanged(); 111 notifyObservers(); 112 clearChanged(); 113 } 114 } 115}