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);
}
}
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);
}
}
}
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;
}
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);
}
}
}
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);
}
Aggregations