Search in sources :

Example 1 with Stats

use of nl.uva.cs.lobcder.rest.wrappers.Stats in project lobcder by skoulouzis.

the class VPDRI method replicate.

@Override
public void replicate(PDRI source) throws IOException {
    try {
        VRL sourceVRL = new VRL(source.getURI());
        String sourceScheme = sourceVRL.getScheme();
        String desteScheme = vrl.getScheme();
        Logger.getLogger(VPDRI.class.getName()).log(Level.INFO, "Start replicating {0} to {1}", new Object[] { source.getURI(), getURI() });
        double start = System.currentTimeMillis();
        if (!vfsClient.existsDir(vrl.getParent())) {
            VDir remoteDir = vfsClient.mkdirs(vrl.getParent(), true);
        }
        if (desteScheme.equals("swift") && sourceScheme.equals("file") || desteScheme.startsWith("webdav") && sourceScheme.equals("file")) {
            upload(source);
        } else {
            VFile destFile = getVfsClient().createFile(vrl, true);
            VFile sourceFile = getVfsClient().openFile(sourceVRL);
            getVfsClient().copy(sourceFile, destFile);
        }
        // putData(source.getData());
        double elapsed = System.currentTimeMillis() - start;
        double speed = ((source.getLength() * 8.0) * 1000.0) / (elapsed * 1000.0);
        Stats stats = new Stats();
        stats.setSource(source.getHost());
        stats.setDestination(getHost());
        stats.setSpeed(speed);
        stats.setSize(getLength());
        try {
            setSpeed(stats);
        } catch (JAXBException ex) {
            Logger.getLogger(VPDRI.class.getName()).log(Level.WARNING, null, ex);
        }
        String msg = "Source: " + source.getHost() + " Destination: " + vrl.getScheme() + "://" + getHost() + " Replication_Speed: " + speed + " Kbites/sec Repl_Size: " + (getLength()) + " bytes";
        Logger.getLogger(VPDRI.class.getName()).log(Level.INFO, msg);
    // getAsyncDelete(getVfsClient(), vrl).run();
    } catch (VlException ex) {
        throw new IOException(ex);
    }
}
Also used : VRL(nl.uva.vlet.vrl.VRL) JAXBException(javax.xml.bind.JAXBException) Stats(nl.uva.cs.lobcder.rest.wrappers.Stats) VlException(nl.uva.vlet.exception.VlException)

Example 2 with Stats

use of nl.uva.cs.lobcder.rest.wrappers.Stats in project lobcder by skoulouzis.

the class Archive method copyStream.

private void copyStream(List<PDRIDescr> pdriDescrList, OutputStream os) {
    double start = System.currentTimeMillis();
    for (PDRIDescr pdriDescr : pdriDescrList) {
        try {
            PDRI pdri = PDRIFactory.getFactory().createInstance(pdriDescr, false);
            long total;
            try (InputStream in = pdri.getData()) {
                byte[] copyBuffer = new byte[Constants.BUF_SIZE];
                int len;
                total = 0;
                while ((len = in.read(copyBuffer)) != -1) {
                    os.write(copyBuffer, 0, len);
                    total += len;
                }
            }
            double elapsed = System.currentTimeMillis() - start;
            double speed = ((total * 8.0) * 1000.0) / (elapsed * 1000.0);
            Stats stats = new Stats();
            stats.setSource(pdri.getHost());
            stats.setDestination(request.getRemoteAddr());
            stats.setSpeed(speed);
            stats.setSize(total);
            String msg = "Source: " + stats.getSource() + " Destination: " + stats.getDestination() + " Tx_Speed: " + speed + " Kbites/sec Tx_Size: " + total + " bytes";
            try {
                if (!pdri.isCahce()) {
                    getCatalogue().setSpeed(stats);
                }
            } catch (SQLException ex) {
                Logger.getLogger(Archive.class.getName()).log(Level.SEVERE, null, ex);
            }
            Logger.getLogger(Archive.class.getName()).log(Level.INFO, msg);
            return;
        } catch (Throwable th) {
            Logger.getLogger(Archive.class.getName()).log(Level.SEVERE, null, th);
        }
    }
}
Also used : SQLException(java.sql.SQLException) InputStream(java.io.InputStream) PDRIDescr(nl.uva.cs.lobcder.resources.PDRIDescr) Stats(nl.uva.cs.lobcder.rest.wrappers.Stats) PDRI(nl.uva.cs.lobcder.resources.PDRI)

