public String execute(String line) {
		String[] lineTokens = CommonUtil.split(line);
		StringBuilder result = new StringBuilder("");
		if (lineTokens.length > 0) {
			String commandName = lineTokens[0];

			// 1. Process the received command
			LOGGER.debug("Process the received command...");

			if (exitCommand.equals(commandName)) {
				return null;
			}

			if (helpCommand.equals(commandName)) {
				if (commands.isEmpty()) {
					return propertiesLoader.loadProperty(Constants.MAIN_NO_AVAILABLE_COMMANDS);
				}
				result.append(propertiesLoader.loadProperty(Constants.MAIN_AVAILABLE_COMMANDS));
				for (String availableCommand : commands.keySet()) {
					result.append("\n");
					result.append(Constants.DASH + availableCommand);
				}

				return result.toString();
			}

			Command command = commands.get(commandName);
			if (command == null) {
				LOGGER.error("Unkhwon command [ " + commandName + " ]");
				result.append(propertiesLoader.loadProperty(Constants.MAIN_INVALID_COMMAND));
			} else {

				// 2. Executing command
				LOGGER.debug("Executing command [ " + commandName + " ]");
				try {
					result.append(command.process((String[]) ArrayUtils.removeElement(lineTokens, commandName)));
				} catch (IllegalParameterException e) {
					LOGGER.error("Invalid syntax : " + e.getLocalizedMessage(), e);
					result.append(propertiesLoader.loadProperty(Constants.MAIN_INVALID_SYNTAX) + "\n"
							+ command.getHelp());
				} catch (ResourceAccessException e) {
					LOGGER.error("Error occurred when trying to access file : " + e.getLocalizedMessage(), e);
					result.append(propertiesLoader.loadProperty(Constants.MAIN_ERROR_ACCESS) + "\n" + command.getHelp());
				}

			}
		}
		return result.toString();
	}