public void run()
    {
        theLogger.info("Entering the Client Worker Thread :: "+threadId);
        try {
            registerCommands();
        } catch (ServiceException ex) {
            theLogger.log(Level.SEVERE, "Unable to register the commmands: impossible to proceed",
                    ex);
            try {
                sessionSocket.close();
            } catch (IOException ex1) {
                theLogger.log(Level.SEVERE, "Error Caught in closing the client socket",
                        ex1);
            }
            return;
        }
        try {
            // initializing the streams
            cmdReader = new BufferedReader(
                    new InputStreamReader(sessionSocket.getInputStream()));
            responseWriter = new PrintWriter(sessionSocket.getOutputStream(), true);
            // show welcome display
            responseWriter.print(display.welcomeDisplay());
            responseWriter.flush();
            // server while: it waits command forwarded by the client
            theLogger.info("Thread correctly initialized :: READY to accept commands...");
            String clientQuery = "";
            String clientResponse = "";
            boolean parsingOutcome;
            while(sessionOpen) {
                clientQuery = cmdReader.readLine();
                theLogger.info("Treating the command query :: " +clientQuery);
                // normal management flow
                parsingOutcome = parser.isValidQuery(clientQuery);
                if(!parsingOutcome) {
                    responseWriter.print(display.errorDisplay(clientQuery));
                    responseWriter.flush();
                    continue;
                }
                // command validated
                ClientCommand cmd = parser.buildCommand(clientQuery);
                if(cmd == null) {
                    responseWriter.print(display.errorDisplay(clientQuery));
                    responseWriter.flush();
                    continue;
                }
                // command correctly built
                clientResponse = interpreter.interpretCommand(cmd);
                if(clientResponse.contains("${RELEASE}")) {
                    clientResponse = clientResponse.replace("${RELEASE}", "");
                    sessionOpen = false;
                    theLogger.info("Session released as requested by the client");
                }
                responseWriter.print(display.decoratedDisplay(clientResponse));
                responseWriter.flush();
            }
        } catch (IOException ex) {
             theLogger.log(Level.SEVERE, "Error Caught: I/O exception, unable to proceed",
                        ex);
        } catch (ServiceException ex) {
            theLogger.log(Level.SEVERE, "Error Caught: Interpreter Unable to interpret the Query",
                        ex);
        }finally {
            try {
                sessionSocket.close();
                responseWriter.close();
            } catch (IOException ex) {
                 theLogger.log(Level.SEVERE, "Error Caught in closing the client socket",
                        ex);
                }
        }
    }