private boolean readRequest(Request request) {
        String resource = request.resource;

        // Presumption : resource exists.
        // try all sites that holds the key.
        // There should be at least one site that holds this key.
        for (Site site : sitesAvaliable.get(resource)) {

            // check if the site is running
            if (!site.isRunning())
                continue;

            // check if the resource on the site is available
            if (site.isRecovering(resource))
                continue;

            // Check if there is conflict
            Set<String> conflicts = site.checkConflict(request);

            // If there is conflict.
            // Do wait die
            if (conflicts.size() > 0) {
                System.out
                        .print("warning: There is conflict with current lockers. ");

                // Check wait die
                String tempS = needAbort(request.transaction, conflicts);

                if (tempS == null) {
                    System.out
                            .println("["
                                    + request.transaction
                                    + "] is going into the wail list. Current transactions holding locks : "
                                    + conflicts.toString());
                    this.waitingList.add(request);
                } else {
                    System.out.println("[" + request.transaction
                            + "] is aborted because it is conflict with ["
                            + tempS + "]");
                    this.abortRequest(new Request(null, request.transaction,
                            RequestType.ABORT, null));
                }
                return false;
            }

            // coming here means no conflict
            System.out.println(site.exeRequest(request));

            // add the current transaction to the visitor of the site
            // [this.visitingTrans.get(site)] is the visitor Set of the site
            this.visitingTrans.get(site).add(request.transaction);

            // Presumption : transaction exists, transaction running
            // add the current site to the visited of the transaction
            // [this.transInfo.get(request.transaction)] is the transaction
            // Entity of the transaction
            // [].visitedSites is the visited sites Set of the transaction.
            this.transInfo.get(request.transaction).visitedSites.add(site);
            return true;
        }

        // if reaching here it means there is no running sites that holds the
        // request

        System.out
                .println("["
                        + request.transaction
                        + "] is abourted because there is no site have avaliable data currently");
        // this.transInfo.get(request.transaction).status = tranStatus.Waiting;
        // this.waitingList.add(request);
        this.abortRequest(new Request(null, request.transaction,
                RequestType.ABORT, null));
        return false;
    }