public void Read(int fileRegister, Semantics semantics, int contentRegister)
        {
            print("Read Command Started for fileRegister=" + fileRegister + ",Semantics=" + semantics + ",ContentRegister= " + contentRegister);
            Metadata md = fileRegisters[fileRegister];

            Server[]             sDTO = md.dataServers;
            DataRequestService[] drs  = new DataRequestService[md.nbDataServers];


            while (sDTO.Length < md.readQuorum)
            {
                try
                {
                    Console.WriteLine("To send the Read request I have DatServers=" + sDTO.Length + " less than the ReadQuorum " + md.readQuorum + ". So I will try to open the file again.");
                    this.Open(md.fileName);
                    md   = fileRegisters[fileRegister];
                    sDTO = md.dataServers;
                    Console.WriteLine("After Open Request the number of dataServers are " + sDTO.Length);
                }
                catch (Exception e)
                {
                }
            }



            int i = 0;

            for (i = 0; i < sDTO.GetLength(0); i++)
            {
                try
                {
                    if (dataServices.ContainsKey(sDTO[i].address))
                    {
                        //do nothing;
                    }
                    else
                    { //Get the proxy and store it in the Hashtable for future.
                        dataServices.Add(sDTO[i].address, (DataRequestService)Activator.GetObject(
                                             typeof(DataRequestService),
                                             sDTO[i].address));
                    }
                    //populate the Array.
                    drs[i] = (DataRequestService)dataServices[sDTO[i].address];
                }
                catch (Exception e)
                {
                }
            }


            if (semantics.Equals(Semantics.DEFAULT))
            {
                int[]     versions = new int[md.nbDataServers];
                int       k = 0; int cnt = 0; int maxVersion; int maxId = 0;
                ArrayList failedDataServers = new ArrayList();
                //Initialize versions
                for (k = 0; k < md.nbDataServers; k++)
                {
                    versions[k] = -3;
                }
                //Try for readquorum number of DataServers.
                for (k = 0; k < md.readQuorum; k++)
                {
                    try {
                        versions[k] = (drs[i].GetVersion(sDTO[k].localFileName));
                        cnt++;
                    }
                    catch (Exception e) {
                        failedDataServers.Add(k);
                        //DataServer is Failed.
                    }
                }
                if (cnt < md.readQuorum)
                {
                    for (k = md.readQuorum; k < md.nbDataServers; k++)
                    {
                        try {
                            versions[k] = (drs[i].GetVersion(sDTO[k].localFileName));
                            cnt++;
                            if (cnt >= md.readQuorum)
                            {
                                break;
                            }
                        }
                        catch (Exception e) {
                            failedDataServers.Add(k);
                            //DataServer is Failed.
                        }
                    }
                    k = 0; int index;
                    while (cnt < md.readQuorum)
                    {
                        index = (int)failedDataServers[k];
                        try {
                            versions[index] = (drs[index].GetVersion(sDTO[index].localFileName));
                            cnt++;
                            failedDataServers.RemoveAt(k);
                        }
                        catch (Exception e) {
                            //DataServer is still failed.
                        }
                        if (failedDataServers.Count != 0)
                        {
                            k = (k + 1) % failedDataServers.Count;
                        }
                    }
                }

                //Get the maximum version
                maxVersion = 0;
                for (k = 0; k < md.nbDataServers; k++)
                {
                    if (versions[k] >= maxVersion)
                    {
                        maxVersion = versions[k];
                        maxId      = k;
                    }
                }

                //Read and store the latest Version
                String fileName = fileRegisters[fileRegister].fileName;

                if (fileDetails.ContainsKey(fileName))
                {
                    if (((Indices)fileDetails[fileName]).getLatestVersionSeen() < maxVersion)
                    {
                        ((Indices)fileDetails[fileName]).setLatestVersionSeen(maxVersion);
                    }
                }

                Data contents = new Data(drs[maxId].Read(sDTO[maxId].localFileName, Semantics.DEFAULT));
                if (contentRegister == -1)
                {
                    dataRegisterForCopy = contents;
                }
                else
                {
                    addContentRegister(contents, contentRegister);
                }
            }

            else//semantics is Monotonic.
            {
                String fileName       = fileRegisters[fileRegister].fileName;
                int    currentVersion = -1;
                if (fileDetails.ContainsKey(fileName))
                {
                    currentVersion = ((Indices)fileDetails[fileName]).getLatestVersionSeen();
                }
                else
                {
                    Console.WriteLine("Version last seen,mcorresponding to fileRegister " + fileRegister + " Was not found in fileDetails HashTable. So returning witout Reading");
                    return;
                }
                int       maxVersion = currentVersion; int maxId = 0; int temp;
                int       k = 0; int cnt = 0; //int responseCount = 0;
                ArrayList retryServers = new ArrayList();
                for (k = 0; k < md.nbDataServers; k++)
                {
                    try {
                        temp = drs[k].GetVersion(sDTO[k].localFileName);
                        if (currentVersion < temp)
                        {
                            if (maxVersion < temp)
                            {
                                maxVersion = temp;
                                maxId      = k;
                                cnt++;
                            }
                            else
                            {
                                cnt++;
                            }
                        }
                        else if (currentVersion == temp && maxVersion == currentVersion)
                        {
                            maxId = k;
                            cnt++;
                        }
                        else if (currentVersion == temp && currentVersion < maxVersion)
                        {
                            cnt++;
                        }

                        else
                        {
                            retryServers.Add(k);
                        }
                    }
                    catch (Exception e) {
                        retryServers.Add(k);
                    }
                }

                if (cnt < md.readQuorum)
                {
                    int index = 0;
                    while (cnt < md.readQuorum)
                    {
                        index = (int)retryServers[k];
                        try {
                            temp = drs[index].GetVersion(sDTO[index].localFileName);
                            if (currentVersion < temp)
                            {
                                if (maxVersion < temp)
                                {
                                    maxVersion = temp;
                                    maxId      = index;
                                    cnt++;
                                }
                                else
                                {
                                    cnt++;
                                }

                                retryServers.RemoveAt(k);
                            }
                            else if (currentVersion == temp && maxVersion == currentVersion)
                            {
                                maxId = index;
                                cnt++;
                                retryServers.RemoveAt(k);
                            }
                            else if (currentVersion == temp && currentVersion < maxVersion)
                            {
                                cnt++;
                                retryServers.RemoveAt(k);
                            }
                        }
                        catch (Exception e) {
                            //DataServer is still failed.
                        }
                        k = (k + 1) % retryServers.Count;
                    }
                }

                //Read and Store the max version
                if (fileDetails.ContainsKey(fileName))
                {
                    ((Indices)fileDetails[fileName]).setLatestVersionSeen(maxVersion);
                }
                Data contents = new Data(drs[maxId].Read(sDTO[maxId].localFileName, Semantics.MONOTONIC));
                if (contentRegister == -1)
                {
                    dataRegisterForCopy = contents;
                }
                else
                {
                    addContentRegister(contents, contentRegister);
                }
            }
            print("Read Command execution complete for fileRegister=" + fileRegister + ",Semantics=" + semantics + ",ContentRegister= " + contentRegister);
        }