Example 3 with Stats

use of nl.uva.cs.lobcder.rest.wrappers.Stats in project lobcder by skoulouzis.

the class WebDataDirResource method createNew.

@Override
public Resource createNew(String newName, InputStream inputStream, Long length, String contentType) throws IOException, ConflictException, NotAuthorizedException, BadRequestException, InternalError {
    Logger.getLogger(WebDataDirResource.class.getName()).log(Level.FINEST, "createNew. for {0}\n\t newName:\t{1}\n\t length:\t{2}\n\t contentType:\t{3}", new Object[] { getPath(), newName, length, contentType });
    LogicalData fileLogicalData;
    // List<PDRIDescr> pdriDescrList;
    WebDataFileResource resource;
    PDRI pdri;
    double start = System.currentTimeMillis();
    try (Connection connection = getCatalogue().getConnection()) {
        try {
            // Long uid = getCatalogue().getLogicalDataUidByParentRefAndName(getLogicalData().getUid(), newName, connection);
            Path newPath = Path.path(getPath(), newName);
            fileLogicalData = getCatalogue().getLogicalDataByPath(newPath, connection);
            if (contentType == null || contentType.equals("application/octet-stream")) {
                contentType = mimeTypeMap.get(FilenameUtils.getExtension(newName));
            }
            if (fileLogicalData != null) {
                // Resource exists, update
                // throw new ConflictException(this, newName);
                Permissions p = getCatalogue().getPermissions(fileLogicalData.getUid(), fileLogicalData.getOwner(), connection);
                if (!getPrincipal().canWrite(p)) {
                    throw new NotAuthorizedException(this);
                }
                fileLogicalData.setLength(length);
                fileLogicalData.setModifiedDate(System.currentTimeMillis());
                fileLogicalData.setLastAccessDate(fileLogicalData.getModifiedDate());
                if (contentType == null) {
                    contentType = mimeTypeMap.get(FilenameUtils.getExtension(newName));
                }
                fileLogicalData.addContentType(contentType);
                resource = new WebDataFileResource(fileLogicalData, Path.path(getPath(), newName), getCatalogue(), authList);
                // LockToken tocken = resource.getCurrentLock();
                // System.err.println("tokenId: "+tocken.tokenId+" lockedByUser: "+tocken.info.lockedByUser+" timeout: "+tocken.timeout.toString()+" getOtherSeconds: "+tocken.timeout.getOtherSeconds()+" getSeconds: "+tocken.timeout.getSeconds());
                // if (tocken != null) {
                // if (tocken.getFrom().after(new Date(System.currentTimeMillis()))) {
                // throw new ConflictException(resource, "The resource is locked");
                // }
                // }
                // Create new
                pdri = createPDRI(fileLogicalData.getLength(), newName, connection);
                pdri.setLength(length);
                pdri.putData(inputStream);
                fileLogicalData = getCatalogue().updateLogicalDataAndPdri(fileLogicalData, pdri, connection);
                // fileLogicalData = inheritProperties(fileLogicalData, connection);
                connection.commit();
                connection.close();
            // String md5 = pdri.getStringChecksum();
            // if (md5 != null) {
            // fileLogicalData.setChecksum(md5);
            // }
            // return new WebDataFileResource(fileLogicalData, Path.path(getPath(), newName), getCatalogue(), authList);
            } else {
                // Resource does not exists, create a new one
                // new need write prmissions for current collection
                fileLogicalData = new LogicalData();
                fileLogicalData.setName(newName);
                fileLogicalData.setParentRef(getLogicalData().getUid());
                fileLogicalData.setType(Constants.LOGICAL_FILE);
                fileLogicalData.setOwner(getPrincipal().getUserId());
                fileLogicalData.setLength(length);
                fileLogicalData.setCreateDate(System.currentTimeMillis());
                fileLogicalData.setModifiedDate(System.currentTimeMillis());
                fileLogicalData.setLastAccessDate(System.currentTimeMillis());
                fileLogicalData.setTtlSec(getLogicalData().getTtlSec());
                fileLogicalData.addContentType(contentType);
                pdri = createPDRI(length, newName, connection);
                pdri.setLength(length);
                pdri.putData(inputStream);
                // String md5 = pdri.getStringChecksum();
                // if (md5 != null) {
                // fileLogicalData.setChecksum(md5);
                // }
                fileLogicalData = getCatalogue().associateLogicalDataAndPdri(fileLogicalData, pdri, connection);
                getCatalogue().setPermissions(fileLogicalData.getUid(), new Permissions(getPrincipal(), getPermissions()), connection);
                // fileLogicalData = inheritProperties(fileLogicalData, connection);
                getCatalogue().setPreferencesOn(fileLogicalData.getUid(), getLogicalData().getUid(), connection);
                List<String> pref = getLogicalData().getDataLocationPreferences();
                fileLogicalData.setDataLocationPreferences(pref);
                connection.commit();
                connection.close();
                resource = new WebDataFileResource(fileLogicalData, Path.path(getPath(), newName), getCatalogue(), authList);
            // return new WebDataFileResource(fileLogicalData, Path.path(getPath(), newName), getCatalogue(), authList);
            }
        } catch (NoSuchAlgorithmException ex) {
            if (connection != null && !connection.isClosed()) {
                connection.rollback();
                connection.close();
            }
            Logger.getLogger(WebDataDirResource.class.getName()).log(Level.SEVERE, null, ex);
            throw new InternalError(ex.getMessage());
        } catch (SQLException e) {
            Logger.getLogger(WebDataDirResource.class.getName()).log(Level.SEVERE, null, e);
            if (connection != null && !connection.isClosed()) {
                connection.rollback();
                connection.close();
            }
            throw new BadRequestException(this, e.getMessage());
        }
    } catch (SQLException | IOException e1) {
        Logger.getLogger(WebDataDirResource.class.getName()).log(Level.SEVERE, null, e1);
        throw new BadRequestException(this, e1.getMessage());
    // throw new InternalError(e1.getMessage());
    }
    double elapsed = System.currentTimeMillis() - start;
    double speed = ((resource.getLogicalData().getLength() * 8.0) * 1000.0) / (elapsed * 1000.0);
    String msg = null;
    try {
        Stats stats = new Stats();
        stats.setSource(fromAddress);
        stats.setDestination(pdri.getHost());
        stats.setSpeed(speed);
        stats.setSize(resource.getLogicalData().getLength());
        if (!pdri.isCahce()) {
            getCatalogue().setSpeed(stats);
        }
        msg = "Source: " + fromAddress + " Destination: " + new URI(pdri.getURI()).getScheme() + "://" + pdri.getHost() + " Rx_Speed: " + speed + " Kbites/sec Rx_Size: " + (resource.getLogicalData().getLength()) + " bytes Elapsed_Time: " + elapsed + " ms";
    } catch (URISyntaxException | SQLException ex) {
        Logger.getLogger(WebDataDirResource.class.getName()).log(Level.SEVERE, null, ex);
    }
    Logger.getLogger(WebDataDirResource.class.getName()).log(Level.INFO, msg);
    return resource;
}
Also used : Path(io.milton.common.Path) SQLException(java.sql.SQLException) Connection(java.sql.Connection) NotAuthorizedException(io.milton.http.exceptions.NotAuthorizedException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) URISyntaxException(java.net.URISyntaxException) URI(java.net.URI) PDRI(nl.uva.cs.lobcder.resources.PDRI) LogicalData(nl.uva.cs.lobcder.resources.LogicalData) Permissions(nl.uva.cs.lobcder.auth.Permissions) Stats(nl.uva.cs.lobcder.rest.wrappers.Stats) BadRequestException(io.milton.http.exceptions.BadRequestException)

