package com.juick.command; import com.juick.User; import com.juick.server.protocol.ProtocolListener; import lombok.Getter; import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.annotation.PostConstruct; /** * @author ma1uta */ @Component @Getter public class Processor { private static final Logger LOGGER = LoggerFactory.getLogger(Processor.class); private final Set commands; @Setter private ProtocolListener protocolListener; private String help; @Autowired public Processor(Set commands) { this.commands = commands; } @PostConstruct public void init() { this.help = "HELP - returns this help message.\n" + getCommands().stream().map(Command::help).sorted().collect(Collectors.joining("\n")); } public String execute(User sender, String command) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Execute command: {}", command); } command = command != null ? command.trim() : ""; if ("help".equalsIgnoreCase(command)) { LOGGER.debug("Show help"); return getHelp(); } Command defaultCommand = null; for (Command commandItem : getCommands()) { Pattern pattern = commandItem.pattern(); if (pattern != null && pattern.matcher(command).matches()) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Found command processor: {}", commandItem.getClass().getName()); } return commandItem.execute(sender, getProtocolListener(), command); } else { defaultCommand = commandItem; } } if (defaultCommand != null) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Found default command processor: {}", defaultCommand.getClass().getName()); } return defaultCommand.execute(sender, getProtocolListener(), command); } LOGGER.debug("Command processor not found, return help"); return getHelp(); } }