package org.smartly.commons.network.socket.client; import org.smartly.commons.Delegates; import org.smartly.commons.network.socket.messages.UserToken; import org.smartly.commons.network.socket.messages.multipart.MultipartInfo; import org.smartly.commons.network.socket.messages.multipart.MultipartMessagePart; import org.smartly.commons.util.FileUtils; import java.io.File; /** * Runnable Upload job */ public class UploadRunnable extends Thread { // -------------------------------------------------------------------- // f i e l d s // -------------------------------------------------------------------- private final String _transactionId; private final Client _client; private final String _fileName; private final UserToken _userToken; private final String[] _chunks; private final boolean _useMultipleConnections; private final int _index; private final Delegates.ExceptionCallback _errorHandler; private Throwable _error; private long _elapsedTime; private long _dataLength; // -------------------------------------------------------------------- // c o n s t r u c t o r // -------------------------------------------------------------------- public UploadRunnable(final int index, final String transactionId, final Client client, final String filename, final UserToken userToken, final String[] chunks, final boolean useMultipleConnections, final Delegates.ExceptionCallback errorHandler) { _transactionId = transactionId; _client = client; _fileName = filename; _userToken = userToken; _chunks = chunks; _useMultipleConnections = useMultipleConnections; _index = index; _errorHandler = errorHandler; } // -------------------------------------------------------------------- // o v e r r i d e // -------------------------------------------------------------------- @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append(this.getClass().getSimpleName()).append("{"); sb.append("Index: ").append(_index); sb.append(", "); sb.append("Error: ").append(this.hasError() ? _error : ""); sb.append(", "); sb.append("ElapsedTime: ").append(_elapsedTime); sb.append(", "); sb.append("DataLength: ").append(_dataLength); sb.append("}"); return sb.toString(); } @Override public void run() { _elapsedTime = System.currentTimeMillis(); try { this.runTask(); } catch (Throwable t) { if (null != _errorHandler) { _errorHandler.handle(null, t); } _error = t; } _elapsedTime = System.currentTimeMillis() - _elapsedTime; } // -------------------------------------------------------------------- // p u b l i c // -------------------------------------------------------------------- public int getIndex() { return _index; } public boolean hasError() { return null != _error; } public Throwable getError() { return _error; } public long getElapsedTime() { return _elapsedTime; } public long getDataLength() { return _dataLength; } // -------------------------------------------------------------------- // p r i v a t e // -------------------------------------------------------------------- private void runTask() throws Exception { final int len = _chunks.length; final String chunk = _chunks[_index]; final MultipartInfo info = new MultipartInfo( _fileName, MultipartInfo.MultipartInfoType.File, MultipartInfo.MultipartInfoDirection.Upload, chunk, 0, _index, len); final MultipartMessagePart part = new MultipartMessagePart(); part.setUserToken(_userToken.toString()); part.setInfo(info); part.setUid(_transactionId); part.setData(FileUtils.copyToByteArray(new File(chunk))); _dataLength = part.getDataLength(); //-- send part --// if (_useMultipleConnections) { Client.send(_client.getAddress(), part); } else { Client.send(_client.getSocket(), part); } } }