Example 4 with Stats

use of nl.uva.cs.lobcder.rest.wrappers.Stats in project lobcder by skoulouzis.

the class WorkerServlet method processRequest.

/**
 * Process the actual request.
 *
 * @param request The request to be processed.
 * @param response The response to be created.
 * @param content Whether the request body should be written (GET) or not
 * (HEAD).
 * @throws IOException If something fails at I/O level.
 */
private void processRequest(HttpServletRequest request, HttpServletResponse response, boolean content) throws IOException, InterruptedException, URISyntaxException, VlException, JAXBException {
    long startTime = System.currentTimeMillis();
    // Get requested file by path info.
    String requestedFile = request.getPathInfo();
    // Check if file is actually supplied to the request URL.
    PDRI pdri = null;
    if (requestedFile == null || requestedFile.split("/").length < 2) {
        // Do your thing if the file is not supplied to the request URL.
        // Throw an exception, or send 404, or show default/warning page, or just ignore it.
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }
    Path pathAndToken = Path.path(requestedFile);
    // token = pathAndToken.getName();
    fileUID = pathAndToken.getParent().toString().replaceAll("/", "");
    // Logger.getLogger(WorkerServlet.class.getName()).log(Level.FINE, "token: {0} fileUID: {1}", new Object[]{token, fileUID});
    pdri = cat.getPDRI(fileUID);
    fileLogicalName = cat.getLogicalDataWrapped(fileUID).getLogicalData().getName();
    // Check if file actually exists in filesystem.
    if (pdri == null) {
        // Do your thing if the file appears to be non-existing.
        // Throw an exception, or send 404, or show default/warning page, or just ignore it.
        response.sendError(HttpServletResponse.SC_NOT_FOUND);
        return;
    }
    // Prepare some variables. The ETag is an unique identifier of the file.
    long length = pdri.getLength();
    LogicalDataWrapped ldw = Catalogue.logicalDataCache.get(fileUID);
    long lastModified;
    if (ldw != null) {
        LogicalData ld = ldw.getLogicalData();
        lastModified = ld.getModifiedDate();
    } else {
        lastModified = System.currentTimeMillis();
    }
    String eTag = fileLogicalName + "_" + length + "_" + lastModified;
    long expires = System.currentTimeMillis() + DEFAULT_EXPIRE_TIME;
    // Validate request headers for caching ---------------------------------------------------
    // If-None-Match header should contain "*" or ETag. If so, then return 304.
    String ifNoneMatch = request.getHeader("If-None-Match");
    if (ifNoneMatch != null && matches(ifNoneMatch, eTag)) {
        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        // Required in 304.
        response.setHeader("ETag", eTag);
        // Postpone cache with 1 week.
        response.setDateHeader("Expires", expires);
        return;
    }
    // If-Modified-Since header should be greater than LastModified. If so, then return 304.
    // This header is ignored if any If-None-Match header is specified.
    long ifModifiedSince = request.getDateHeader("If-Modified-Since");
    if (ifNoneMatch == null && ifModifiedSince != -1 && ifModifiedSince + 1000 > lastModified) {
        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        // Required in 304.
        response.setHeader("ETag", eTag);
        // Postpone cache with 1 week.
        response.setDateHeader("Expires", expires);
        return;
    }
    // Validate request headers for resume ----------------------------------------------------
    // If-Match header should contain "*" or ETag. If not, then return 412.
    String ifMatch = request.getHeader("If-Match");
    if (ifMatch != null && !matches(ifMatch, eTag)) {
        response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
        return;
    }
    // If-Unmodified-Since header should be greater than LastModified. If not, then return 412.
    long ifUnmodifiedSince = request.getDateHeader("If-Unmodified-Since");
    if (ifUnmodifiedSince != -1 && ifUnmodifiedSince + 1000 <= lastModified) {
        response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED);
        return;
    }
    // Validate and process range -------------------------------------------------------------
    // Prepare some variables. The full Range represents the complete file.
    Range full = new Range(0, length - 1, length);
    List<Range> ranges = new ArrayList<>();
    // Validate and process Range and If-Range headers.
    String range = request.getHeader("Range");
    if (range != null) {
        // Range header should match format "bytes=n-n,n-n,n-n...". If not, then return 416.
        if (!range.matches("^bytes=\\d*-\\d*(,\\d*-\\d*)*$")) {
            // Required in 416.
            response.setHeader("Content-Range", "bytes */" + length);
            response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
            return;
        }
        // If-Range header should either match ETag or be greater then LastModified. If not,
        // then return full file.
        String ifRange = request.getHeader("If-Range");
        if (ifRange != null && !ifRange.equals(eTag)) {
            try {
                // Throws IAE if invalid.
                long ifRangeTime = request.getDateHeader("If-Range");
                if (ifRangeTime != -1 && ifRangeTime + 1000 < lastModified) {
                    ranges.add(full);
                }
            } catch (IllegalArgumentException ignore) {
                ranges.add(full);
            }
        }
        // If any valid If-Range header, then process each part of byte range.
        if (ranges.isEmpty()) {
            for (String part : range.substring(6).split(",")) {
                // Assuming a file with length of 100, the following examples returns bytes at:
                // 50-80 (50 to 80), 40- (40 to length=100), -20 (length-20=80 to length=100).
                long start = sublong(part, 0, part.indexOf("-"));
                long end = sublong(part, part.indexOf("-") + 1, part.length());
                if (start == -1) {
                    start = length - end;
                    end = length - 1;
                } else if (end == -1 || end > length - 1) {
                    end = length - 1;
                }
                // Check if Range is syntactically valid. If not, then return 416.
                if (start > end) {
                    // Required in 416.
                    response.setHeader("Content-Range", "bytes */" + length);
                    response.sendError(HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
                    return;
                }
                // Add range.
                ranges.add(new Range(start, end, length));
            }
        }
    }
    // Prepare and initialize response --------------------------------------------------------
    // Get content type by file name and set default GZIP support and content disposition.
    String contentType = getServletContext().getMimeType(fileLogicalName);
    ldw = Catalogue.logicalDataCache.get(fileUID);
    if (contentType == null && ldw != null) {
        contentType = ldw.getLogicalData().getContentTypesAsString();
    } else {
        contentType = "application/octet-stream";
    }
    boolean acceptsGzip = false;
    String disposition = "inline";
    // To add new content types, add new mime-mapping entry in web.xml.
    if (contentType == null) {
        contentType = "application/octet-stream";
    }
    // the browser and expand content type with the one and right character encoding.
    if (contentType.startsWith("text")) {
        String acceptEncoding = request.getHeader("Accept-Encoding");
        acceptsGzip = acceptEncoding != null && accepts(acceptEncoding, "gzip");
        contentType += ";charset=UTF-8";
    } else // the browser, then set to inline, else attachment which will pop a 'save as' dialogue.
    if (!contentType.startsWith("image")) {
        String accept = request.getHeader("Accept");
        disposition = accept != null && accepts(accept, contentType) ? "inline" : "attachment";
    }
    // Initialize response.
    response.reset();
    if (setResponseBufferSize) {
        response.setBufferSize(bufferSize);
    }
    response.setHeader("Content-Disposition", disposition + ";filename=\"" + fileLogicalName + "\"");
    response.setHeader("Accept-Ranges", "bytes");
    response.setHeader("ETag", eTag);
    response.setDateHeader("Last-Modified", lastModified);
    response.setDateHeader("Expires", expires);
    ldw = Catalogue.logicalDataCache.get(fileUID);
    if (ldw != null) {
        response.setContentLength(safeLongToInt(ldw.getLogicalData().getLength()));
    }
    // Send requested file (part(s)) to client ------------------------------------------------
    // Prepare streams.
    // RandomAccessFile input = null;
    OutputStream output = null;
    try {
        // Open streams.
        // input = new RandomAccessFile(file, "r");
        // input = pdri.getData()
        output = response.getOutputStream();
        if (ranges.isEmpty() || ranges.get(0) == full) {
            // Return full file.
            Range r = full;
            response.setContentType(contentType);
            response.setHeader("Content-Range", "bytes " + r.start + "-" + r.end + "/" + r.total);
            if (content) {
                if (acceptsGzip) {
                    // The browser accepts GZIP, so GZIP the content.
                    response.setHeader("Content-Encoding", "gzip");
                    output = new GZIPOutputStream(output, bufferSize);
                } else {
                    // Content length is not directly predictable in case of GZIP.
                    // So only add it if there is no means of GZIP, else browser will hang.
                    response.setHeader("Content-Length", String.valueOf(r.length));
                }
                // Copy full range.
                copy(pdri, output, r.start, r.length, request);
            }
        } else if (ranges.size() == 1) {
            // Return single part of file.
            Range r = ranges.get(0);
            response.setContentType(contentType);
            response.setHeader("Content-Range", "bytes " + r.start + "-" + r.end + "/" + r.total);
            response.setHeader("Content-Length", String.valueOf(r.length));
            // 206.
            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
            if (content) {
                // Copy single part range.
                copy(pdri, output, r.start, r.length, request);
            }
        } else {
            // Return multiple parts of file.
            response.setContentType("multipart/byteranges; boundary=" + MULTIPART_BOUNDARY);
            // 206.
            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
            if (content) {
                // Cast back to ServletOutputStream to get the easy println methods.
                ServletOutputStream sos = (ServletOutputStream) output;
                // Copy multi part range.
                for (Range r : ranges) {
                    // Add multipart boundary and header fields for every range.
                    sos.println();
                    sos.println("--" + MULTIPART_BOUNDARY);
                    sos.println("Content-Type: " + contentType);
                    sos.println("Content-Range: bytes " + r.start + "-" + r.end + "/" + r.total);
                    // Copy single part range of multi part range.
                    copy(pdri, output, r.start, r.length, request);
                }
                // End with multipart boundary.
                sos.println();
                sos.println("--" + MULTIPART_BOUNDARY + "--");
            }
        }
    } finally {
        // Gently close streams.
        close(output);
        if (in != null) {
            in.close();
        }
        long elapsed = System.currentTimeMillis() - startTime;
        if (elapsed <= 0) {
            elapsed = 1;
        }
        LogicalDataWrapped lwd = Catalogue.logicalDataCache.get(fileUID);
        if (lwd != null) {
            double speed = ((lwd.getLogicalData().getLength() * 8.0) * 1000.0) / (elapsed * 1000.0);
            Double oldSpeed = Catalogue.weightPDRIMap.get(pdri.getHost());
            if (oldSpeed == null) {
                oldSpeed = speed;
            }
            Integer numOfGets = numOfGetsMap.get(pdri.getHost());
            if (numOfGets == null) {
                numOfGets = 1;
            }
            double averagre = (speed + oldSpeed) / (double) numOfGets;
            numOfGetsMap.put(pdri.getHost(), numOfGets++);
            Catalogue.weightPDRIMap.put(pdri.getHost(), averagre);
            Stats stats = new Stats();
            stats.setSource(request.getLocalAddr());
            stats.setDestination(request.getRemoteAddr());
            stats.setSpeed(speed);
            stats.setSize(Catalogue.logicalDataCache.get(fileUID).getLogicalData().getLength());
            cat.setSpeed(stats);
            String speedMsg = "Source: " + request.getLocalAddr() + " Destination: " + request.getRemoteAddr() + " Tx_Speed: " + speed + " Kbites/sec Tx_Size: " + Catalogue.logicalDataCache.get(fileUID).getLogicalData().getLength() + " bytes";
            Logger.getLogger(WorkerServlet.class.getName()).log(Level.INFO, speedMsg);
            String averageSpeedMsg = "Average speed: Source: " + pdri.getHost() + " Destination: " + request.getLocalAddr() + " Rx_Speed: " + averagre + " Kbites/sec Rx_Size: " + Catalogue.logicalDataCache.get(fileUID).getLogicalData().getLength() + " bytes";
            if (Util.sendStats()) {
                stats.setSource(request.getLocalAddr());
                stats.setDestination(request.getRemoteAddr());
                stats.setSpeed(speed);
                stats.setSize(Catalogue.logicalDataCache.get(fileUID).getLogicalData().getLength());
                cat.setSpeed(stats);
            }
            Logger.getLogger(WorkerServlet.class.getName()).log(Level.INFO, averageSpeedMsg);
        }
    }
}
Also used : Path(io.milton.common.Path) ServletOutputStream(javax.servlet.ServletOutputStream) GZIPOutputStream(java.util.zip.GZIPOutputStream) ServletOutputStream(javax.servlet.ServletOutputStream) TeeOutputStream(org.apache.commons.io.output.TeeOutputStream) OutputStream(java.io.OutputStream) FileOutputStream(java.io.FileOutputStream) ArrayList(java.util.ArrayList) LogicalDataWrapped(nl.uva.cs.lobcder.rest.wrappers.LogicalDataWrapped) PDRI(nl.uva.cs.lobcder.resources.PDRI) LogicalData(nl.uva.cs.lobcder.resources.LogicalData) GZIPOutputStream(java.util.zip.GZIPOutputStream) Stats(nl.uva.cs.lobcder.rest.wrappers.Stats)

