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}