From 8f34df1a9e948e77a9d86b8f970fabab04c523eb Mon Sep 17 00:00:00 2001 From: flavien Date: Tue, 14 Apr 2020 15:06:02 +0200 Subject: [PATCH] added class diagram image --- doc/Class Diagram.svg | 7038 ++++++++++++++++++++++++++++++++++++++++ doc/Class Diagram1.svg | 2728 ---------------- doc/VPProjects/uml.vpp | Bin 2871296 -> 2871296 bytes doc/classdiagram.xml | 1 - 4 files changed, 7038 insertions(+), 2729 deletions(-) create mode 100644 doc/Class Diagram.svg delete mode 100644 doc/Class Diagram1.svg delete mode 100644 doc/classdiagram.xml diff --git a/doc/Class Diagram.svg b/doc/Class Diagram.svg new file mode 100644 index 0000000..4b0af63 --- /dev/null +++ b/doc/Class Diagram.svg @@ -0,0 +1,7038 @@ + + +trackertoolsserverP2PremoteExceptionprotocolP2PlocalExceptionguiexceptionclientP2P-socket : DatagramSocket+TrackerManagementUDP(tracker : HostItem, logger : Logger)+run() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getHostItemSocket(hostItem : HostItem) : Object#closeHostItemSocket(hostItem : HostItem) : voidTrackerManagementUDP-addr : HostItem+ClientHandler(s : Socket)+run() : void-handleClientRequest() : booleanClientHandler-socket : ServerSocket+TrackerManagementTCP(tracker : HostItem, logger : Logger)+run() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getHostItemSocket(hostItem : HostItem) : Object#closeHostItemSocket(hostItem : HostItem) : voidTrackerManagementTCP#tracker : HostItem#logger : Logger#hostList : HostItem = new ArrayList<>()#ratioUp : Map<HostItem, Long> = new HashMap<>()#ratioDown : Map<HostItem, Long> = new HashMap<>()#fileList : Map<String, List<HostItem>> = new HashMap<>()#fileSize : Map<String, Long> = new HashMap<>()#stop : boolean#writeLock : AtomicBoolean#readLock : AtomicInteger+TrackerManagement(tracker : HostItem, logger : Logger)#handleDiscover(pd : T) : void#handleRatio(pd : T) : void#handleListResponse(pd : T, host : HostItem) : void#handleUnregister(pd : T) : void#getHostItemSocket(hostItem : HostItem) : Object#closeHostItemSocket(hostItem : HostItem) : void#handleUpdateRatio(pd : T) : void#handleRegister(pd : T) : void#handleListRequest(pd : T) : void#handleSizeRequest(pd : T) : void#handleRequest(pd : T) : void+setStop() : voidTrackerManagement-tracker : HostItem-directories : Directories-logger : Logger~DEBUG : boolean = true+Tracker(hostname : String, port : int, isInteractive : boolean)+main(args : String[]) : voidTracker+TrackerPortRange()TrackerPortRange+ServerPortRange()ServerPortRange#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<?>#sendNotATracker(pd : T) : void#sendInternalError(pd : T) : void#sendNotFound(pd : T) : void#sendEmptyDirectory(pd : T) : void#sendEmptyFile(pd : T) : void#sendUnknownHost(pd : T) : voidServeErrors+searchByName(filesArray : String[], searchInput : String) : String[]+searchByExtention(filesArray : String[], searchInput : String) : String[]SearchFile#portMax : int#portMin : int#defaultPort : int#type : String+PortRange(portMin : int, portMax : int, defaultPort : int, type : String)+isPortInRange(port : int) : boolean+toString() : StringPortRangeErrorInfoWarningActionDebugProgression<<enumeration>>LogLevel-logFile : Path-debugMode : boolean+Logger(logFile : String, debugMode : boolean)+write(text : String, logLevel : LogLevel) : void+write(e : Exception, logLevel : LogLevel) : void+writeTCP(text : String, logLevel : LogLevel) : void+writeTCP(e : Exception, logLevel : LogLevel) : void+writeUDP(text : String, logLevel : LogLevel) : void+writeUDP(e : Exception, logLevel : LogLevel) : voidLogger-hostname : String-port : int-tcpSocket : Socket-udpSocket : DatagramSocket-inetAddress : InetAddress+HostItem(hostname : String, port : int)+getTCPSocket() : Socket+tryGetTCPSocket() : Socket+closeTCPSocket() : void+getUDPSocket() : DatagramSocket+tryGetUDPSocket() : DatagramSocket+closeUDPSocket() : void+toString() : String+equals(other : Object) : boolean+hashCode() : int+HostItem(s : Socket)HostItem-projectName : String-dataHomeDirectory : String-os : String+Directories(projectName : String)-setDataHomeDirectory() : void+createSubdir(subdir : String) : void-openDataHomeDirectory(subdir : String) : void+askOpenDataHomeDirectory(subdir : String, scanner : Scanner) : voidDirectories+write(array : byte[], start : int, value : int) : void+write16Bits(array : byte[], start : int, value : int) : void+write(array : byte[], start : int, value : long) : void+readInt(array : byte[], start : int) : int+readInt16Bits(array : byte[], start : int) : int+readLong(array : byte[], start : int) : long+cleanStrings(str : String) : String+write(byteArray : byte[], strArray : String[], start : int, separator : String) : void+readStringArray(byteArray : byte[], start : int, size : int, separator : String) : String[]+computeStringArraySize(strArray : String[], separator : String) : int+write(array : byte[], str : String, start : int) : void+readString(array : byte[], start : int, size : int) : String+readString(array : byte[], start : int, endStr : String) : String+write(dst : byte[], src : byte[], start : int) : void+readByteArray(src : byte[], start : int, end : int) : byte[]BytesArrayTools-directories : Directories-subdir : String = "seeded/"-logger : Logger-tracker : HostItem-server : HostItem~DEBUG : boolean = true+ServerP2P(hostnameServer : String, portServer : int, hostnameTracker : String, portTracker : int, isInteractive : boolean)+main(args : String[]) : voidServerP2P-socket : DatagramSocket+ServerManagementUDP(baseDirectory : String, server : HostItem, tracker : HostItem, logger : Logger)+run() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getTrackerSocket() : Object#closeSocket() : voidServerManagementUDP-addr : HostItem+ClientHandler(s : Socket)+run() : void-handleClientRequest() : booleanClientHandler-socket : ServerSocket+ServerManagementTCP(baseDirectory : String, server : HostItem, tracker : HostItem, logger : Logger)+run() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getTrackerSocket() : Object#closeSocket() : voidServerManagementTCP#stop : boolean#fileListWatcher : FileWatcher#logger : Logger#baseDirectory : String#server : HostItem#tracker : HostItem#punisher : Random = new Random()#ratioWatcher : RatioWatcher+ServerManagement(baseDirectory : String, server : HostItem, tracker : HostItem, logger : Logger)+setStop() : void#closeSocket() : void+updateFileList() : void#sendListResponse(pd : T) : void#sendHashResponse(pd : T) : void#sendLoadResponse(pd : T) : void#sendSizeResponse(pd : T) : void#getTrackerSocket() : Object#sendUnregisterRequest() : void#handleRequest(pd : T) : voidServerManagement+RatioWatcherUDP(logger : Logger, millis : long, tracker : HostItem)#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getTrackerSocket() : Object#closeTrackerSocket() : voidRatioWatcherUDP+RatioWatcherTCP(logger : Logger, millis : long, tracker : HostItem)#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getTrackerSocket() : Object#closeTrackerSocket() : voidRatioWatcherTCP~punishmentFactor : double = 1.2#logger : Logger#stop : boolean#time : long#force : boolean#tracker : HostItem#thread : Thread#cachePunishmentProbability : Map<HostItem, Double> = new HashMap<>()#lock : boolean+RatioWatcher(logger : Logger, millis : long, tracker : HostItem)+run() : void#clean() : void#getPunishmentProbability(application : HostItem) : double+setStop() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<?>#getTrackerSocket() : Object#closeTrackerSocket() : voidRatioWatcher+FileWatcherUDP(logger : Logger, millis : long, server : HostItem, tracker : HostItem, baseDirectory : String)#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#registerTracker() : voidFileWatcherUDP+FileWatcherTCP(logger : Logger, millis : long, server : HostItem, tracker : HostItem, baseDirectory : String)#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#registerTracker() : voidFileWatcherTCP#fileList : String[] = new String[0]#logger : Logger#stop : boolean#time : long#force : boolean#server : HostItem#tracker : HostItem#baseDirectory : String#sha512 : Map<String, byte[]> = new HashMap<>()#thread : Thread+FileWatcher(logger : Logger, millis : long, server : HostItem, tracker : HostItem, baseDirectory : String)+getSha512Map() : Map<String, byte[]>+trigger() : void+run() : void#registerTracker() : void#updateFileList() : boolean+setStop() : void#initSha512() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : voidFileWatcher-serialVersionUID : long = 12LVersionRemoteError-serialVersionUID : long = 12LUnknownHost-serialVersionUID : long = 12LProtocolRemoteError-serialVersionUID : long = 12LNotFound-serialVersionUID : long = 12LNotATracker-serialVersionUID : long = 12LInternalRemoteError-serialVersionUID : long = 12LEmptyFile-serialVersionUID : long = 12LEmptyDirectory-client : HostItem-server : HostItem-dataSize : long-DATA_SIZE_POSITION : int = PAYLOAD_START_POSITION-SERVER_PORT_START_POSITION : int = DATA_SIZE_POSITION + 8-CLIENT_PORT_START_POSITION : int = SERVER_PORT_START_POSITION + 2-HOSTNAMES_START_POSITION : int = CLIENT_PORT_START_POSITION + 2+UpdateRatio(client : HostItem, server : HostItem, dataSize : long)#UpdateRatio(packet : byte[])#toPacket() : byte[]UpdateRatio-hostItem : HostItem-HOSTNAME_START_POSITION : int = PAYLOAD_START_POSITION + 2+Unregister(hostItem : HostItem)#Unregister(packet : byte[])#toPacket() : byte[]Unregister-filename : String-totalSize : long-TOTAL_SIZE_POSITION : int = PAYLOAD_START_POSITION-FILENAME_POSITION : int = TOTAL_SIZE_POSITION + 8+SizeResponse(filename : String, totalSize : long)#SizeResponse(packet : byte[])#toPacket() : byte[]SizeResponse-filename : String+SizeRequest(filename : String)#SizeRequest(packet : byte[])#toPacket() : byte[]SizeRequest+codeType : CodeType+codeValue : byte#RRCODE_POSITION : int = 1-BY_CODE : Map<Byte, RequestResponseCode> = new HashMap<>()-RequestResponseCode(codeType : CodeType, codeValue : byte)#fromCode(code : byte) : RequestResponseCodeLIST_REQUESTLOAD_REQUESTHASH_REQUESTDISCOVER_REQUESTREGISTERUNREGISTERRATIO_REQUESTUPDATE_RATIOSIZE_REQUESTLIST_RESPONSELOAD_RESPONSEHASH_RESPONSEDISCOVER_RESPONSERATIO_RESPONSEDENIEDSIZE_RESPONSEVERSION_ERRORPROTOCOL_ERRORINTERNAL_ERROREMPTY_DIRECTORYNOT_FOUNDEMPTY_FILENOT_A_TRACKERUNKNOWN_HOST<<enumeration>>RequestResponseCode-hostItem : HostItem-HOSTNAME_START_POSITION : int = PAYLOAD_START_POSITION + 2+Register(hostItem : HostItem)#Register(packet : byte[])#toPacket() : byte[]Register-hostItem : HostItem-totalUp : long-totalDown : long-TOTAL_UP_START_POSITION : int = PAYLOAD_START_POSITION-TOTAL_DOWN_START_POSITION : int = TOTAL_UP_START_POSITION + 8-PORT_START_POSITION : int = TOTAL_DOWN_START_POSITION + 8-HOSTNAME_START_POSITION : int = PORT_START_POSITION + 2+RatioResponse(hostItem : HostItem, totalUp : long, totalDown : long)#RatioResponse(packet : byte[])#toPacket() : byte[]RatioResponse-hostItem : HostItem-HOSTNAME_START_POSITION : int = PAYLOAD_START_POSITION + 2+RatioRequest(hostItem : HostItem)#RatioRequest(packet : byte[])#toPacket() : byte[]RatioRequest-CHECKSUM_POSITION : int = 2-remoteHost : HostItem-responseSocketAddress : SocketAddress-responseSocket : DatagramSocket-requestSocket : DatagramSocket+ProtocolP2PPacketUDP(payload : T)#send(socket : DatagramSocket) : void#send(socket : DatagramSocket, addr : SocketAddress) : void+sendRequest(socket : Object) : void+ProtocolP2PPacketUDP(socket : Object)+sendResponse(response : U) : void+receiveResponse() : ProtocolP2PPacket<?>-ProtocolP2PPacketUDP(packet : byte[])-constructPacket(packet : byte[]) : void-constructPacket(packet : byte[], responseSocket : DatagramSocket) : void#toPacket() : byte[]-computeCheckSum(packet : byte[]) : int-setCheckSum(packet : byte[]) : void-checkCheckSum(packet : byte[]) : void+getHostItem() : HostItemProtocolP2PPacketUDP-responseSocket : Socket-requestSocket : Socket+ProtocolP2PPacketTCP(payload : T)#send(socket : Socket) : void+sendRequest(socket : Object) : void+ProtocolP2PPacketTCP(socket : Object)+sendResponse(response : U) : void+receiveResponse() : ProtocolP2PPacket<?>-ProtocolP2PPacketTCP(packet : byte[])-constructPacket(packet : byte[]) : void-constructPacket(packet : byte[], responseSocket : Socket) : void#toPacket() : byte[]+getHostItem() : HostItemProtocolP2PPacketTCP-PROTOCOL_VERSION : byte = 0x12#VERSION_POSITION : int = 0#version : byte#payload : Payload+ProtocolP2PPacket(payload : T)+sendRequest(socket : Object) : void+sendResponse(response : U) : void+getHostItem() : HostItem+receiveResponse() : ProtocolP2PPacket<?>#ProtocolP2PPacket(socket : Object)#ProtocolP2PPacket(packet : byte[])#checkProtocolVersion() : voidProtocolP2PPacket#requestResponseCode : RequestResponseCode#PAYLOAD_SIZE_POSITION : int = 4#PAYLOAD_START_POSITION : int = 8+Payload(requestResponseCode : RequestResponseCode)#Payload(packet : byte[])-checkRequestResponseCode() : void#toPacket() : byte[]#setPayloadSize(size : int, packet : byte[]) : void#getPayloadSize(packet : byte[]) : intPayload-filename : String-maxSizePartialContent : long-offset : long-hostItem : HostItem-OFFSET_POSITION : int = PAYLOAD_START_POSITION-MAX_SIZE_PARTIAL_CONTENT_POSITION : int = OFFSET_POSITION + 8-FILENAME_SIZE_POSITION : int = MAX_SIZE_PARTIAL_CONTENT_POSITION + 8-FILENAME_POSITION : int = FILENAME_SIZE_POSITION + 4+LoadRequest(filename : String, offset : long, maxSizePartialContent : long, hostItem : HostItem)#LoadRequest(packet : byte[])#toPacket() : byte[]LoadRequest-filename : String-hashes : Map<HashAlgorithm, byte[]> = new HashMap<>()-FILENAME_SIZE_POSITION : int = PAYLOAD_START_POSITION-FILENAME_POSITION : int = FILENAME_SIZE_POSITION + 4+HashResponse(filename : String, hashes : Map<HashAlgorithm, byte[]>)#HashResponse(packet : byte[])#toPacket() : byte[]+getHash(hashAlgo : HashAlgorithm) : byte[]HashResponse-filename : String-algoList : HashAlgorithm[]-FILENAME_SIZE_POSITION : int = PAYLOAD_START_POSITION-FILENAME_POSITION : int = FILENAME_SIZE_POSITION + 4+HashRequest(filename : String, algoList : HashAlgorithm[])#HashRequest(packet : byte[])#toPacket() : byte[]HashRequest-name : String-BY_NAME : Map<String, HashAlgorithm> = new HashMap<>()-HashAlgorithm(name : String)+getName() : String#fromName(name : String) : HashAlgorithmSHA512MD5<<enumeration>>HashAlgorithm-filename : String-offset : long-partialContent : byte[]-OFFSET_POSITION : int = PAYLOAD_START_POSITION-FILENAME_SIZE_POSITION : int = OFFSET_POSITION + 8-FILENAME_POSITION : int = FILENAME_SIZE_POSITION + 4+FilePart(filename : String, offset : long, partialContent : byte[])#FilePart(packet : byte[])#toPacket() : byte[]-setOffset(packet : byte[]) : void-getFilenameSize(packet : byte[]) : int-setFilename(packet : byte[]) : void-setPartialContent(packet : byte[]) : voidFilePart-fileList : String[]+FileList(fileList : String[])#FileList(packet : byte[])#toPacket() : byte[]FileList-hostList : HostItem-filename : String-FILENAME_SIZE_POSITION : int = PAYLOAD_START_POSITION-FILENAME_POSITION : int = FILENAME_SIZE_POSITION + 4+DiscoverResponse(filename : String, hostList : List<HostItem>)#DiscoverResponse(packet : byte[])#toPacket() : byte[]+getHostList() : List<HostItem>DiscoverResponse-filename : String+DiscoverRequest(filename : String)#DiscoverRequest(packet : byte[])#toPacket() : byte[]DiscoverRequest-filename : String-offset : long-OFFSET_POSITION : int = PAYLOAD_START_POSITION-FILENAME_POSITION : int = OFFSET_POSITION + 8+Denied(filename : String, offset : long)#Denied(packet : byte[])#toPacket() : byte[]DeniedREQUESTREQUEST_TRACKERRESPONSEERROR<<enumeration>>CodeType-serialVersionUID : long = 12LVersionError-serialVersionUID : long = 12LTransmissionError-serialVersionUID : long = 12LSocketClosed-serialVersionUID : long = 12LSizeError-serialVersionUID : long = 12LProtocolError-serialVersionUID : long = 12LInternalError-serialVersionUID : long = 13L+MainWindow()MainWindow+main(args : String[]) : voidGui-jLabel1 : JLabel-jToggleButton1 : JToggleButton-message : String-serialVersionUID : long = 13L+ErrorFrame(message : String)-initComponents() : void-jToggleButton1ActionPerformed(evt : ActionEvent) : voidErrorFrame-jButton1 : JButton-jButton2 : JButton-jLabel1 : JLabel-jList1 : JList<String>-jScrollPane1 : JScrollPane-serialVersionUID : long = 13L-listFilesToDownload : String[]-clientManagement : ClientManagement-logger : Logger-smtcp : ServerManagementTCP-smudp : ServerManagementUDP+DownloadSelectionGen(listFilesToDownload : String[], clientManagement : ClientManagement, logger : Logger, smtcp : ServerManagementTCP, smudp : ServerManagementUDP)-initComponents() : void-jButton1ActionPerformed(evt : ActionEvent) : void-jButton2ActionPerformed(evt : ActionEvent) : voidDownloadSelectionGen-serialVersionUID : long = 13L-fileToDownload : String-clientManagement : ClientManagement-logger : Logger-smtcp : ServerManagementTCP-smudp : ServerManagementUDP+DownloadFileGUI(fileToDownload : String, clientManagement : ClientManagement, logger : Logger, smtcp : ServerManagementTCP, smudp : ServerManagementUDP)+download() : voidDownloadFileGUI-logDir : String = "logs/"-partsDir : String = ".parts/"-loggerServer : Logger-loggerClient : Logger-directories : Directories-tracker : HostItem-server : HostItem~DEBUG : boolean = false-hostnameServer : String-hostnameTracker : String-portServer : int-portTracker : int-protocolP2P : String+initDirectoriesAndLoggers() : void+ClientP2PGUI(hostnameServer : String, portServer : int, hostnameTracker : String, portTracker : int, protocolP2P : String)+connect() : voidClientP2PGUI~loggerC : Logger-smtcp : ServerManagementTCP-smudp : ServerManagementUDP+ClientInterfaceGUI(clientManagement : ClientManagement, logger : Logger, smtcp : ServerManagementTCP, smudp : ServerManagementUDP)+run() : void-initHostList() : booleanClientInterfaceGUI-jButton1 : JButton-jComboBox1 : JComboBox<String>-jLabel1 : JLabel-jLabel2 : JLabel-jLabel3 : JLabel-jLabel4 : JLabel-jLabel5 : JLabel-jLabel6 : JLabel-jTextField1 : JTextField-jTextField2 : JTextField-jTextField3 : JTextField-jTextField4 : JTextField-serialVersionUID : long = 13L+ArgumentsGen()-initComponents() : void-jTextField1ActionPerformed(evt : ActionEvent) : void-jTextField2ActionPerformed(evt : ActionEvent) : void-jButton1ActionPerformed(evt : ActionEvent) : voidArgumentsGen-serialVersionUID : long = 12LRemoteException-serialVersionUID : long = 13LLocalException-logDir : String = "logs/"-partsDir : String = ".parts/"-loggerServer : Logger-loggerClient : Logger-directories : Directories-tracker : HostItem-server : HostItem-scanner : Scanner~DEBUG : boolean = false+initDirectoriesAndLoggers() : void+ClientP2P(hostnameServer : String, portServer : int, hostnameTracker : String, portTracker : int)-printUsage(serverPortRange : ServerPortRange, trackerPortRange : TrackerPortRange) : void+main(args : String[]) : voidClientP2P+ClientManagementUDP(baseDirectory : String, tracker : HostItem, partsSubdir : String, logger : Logger, client : HostItem)#initDownloader(filename : String) : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getTrackerSocket() : Object#closeTrackerSocket() : void#getHostItemSocket(hostItem : HostItem) : Object#closeHostItemSocket(hostItem : HostItem) : voidClientManagementUDP+ClientManagementTCP(baseDirectory : String, tracker : HostItem, partsSubdir : String, logger : Logger, client : HostItem)#initDownloader(filename : String) : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getTrackerSocket() : Object#closeTrackerSocket() : void#getHostItemSocket(hostItem : HostItem) : Object#closeHostItemSocket(hostItem : HostItem) : voidClientManagementTCP#baseDirectory : String#partsSubdir : String#hostList : HostItem = new ArrayList<>()#tracker : HostItem#client : HostItem#logger : Logger#downLoader : ClientDownload+ClientManagement(baseDirectory : String, tracker : HostItem, partsSubdir : String, logger : Logger, client : HostItem)#getTrackerSocket() : Object#closeTrackerSocket() : void+initHostList() : void-computeHashsum(filename : String, h : HashAlgorithm) : byte[]#getHostItemSocket(hostItem : HostItem) : Object#closeHostItemSocket(hostItem : HostItem) : void+listDirectory() : String[]#initDownloader(filename : String) : void+download(filename : String) : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : voidClientManagement-scanner : Scanner-list : String[]+ClientInterfaceCLI(clientManagement : ClientManagement, logger : Logger, scanner : Scanner)+run() : void-initHostList() : boolean-initFileList() : booleanClientInterfaceCLI#clientManagement : ClientManagement-logger : Logger+ClientInterface(clientManagement : ClientManagement, logger : Logger)#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : voidClientInterface+ClientDownloadUDP(filename : String, hostList : List<HostItem>, partsSubdir : String, dirStorage : String, logger : Logger, client : HostItem, tracker : HostItem)#createDownloadPart(hostItem : HostItem) : ClientDownloadPart#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getHostItemSocket(hostItem : HostItem) : Object#closeHostItemSocket(hostItem : HostItem) : voidClientDownloadUDP+ClientDownloadTCP(filename : String, hostList : List<HostItem>, partsSubdir : String, dirStorage : String, logger : Logger, client : HostItem, tracker : HostItem)#createDownloadPart(hostItem : HostItem) : ClientDownloadPart#closeHostItemSocket(hostItem : HostItem) : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>#getHostItemSocket(hostItem : HostItem) : ObjectClientDownloadTCP-socket : DatagramSocket+ClientDownloadPartUDP(manager : ClientDownload, filename : String, socket : DatagramSocket, partsSubdir : String, logger : Logger, client : HostItem, server : HostItem)#getSocket() : Object#closeSocket() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>ClientDownloadPartUDP-socket : Socket+ClientDownloadPartTCP(manager : ClientDownload, filename : String, socket : Socket, partsSubdir : String, logger : Logger, client : HostItem, server : HostItem)#getSocket() : Object#closeSocket() : void#writeLog(text : String, logLevel : LogLevel) : void#writeLog(e : Exception, logLevel : LogLevel) : void#createProtocolP2PPacket(payload : T) : ProtocolP2PPacket<T>ClientDownloadPartTCP#receivedBytesCount : long#toDoTasks : List<Long>#pendingTasks : List<Long>#tasksDone : List<Long>#tasksListsLock : boolean#stop : boolean#failed : boolean#filename : String#noTask : boolean#partsSubdir : String#MAX_PARTIAL_SIZE : long = 4096#manager : ClientDownload#logger : Logger#client : HostItem-server : HostItem+ClientDownloadPart(manager : ClientDownload, filename : String, partsSubdir : String, logger : Logger, client : HostItem, server : HostItem)+getReceivedBytesCount() : Long+hasFailed() : boolean+setStop() : void+run() : void#closeSocket() : void+getFailed() : List<Long>+getDone() : List<Long>+assignTask(task : Long) : void+doTasks() : void#reqPart(offset : Long) : ProtocolP2PPacket<?>#getSocket() : Object+downloadPart(d : T) : booleanClientDownloadPart#hostList : HostItem#filename : String#hash512 : byte[]#sockList : ClientDownloadPart = new ArrayList<ClientDownloadPart>()#ratioUpdater : Map<HostItem, Long> = new HashMap<>()#offsetsToAsk : List<Long> = new ArrayList<Long>()#offsetsPending : List<Long> = new ArrayList<Long>()#stop : boolean#size : long#MAX_PARTIAL_SIZE : long = 4096#partsSubdir : String#dirStorage : String#success : boolean = false#logger : Logger#client : HostItem#tracker : HostItem#lastPercentProgress : int#lastTimeProgress : Instant~DIFF_TIME_PROGRESS_MILLIS : int = 2000~DIFF_PERCENT_PROGRESS : int = 5+ClientDownload(filename : String, hostList : List<HostItem>, partsSubdir : String, dirStorage : String, logger : Logger, client : HostItem, tracker : HostItem)+getHashSum512() : byte[]#stopTasks() : void+setStop() : void#assignTasks() : void#createDownloadPart(hostItem : HostItem) : ClientDownloadPart#initThreads() : void#checkTasksStatus() : void+sendRatioUpdate() : void#getHashSum512(hostItem : HostItem) : byte[]#purgeList() : void#reassembleFile() : void#setSize() : void#closeHostItemSocket(hostItem : HostItem) : void+run() : void#printProgression() : void#init() : void#getHostItemSocket(hostItem : HostItem) : ObjectClientDownloadT : PayloadT : PayloadT : Payload-logger1#manager1-hostItem1-loggerClient1#logger1#server1-addr1-loggerClient1#hostList*-algoList*-tracker1-client1-addr1#tracker1#logger1-logger1#clientManagement1-loggerServer1-logger1#logger1#logger1#ratioWatcher1-loggerServer1#logger1#logger1#client1#tracker1-smudp1#tracker1#tracker1#client1-directories1-smtcp1-directories1#tracker1#tracker1#server1-smtcp1-tracker1-smtcp1-directories1loggerC1-hostItem1-clientManagement1-server1-smudp1-tracker1-clientManagement1+codeType1-tracker1-logger1-hostItem1#sockList*#client1-server1#hostList*-hostItem1-server1-hostItem1#logger1-logger1#fileListWatcher1#requestResponseCode1-server1-remoteHost1#downLoader1-server1#hostList*-directories1-hostList*-smudp1#payload1 diff --git a/doc/Class Diagram1.svg b/doc/Class Diagram1.svg deleted file mode 100644 index 965f5d2..0000000 --- a/doc/Class Diagram1.svg +++ /dev/null @@ -1,2728 +0,0 @@ - - -clientP2P-baseDirectory : String-UDPPort : int-host : String-socket : DatagramSocket+ClientManagementUDP(baseDirectory : String, host : String, UDPPort : int)+run() : void-download(filename : String) : void-listDirectory() : String[]ClientManagementUDP-host : String-port : int-directories : Directories+ClientP2P()+main(args : String[]) : voidClientP2P-baseDirectory : String-TCPPort : int-host : String-socket : Socket+ClientManagementTCP(baseDirectory : String, host : String, TCPPort : int)+run() : void-download(filename : String) : void-listDirectory() : String[]ClientManagementTCPexception-serialVersionUID : long = 12LProtocolError-serialVersionUID : long = 12LSizeError-serialVersionUID : long = 12LTransmissionError-serialVersionUID : long = 12LVersionError-serialVersionUID : long = 12LInternalErrorprotocolP2P-PROTOCOL_VERSION : byte = 0x12#VERSION_POSITION : int = 0#version : byte#payload : Payload+ProtocolP2PPacket(payload : Payload)+sendRequest(socket : Object) : void+sendResponse(response : ProtocolP2PPacket) : void+receiveResponse() : ProtocolP2PPacket#ProtocolP2PPacket(socket : Object)#ProtocolP2PPacket(packet : byte[])#checkProtocolVersion() : voidProtocolP2PPacket-fileList : String[]+FileList(fileList : String[])#FileList(packet : byte[])#toPacket() : byte[]FileListREQUESTRESPONSEERROR<<enumeration>>CodeType+codeType : CodeType+codeValue : byte#RRCODE_POSITION : int = 1-BY_CODE : Map<Byte, RequestResponseCode> = new HashMap<>()-RequestResponseCode(codeType : CodeType, codeValue : byte)#fromCode(code : byte) : RequestResponseCodeLIST_REQUESTLOAD_REQUESTLIST_RESPONSELOAD_RESPONSEVERSION_ERRORPROTOCOL_ERRORINTERNAL_ERROREMPTY_DIRECTORYNOT_FOUNDEMPTY_FILE<<enumeration>>RequestResponseCode-filename : String-maxSizePartialContent : long-offset : long-OFFSET_POSITION : int = PAYLOAD_START_POSITION-MAX_SIZE_PARTIAL_CONTENT_POSITION : int = OFFSET_POSITION + 8-FILENAME_SIZE_POSITION : int = MAX_SIZE_PARTIAL_CONTENT_POSITION + 8-FILENAME_POSITION : int = FILENAME_SIZE_POSITION + 4+LoadRequest(filename : String, offset : long, maxSizePartialContent : long)#LoadRequest(packet : byte[])#toPacket() : byte[]LoadRequest-filename : String-totalSize : long-offset : long-partialContent : byte[]-OFFSET_POSITION : int = PAYLOAD_START_POSITION-TOTAL_FILESIZE_POSITION : int = OFFSET_POSITION + 8-FILENAME_SIZE_POSITION : int = TOTAL_FILESIZE_POSITION + 8-FILENAME_POSITION : int = FILENAME_SIZE_POSITION + 4+FilePart(filename : String, totalSize : long, offset : long, partialContent : byte[])#FilePart(packet : byte[])#toPacket() : byte[]-setOffset(packet : byte[]) : void-setTotalSize(packet : byte[]) : void-getFilenameSize(packet : byte[]) : int-setFilename(packet : byte[]) : void-setPartialContent(packet : byte[]) : voidFilePart-responseSocket : Socket-requestSocket : Socket+ProtocolP2PPacketTCP(payload : Payload)#send(socket : Socket) : void+sendRequest(socket : Object) : void+ProtocolP2PPacketTCP(socket : Object)+sendResponse(response : ProtocolP2PPacket) : void+receiveResponse() : ProtocolP2PPacket-ProtocolP2PPacketTCP(packet : byte[])-constructPacket(packet : byte[]) : void-constructPacket(packet : byte[], responseSocket : Socket) : void#toPacket() : byte[]ProtocolP2PPacketTCP#requestResponseCode : RequestResponseCode#PAYLOAD_SIZE_POSITION : int = 4#PAYLOAD_START_POSITION : int = 8+Payload(requestResponseCode : RequestResponseCode)#Payload(packet : byte[])-checkRequestResponseCode() : void#toPacket() : byte[]#setPayloadSize(size : int, packet : byte[]) : void#getPayloadSize(packet : byte[]) : intPayload-CHECKSUM_POSITION : int = 2-responseSocketAddress : SocketAddress-responseSocket : DatagramSocket-requestSocket : DatagramSocket+ProtocolP2PPacketUDP(payload : Payload)#send(socket : DatagramSocket) : void#send(socket : DatagramSocket, addr : SocketAddress) : void+sendRequest(socket : Object) : void+ProtocolP2PPacketUDP(socket : Object)+sendResponse(response : ProtocolP2PPacket) : void+receiveResponse() : ProtocolP2PPacket-ProtocolP2PPacketUDP(packet : byte[])-constructPacket(packet : byte[]) : void-constructPacket(packet : byte[], responseSocket : DatagramSocket) : void#toPacket() : byte[]-computeCheckSum(packet : byte[]) : int-setCheckSum(packet : byte[]) : void-checkCheckSum(packet : byte[]) : voidProtocolP2PPacketUDPremoteException-serialVersionUID : long = 12LEmptyDirectory-serialVersionUID : long = 12LVersionRemoteError-serialVersionUID : long = 12LNotFound-serialVersionUID : long = 12LProtocolRemoteError-serialVersionUID : long = 12LEmptyFile-serialVersionUID : long = 12LInternalRemoteErrorserverP2P-fileList : String[]-baseDirectory : String-UDPPort : int-socket : DatagramSocket+ServerManagementUDP(baseDirectory : String, UDPPort : int)+run() : void-initFileList() : void-sendInternalError(pd : ProtocolP2PPacketUDP) : voidServerManagementUDP-port : int-directories : Directories+ServerP2P()+main(args : String[]) : voidServerP2P-fileList : String[]-baseDirectory : String-TCPPort : int-socket : ServerSocket+ServerManagementTCP(baseDirectory : String, TCPPort : int)+run() : void-initFileList() : void-sendInternalError(pd : ProtocolP2PPacketTCP) : voidServerManagementTCPtools-projectName : String-dataHomeDirectory : String-os : String+Directories(projectName : String)-setDataHomeDirectory() : void-openDataHomeDirectory() : void+askOpenDataHomeDirectory() : voidDirectories+write(array : byte[], start : int, value : int) : void+write16Bits(array : byte[], start : int, value : int) : void+write(array : byte[], start : int, value : long) : void+readInt(array : byte[], start : int) : int+readInt16Bits(array : byte[], start : int) : int+readLong(array : byte[], start : int) : longBytesArrayTools#payload1+codeType1#requestResponseCode1Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] Visual Paradigm Standard [evaluation copy] diff --git a/doc/VPProjects/uml.vpp b/doc/VPProjects/uml.vpp index c6c5a6b0647af5a0125781b69b8d8a51071ef500..d7b487c0d5b42aa2f1bd5a201df5f009321d2d71 100644 GIT binary patch delta 4823 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 delta 30863 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 diff --git a/doc/classdiagram.xml b/doc/classdiagram.xml deleted file mode 100644 index c7b5e59..0000000 --- a/doc/classdiagram.xml +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file