Example 5 with Stats

use of nl.uva.cs.lobcder.rest.wrappers.Stats in project lobcder by skoulouzis.

the class WebDataFileResource method sendContent.

@Override
public void sendContent(OutputStream out, Range range, Map<String, String> params, String contentType) throws IOException, NotAuthorizedException, BadRequestException, NotFoundException {
    double start = System.currentTimeMillis();
    PDRI pdri;
    Iterator<PDRIDescr> it;
    try {
        List<PDRIDescr> pdris = getCatalogue().getPdriDescrByGroupId(getLogicalData().getPdriGroupId());
        if (pdris.size() <= 0) {
            throw new NotFoundException("File inconsistency! Could not find physical file!");
        }
        // it = getCatalogue().getPdriDescrByGroupId(getLogicalData().getPdriGroupId()).iterator();
        if (range != null) {
            if (range.getFinish() == null) {
                range = new Range(range.getStart(), (getLogicalData().getLength() - 1));
            }
            it = pdris.iterator();
            Logger.getLogger(WebDataFileResource.class.getName()).log(Level.FINEST, "Start: {0} end: {1} range: {2}", new Object[] { range.getStart(), range.getFinish(), range.getRange() });
            pdri = transfererRange(it, out, 0, null, range);
        } else {
            // pdri = transfer(it, out, 0, null, false);
            pdri = transfer(pdris, out, 0, false);
        }
    } catch (SQLException ex) {
        throw new BadRequestException(this, ex.getMessage());
    } catch (IOException ex) {
        if (ex.getMessage().contains("Resource not found") || ex.getMessage().contains("Couldn't locate path")) {
            throw new NotFoundException(ex.getMessage());
        } else {
            throw new BadRequestException(this, ex.getMessage());
        }
    } finally {
    // Don't close the output, we need it to send back the response
    // if (out != null) {
    // out.flush();
    // out.close();
    // }
    }
    double elapsed = System.currentTimeMillis() - start;
    long len;
    if (range != null) {
        len = range.getFinish() - range.getStart() + 1;
    } else {
        len = this.getLogicalData().getLength();
    }
    double speed = ((len * 8.0) * 1000.0) / (elapsed * 1000.0);
    Double oldSpeed = weightPDRIMap.get(pdri.getHost());
    if (oldSpeed == null) {
        oldSpeed = speed;
    }
    Integer numOfGets = numOfGetsMap.get(pdri.getHost());
    if (numOfGets == null) {
        numOfGets = 1;
    }
    double averagre = (speed + oldSpeed) / (double) numOfGets;
    numOfGetsMap.put(pdri.getHost(), numOfGets++);
    weightPDRIMap.put(pdri.getHost(), averagre);
    getCatalogue().addViewForRes(getLogicalData().getUid());
    Stats stats = new Stats();
    stats.setSource(pdri.getHost());
    stats.setDestination(fromAddress);
    stats.setSpeed(speed);
    stats.setSize(getLogicalData().getLength());
    String msg = "Source: " + stats.getSource() + " Destination: " + stats.getDestination() + " Tx_Speed: " + speed + " Kbites/sec Tx_Size: " + getLogicalData().getLength() + " bytes Elapsed_Time: " + elapsed + " ms";
    try {
        if (!pdri.isCahce()) {
            getCatalogue().setSpeed(stats);
        }
    } catch (SQLException ex) {
        Logger.getLogger(WebDataFileResource.class.getName()).log(Level.SEVERE, null, ex);
    }
    Logger.getLogger(WebDataFileResource.class.getName()).log(Level.INFO, msg);
}
Also used : SQLException(java.sql.SQLException) PDRIDescr(nl.uva.cs.lobcder.resources.PDRIDescr) NotFoundException(io.milton.http.exceptions.NotFoundException) IOException(java.io.IOException) Range(io.milton.http.Range) PDRI(nl.uva.cs.lobcder.resources.PDRI) Stats(nl.uva.cs.lobcder.rest.wrappers.Stats) BadRequestException(io.milton.http.exceptions.BadRequestException)

Aggregations

Stats (nl.uva.cs.lobcder.rest.wrappers.Stats)6 SQLException (java.sql.SQLException)4 PDRI (nl.uva.cs.lobcder.resources.PDRI)4 Path (io.milton.common.Path)2 BadRequestException (io.milton.http.exceptions.BadRequestException)2 LogicalData (nl.uva.cs.lobcder.resources.LogicalData)2 PDRIDescr (nl.uva.cs.lobcder.resources.PDRIDescr)2 Range (io.milton.http.Range)1 NotAuthorizedException (io.milton.http.exceptions.NotAuthorizedException)1 NotFoundException (io.milton.http.exceptions.NotFoundException)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 OutputStream (java.io.OutputStream)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)1 Connection (java.sql.Connection)1 ArrayList (java.util.ArrayList)1 GZIPOutputStream (java.util.zip.GZIPOutputStream)1