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}